Điều cơ bản của trạng thái tràn số liên quan đến thực tế rằng giới hạn của các
số có thể hiển thị trong giới hạn của Computer.
Như đã giải thích ở các phần trước, giới hạn của một số nguyên có dấu có thể
biểu diễn được bằng Word 16 bits là -32768 32767. Với số nguyên không dấu là 0
65535. Nếu kết quả tính toán vượt quá giới hạn trên, trạng thái tràn sẽ xảy ra và kết
quả sẽ bị cắt bớt để có thể biểu diễn được trong thanh ghi, do đó kết quả sẽ là sai. Để
có thể hiểu rõ hơn, ta có thể tham khảo ví dụ sau:
Số có dấu hoặc không dấu là tùy thao quy định. Khi ta thực hiện một phép
tính số học, có thể là phép cộng (+), có thể có 4 trường hợp xảy ra.
+ Không tràn số.
+ Tràn số vì dấu (+/ư).
+ Tràn số không dấu.
+ Tràn số cả trường hợp có dấu và không dấu.
Ví dụ sau là ví dụ tràn số không dấu. Giả định thanh ghi AX chứa giá trị
FFFFh, Thanh ghi BX chứa giá trị 0001h, Sử dụng lệnh ADD để cộng 2 giá
trị trên.
50 trang |
Chia sẻ: maiphuongdc | Lượt xem: 1815 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Tài liệu Kiến trúc máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
c dạng chữ số decimal có
thể kết thúc bằng ký tự D hoặc d.
+ Các chữ số d•ới dạng Hex phải đ•ợc bắt đầu bằng một chữ số thập
phân (Decimal) và kết thúc bằng ký tự H hoặc h, Ví dụ "0ABCDh" Chữ số 0
đầu tiên, ký tự H sau cùng.
+ các ví dụ sau biểu diễn các các khai báo số hợp lệ trong ch•ơng trình:
Chữ số Loại dữ liệu
10101 Decimal
10101b Binary
3256 Decimal
-2453 Decimal
1,432 Không hợp lệ vì có chứa ký tự không phải là ký tự số
1B2Dh Hex
2B6C Không hợp lệ vì không kết thúc bằng ký tự H
FEEEH Không hợp lệ vì không bắt đầu bằng ký tự số
0FFFFH Hex
- Dữ liệu ký tự:
Các ký tự và chuỗi ký tự phải đ•ợc biểu diễn nằm trong cặp dấu nháy
đơn '..' Hoặc nháy kép "..", ví dụ "A" hoặc 'hello'. Các ký tự đ•ợc biên dịch
sang hệ thống mã ASCII bởi ch•ơng trình dịch, vì vậy không có gì la khác
nhau giữa cách biểu diễn "A" và 41H (Mã ASCII của A)
- Các biểu diễn dữ liệu quy •ớc:
Quy •ớc Đại diện cho
DB Define Byte
DW Define Word
DD Define Doubleword (Dãy 2 Words)
DQ Define Quadword (Dãy 4 Words)
DT Define Ten Byte (Dãy 10 Bytes)
3- Biến:
Các biến trong ngôn ngữ bậc thấp đóng vai trò nh• các biến trong các ngôn
ngữ lập trình bậc cao. Mỗi biến dều có kiểu dữ liệu riêng và đ•ợc gán một vị trí bộ
nhớ nào đó bởi ch•ơng trình. Các loại biến nh• sau:
- Biến Byte (Byte Variables):
Khai báo biến theo định dạng nh• sau:
Name DB Initial value
Tên biến Kiểu biến Giá trị khởi tạo
Ví dụ khai báo:
This document is created with the unregistered version of Document2PDF Pilot.
Alpha DB 4
Ch•ơng trình sẽ tổ chức 1 byte bộ nhớ đặt tên là Alpha, khởi tạo dữ liệu
trong bộ nhớ là 4. Nếu không cần khởi tạo dữ liệu tr•ớc, ta chỉ cần thay đổi
một chút trong khai báo nh• sau:
Alpha DB ?
Dấu "?" để thay thế cho dữ liệu cần khởi tạo.
Giới hạn khai báo của biền loại này theo giá trị Decimal:
-128 137 nếu sử dụng các số có dấu.
0 255 nếu sử dụng số không dấu.
- Biến Word (Word Variables):
Khai báo biến theo định dạng nh• sau:
Name DW Initial value
Tên biến Kiểu biến Giá trị khởi tạo
Ví dụ khai báo:
Alpha DB -4
Ch•ơng trình sẽ tổ chức 2 bytes bộ nhớ để sử dụng cho loại biến này.
Giới hạn sử dụng theo giá trị Decimal:
- 32768 32767 nếu sử dụng các số có dấu.
0 65535 nếu sử dụng các số không dấu.
- Biến mảng (Array Variables):
Trong ngôn ngữ Assembly, một mảng là một dãy các bytes hoặc words
bộ nhớ. Ví dụ nh• ta định nghĩa một mảng gồm 3 Bytes với các giá trị khởi
tạo lần l•ợt là 10h, 20h, 30h:
B_Array DB 10h,20h,30h
B_Array là Byte đầu tiên, B_Array +1 là Byte thứ 2 và B_Array + 2 là
Byte thứ ba. Nếu ch•ơng trình tổ chức địa chỉ 200h cho biến, bộ nhớ sẽ đ•ợc
phân bố nh• sau:
Địa chỉ Nội dung bộ nhớ
B_Array 200h 10h
B_Array + 1 201h 20h
B_Array + 2 202h 30h
T•ơng tự nh• trên, một mảng kiểu Word đ•ợc phân bố nh• sau:
W_Array DW 1000,40,29870,323
Địa chỉ Nội dung bộ nhớ
W_Array 0300h 1000d
W_Array + 1 0302h 40d
W_Array + 2 0304h 29870d
W_Array + 3 0306h 323d
- Byte thấp và Byte cao của Word.
Đôi khi ta chỉ cần sử dụng Byte cao hoặc byte thấp trong một biến dạng
Word. Ví dụ ta khai báo nh• sau:
Word01 DW 1234h
Byte thấp chứa giá trị 34h, Byte cao chứa giá trị 12h.
- Chuỗi ký tự (Character Strings):
Một mảng các mã ASCII có thể đ•ợc khởi tạo với một chuỗi các ký tự.
Ví dụ nh• sau:
Letters DB 'ABC'
Cũng có thể đ•ợc khai báo nh• sau:
Letters DB 41h,42h,43h
This document is created with the unregistered version of Document2PDF Pilot.
Trong một chuỗi, ch•ơng trình dịch phân biệt giữa các ký tự chữ hoa và
chữ th•ờng. Do đó 'ABC' (41h,42h,43h) sẽ khác với 'abc' (61h,62h,63h). ta có
thể khai báo kết hợp cả ký tự chữ cái và ký tự số chung một biến:
Mess DB 'Hello',0Ah,0Dh,'$'
T•ơng đ•ơng:
Mess DB 48h,45h,4Ch,4Ch,4Fh,0Ah,0Dh24h
- Hằng số đ•ợc định nghĩa (named Constants):
Nhằm mục đích để mã ch•ơng trình dễ hiểu hơn, ta th•ờng khai báo
một số hằng số cố định. Để khai báo hằng số, ta sử dụng từ khoá EQU, Cú
pháp nh• sau:
Name EQU Constant
Tên t•ơng đ•ơng Hằng số
Ví dụ:
LF EQU 0Ah
Giải thích:
Ta dùng tên LF cho giá trị 0Ah, Mã ASCII của 0Ah là Line
Feed (Xuống dòng). Tên LF có thể dùng để thay thế cho 0Ah bất cứ chỗ nào
trong ch•ơng trình. Hai câu lệnh sau là t•ơng đ•ơng:
Mov DL,0Ah ;và
Mov DL,LF
4- Một số lệnh cơ bản
Có hàng trăm lệnh trong bộ lệnh của CPU, chúng cũng đ•ợc thiết kế thêm cho
các loại CPU về sau này. Trong phần này, chúng ta chỉ quan tâm đến một số lệnh
thông dụng nhất đ•ợc sử dụng để di chuyển dữ liệu và một số tính toán số học.
Các mô tả d•ới đây sử dụng các từ Word01, Word02 nh• biến kiểu Word,
Byte01, Byte02 nh• biến kiểu Byte.
- Lệnh MOV và lệnh XCHG
+ Lệnh MOV đ•ợc sử dụng để di chuyển dữ liệu giữa các thanh ghi,
giữa thanh ghi và vị trí nào đó của bộ nhớ hoặc di chuyển trực tiếp một số vào
thanh ghi hoặc bộ nhớ.
Cú pháp lệnh:
MOV Destination, Source
Di chuyển Đích đến , Nguồn
Ví dụ:
Mov AX,Word01
Giá trị có trong thanh ghi AX sẽ đ•ợc thay thế bởi giá trị đ•ợc l•u
trong vị trí bộ nhớ Word01. Giá trị trong Word01 không bị thay đổi.
Mov AX,BX
AX nhận giá trị từ BX, Giá trị của BX không thay đổi.
Mov AX, 'A'.
Giá trị mã ASCII 041h sẽ đ•ợc di chuyển vào thanh ghi AX. Cụ
thể là vào Byte cao của AX (AH).
+ Lệnh XCHG: Đ•ợc sử dụng để tráo đổi giá trị giữa 2 thanh ghi, giữa
thanh ghi và bộ nhớ.
Cú pháp lệnh:
XCHG Destination, Source
Tráo đổi Đích đến , Nguồn
Ví dụ:
XCHG AX,BX
This document is created with the unregistered version of Document2PDF Pilot.
Đổi vị trí các giá trị của AX và BX lẫn nhau, AX sẽ l•u trữ
giá trị của BX và ng•ợc lại.
XCHG AX,Word01
Tráo đổi giá trị của AX và giá trị tại vị trí bộ nhớ Word01.
+ Điều cấm trong khi sử dụng 2 lệnh trên:
Vì các lý do về kỹ thuật, có một số các quy định mà ng•ời lập
trình phải tuân theo. Ví dụ minh hoạ:
Mov Word01,Word02 ; Không hợp lệ
Phát biểu lệnh trên là không hợp lệ, không đ•ợc phép di chuyển
dữ liệu trực tiếp từ vị trí bộ nhớ này sang vị trí bộ nhớ khác. Để có thể
làm đ•ợc việc trên ta phải thay đổi câu lệnh nh• sau:
Mov AX,Word02
Mov Word02,AX
Các kết hợp hợp lệ giữa các toán hạng trong 2 lệnh trên:
Destination Operand
Source Operand General Register Segment Register Memory Location Constant
General Reg Yes Yes Yes No
Segment Reg Yes No Yes No
Mem Location Yes Yes No No
Constant Yes No Yes No
Destination Operand
Source Operand General Register Memory Location
General Register Yes Yes
Memory Location Yes No
- Lệnh ADD, SUB, INC và DEC
+ Lệnh ADD và lệnh SUB đ•ợc sử dụng để thực hiện các phép tính
cộng, trừ giá trị giữa 2 thanh ghi, Giữa thanh ghi và bộ nhớ hoặc để cộng (trừ)
một số vào (ra) một thanh ghi hoặc bộ nhớ.
Cú pháp lệnh:
ADD Destination, Source
SUB Destination, Source
Ví dụ:
ADD Word01,AX
Cộng giá trị có trong AX vào Word01. Kết quả l•u trong Word01.
SUB AX,DX
Giá trị của thanh ghi DX sẽ bị trừ đi giá trị của thanh ghi AX, Kết
quả đ•ợc l•u trong thanh ghi AX, Giá trị của thanh ghi DX đ•ợc giữ
nguyên.
ADD BL,5
Cộng 5 vào giá trị đã có sẵn trong thanh ghi BL.
+ Quy tắc hợp lệ:
Destination Operand
Source Operand General Register Memory Location
General Register Yes Yes
Memory Location Yes No
This document is created with the unregistered version of Document2PDF Pilot.
Constant Yes Yes
Cộng hoặc trừ trực tiếp giữa 2 vị trí của bộ nhớ là không hợp lệ.
Ví dụ:
ADD Byte01,Byte02 ;Không hợp lệ
Giải pháp
Mov AL,Byte02
Add Byte01,AL
+ Lệnh INC và lệnh DEC đ•ợc sử dụng để cộng thêm 1 hoặc bớt đi 1 từ
thanh ghi hoặc tại một vị trí ô nhớ nào đó.
Cú pháp lệnh:
INC Destination
DEC Destination
Ví dụ:
Inc Word01
Cộng thêm một vào Word01.
Dec Byte01
Trừ Byte01 đi 1.
- Lệnh NEG:
Lệnh NEG đ•ợc sử dụng để thay đổi dấu của giá trị.
Cú pháp lệnh:
NEG Destination
Ví dụ:
Neg BX
Chuyển đổi giá trị của BX thành số âm.
- Tính t•ơng thích giữa các toán hạng.
Các toán hang trong một câu lệnh 2 toán hạng phải cùng một kiểu, cả
hai đều phải là kiểu Byte hoặc kiểu Word
Ví dụ:
Mov AX,Byte01
không hợp lệ.
Tuy nhiên ch•ơng trình có thể chấp nhận kiểu sau:
Mov AL, 'A' ;hoặc
Mov AX, 'A'
5- Mô tả lệnh với ngôn ngữ
Phát biểu Dịch lệnh Mô tả
B = A Mov AX,A Di chuyển A vào thanh ghi AX
Mov AX,5 Di chuyển 5 vào thanh ghi AX
Sub AX,A AX chứa giá trị 5 - A
Mov A,AX Di chuyển giá trị trên vào A
Neg A A = -A
Add A,5 A = 5 - A
Mov AX,B AX nhận giá trị B
Sub AX,A AX nhận giá trị B - A
Sub AX,A AX nhận giá trị B - 2*A
Mov A,AX Di chuyển kết quả vào A
6- Cấu trúc ch•ơng trình.
This document is created with the unregistered version of Document2PDF Pilot.
Chúng ta biết rằng, một ch•ơng trình ngôn ngữ máy tính bao gồm Mã ch•ơng
trình, dữ liệu và ngăn xếp. Mỗi một thành phần đều chiếm một phần trong một đoạn nào
đó cua bộ nhớ máy tính. Ch•ơng trình của ngôn ngữ assembly cũng đ•ợc tổ chức t•ơng
tự. Mã ch•ơng trình, dữ liệu và ngăn xếp ch•ơng trình có cấu trúc nh• một đoạn ch•ơng
trình. Mỗi một thành phần đều đ•ợc biên dịch và nạp vào từng đoạn của bộ nhớ.
- Tổ chức mô hình bộ nhớ:
Kích th•ớc của mã ch•ơng trình và dữ liệu ch•ơng trình có thể đ•ợc xác
định quan mô hình tổ chức bộ nhớ thông qua việc sử dụng từ khoá
".MODEL".
Cú pháp:
.Model Memory_model
Các cách tổ chức mô hình bộ nhớ th•ờng dùng là:
Small, Medium,Compact và Large theo nh• mô tả trong bảng sau:
Model Mô tả
Small Mã ch•ơng trình (Code) nằm trong một đoạn (Segment), Dữ liệu (Data) nằm trong
một đoạn khác
Medium Mã ch•ơng trình (Code) nằm trong nhiều đoạn, Dữ liệu (Data) nằm trong một đoạn
khác.
Compact Mã ch•ơng trình (Code) nằm trong một đoạn (Segment), Dữ liệu (Data) nằm trong
nhiều đoạn khác.
Large Mã ch•ơng trình (Code) nằm trong nhiều đoạn (Segment), Dữ liệu (Data) nằm
trong nhiều đoạn khác. Nh•ng không có mảng nào lớn hơn 64 KB.
Huge Mã ch•ơng trình (Code) nằm trong nhiều đoạn (Segment), Dữ liệu (Data) nằm
trong nhiều đoạn khác. Nh•ng có mảng có thể lớn hơn 64 KB.
- Đoạn dữ liệu (Data Segment):
Đoạn dữ liệu của ch•ơng trình chứa tất cả các khai báo biến ch•ơng
trình. Để khai báo đoạn dữ liệu trong ch•ơng trình, ta dung từ khoá ".DATA".
Ví dụ minh hoạ:
.DATA
Word01 DW 2
Word02 DW 5
MSG DB 'The First Message'
Mask EQU 10010010b
- Đoạn ngăn xếp (Stack Segment)
Mục đích của việc khai báo Stack Segment trong ch•ơng trình là để tổ
chức một khối bộ nhớ. Cú pháp khai báo nh• sau:
.STACK Size
Size là kích th•ớc của Stack tính theo Byte.
Ví dụ:
.STACK 100h
Giới hạn 100h byte cho vùng stack.
- Đoạn mã (Code Segment).
Đoạn này chứa các lệnh của ch•ơng trình (Program Instructions).
Cú pháp khai báo:
.CODE Name
Chú ý: Không cần phải khai báo tên trong Model Small.
Trong đoạn này, các lệnh có thể đ•ợc tổ chức thành các đoạn nhỏ gọi là
Procedure. Cách định nghĩa Procedure nh• sau
This document is created with the unregistered version of Document2PDF Pilot.
Name PROC ; Bắt đầu Procedure
; Mã ch•ơng trình
Name ENDP ; Kết thúc Procedure
Ví dụ về khai báo định nghĩa Code Segment
.CODE
MAIN PROC ; Bắt đầu Procedure
; Lệnh chính của Procedure
MAIN ENDP ; Kết thúc Procedure
; Procedure khác
7- Ghép nối ch•ơng trình
Ví dụ sau mô tả cách tổ chức một ch•ơng trình:
.Model Small
.Stack 100h
.Data
; Khai báo dữ liệu
.Code
Main Proc
; Các câu lệnh
Main Endp
; Các procedure khác
End Main
Dòng cuối cùng của ch•ơng trình phải có từ khoá END theo sau tên của
Procedure.
8- Viết ch•ơng trình và chạy ch•ơng trình.
- Các câu lệnh vào ra.
Ta đã biết, CPU muốn liên lạc đ•ợc với các thiết bị ngoại vi thông qua
các thanh ghi vào ra đ•ợc gọi là các cổng vào ra. Có hai lệnh IN và OUT cho
phép ta truy xuất trực tiếp các cổng. Các câu lệnh này đ•ợc sử dụng cần thiết
khi cần truy xuất các cổng một cách nhanh chóng nh• các ch•ơng trình
Game. Tuy nhiên, hầu hết các ch•ơng trình ứng dụng không sử dụng các lệnh
vào ra bởi vì các cổng vào ra khac biệt nhau giữa các hệ thống máy tính, tốt
nhất là sử dụng các ch•ơng trình con của nhà sản xuất.
Có 2 kiểu trình phục vụ các công tác vào ra, đó là BIOS và DOS.
Ch•ơng trình BIOS đ•ợc chứa trong BIOS ROM và có thể liên lạc trực tiếp với
các cổng vào ra. Các tiểu trình DOS có thể thực hiện đ•ợc rất nhiều các công
việc phức tạp ví dụ nh• in chuỗi ký tự, mặc dù các công việc đều thông qua
các tiểu trình của BIOS.
- Lệnh INT
Lệnh INT (interrupt) đ•ợc sử dụng để giải quyết các công việc liên quan
đến các tiểu trình DOS và BIOS
Cú pháp:
INT Interrupt_Number
Interrupt_Numberlà số hiệu để xác định ngắt. Ví dụ Int 16h liên quan
đến tiểu trình điều khiển bàn phím.
+ Int 21h: Đ•ợc sử dụng cho rất nhiều chức năng của DOS. Một chức
năng đặc biệt là thay đổi các số hiệu chức năng của thanh ghi AH. Các
chức năng nh• sau:
This document is created with the unregistered version of Document2PDF Pilot.
Số hiệu chức năng Tiểu trình
1 Nhập 1 phím
2 Xuất một ký tự đơn
3 Xuất chuỗi ký tự
Chức năng Int21h nhập một giá trị vào một thanh ghi nào đó và trả kết
quả ra thanh ghi khác. D•ới đây là mô tả các chức năng:
Chức năng 01
Nhập một phím
Input AH = 1
Output AL = mã ASCII nếu một phím đ•ợc nhấn
= 0 Nếu không có phím đ•ợc nhấn.
Để giải quyết vấn đề, viết các lệnh nh• sau:
Mov AH,1 ; Nhập chức năng phím
Int 21h ; Nhập mã ASCII vào AL
Bộ xử lý sẽ chờ cho đến khi ng•ời dùng nhấn một phím. Nếu một
phím đ•ợc nhấn, thanh ghi AL sẽ nhận đ•ợc mã ASCII của phím đó.
Ký tự đó sẽ hiện lên màn hình. Nếu có bất kỳ một phím nào khác đ•ợc
nhấn, ví dụ nh• các phím mũi tên, Fx hoặc t•ơng tự, thanh ghi AL sẽ
nhận giá trị 0. Các lệnh tiếp theo int21h sẽ đ•ợc thực hiện tiếp.
Chức năng 1 của int 21h không có dấu hiệu để ng•ời dùng có thể
nhập dữ liệu, vậy ta có thể sử dụng Chức năng 2 nh• sau:
Input AH =2
DH = mã ASCII hiện ký tự hoặc ký tự điều khiển
Output AL = mã ASCII hiện ký tự hoặc ký tự điều khiển
Ví dụ:
Mov AH,2
Mov DL, "?"
Int 21h
Hiện dấu ? lên màn hình và hiện dấu nhắc lệnh để chờ ng•ời dùng nhập
phím khác.
Chức năng 2 còn có thể đ•ợc sử dụng cho các chức năng điều khiển.
Nếu thanhghi DL nhận mã ASCII của các ký tự điều khiển, Int 21h sẽ
hiển thị ký tự điều khiển đó. Một số các ký tự điều khiển tiêu biểu nh•
sau:
Mã ASCII (Hex) Ký hiệu Chức năng
7 Bel Phát tiếng beep từ loa PC.
8 BS Phím lùi.
9 HT Phím Tab.
A LF Xuống hàng.
D CR Đầu dòng mới.
Trong khi xử lý, thanh ghi AL sẽ l•u giữ mã ASCII của ký tự điều khiển.
- Ch•ơng trình đầu tiên:
Một ch•ơng trình hoàn chỉnh với các chú thích để giải thích từng
câu lệnh, chú ý rằng các lời giải thích trong ch•ơng trình thật sẽ không
sử dụng đ•ợc tiếng Việt.
Tên ch•ơng trình Prg01.asm
This document is created with the unregistered version of Document2PDF Pilot.
Title Prg01: Echo Program
.Model Small
.Stack 100h
.Code
Main Proc
;Hiển thị dấu nhắc lệnh
Mov AH,2 ;Chức năng hiển thị ký tự
Mov DL,'?' ;Ký tự là dấu '?'
Int 21h ;Gọi dịch vụ 21h hiển thị ký tự
;Nhập ký tự
Mov AH,1 ;Chức năng đọc ký tự
Int 21h ;Gọi dịch vụ 21h để nhập ký tự vào AL
Mov BL,AL ;Ghi ký tự vào BL
;Xuống hàng mới
Mov AH,2 ;Chức năng hiển thị ký tự
Mov DL,0DH ;Con trỏ trở về đầu dòng
Int 21h ;Xử lý việc đ•a con trỏ về đầu dòng
Mov DL,0AH ;Xuống dòng mới
Int 21h ;Xử lý xuống dòng mới
;Hiển thị ký tự
Mov DL,BL ;Lấy ký tự l•u trong BL
Int 21h ;Hiển thị ký tự trong thanh ghi DL
;Quay trở lại nền DOS
Mov AH,4CH ;Gọi hàm thoát về DOS
Int 21h ;Thoát về DOS
Main Endp ;Kết thúc Procedure
End Main ;Kết thúc ch•ơng trình
- Tạo ch•ơng trình và chạy ch•ơng trình:
Có 4 b•ớc để tạo và chạy ch•ơng trình
a- Sử dụng một ch•ơng trình soạn thảo text để tạo ch•ơng trình nguồn.
b- Sử dụng ch•ơng trình dịch để tạo ra 1 file mã máy (Object File).
c- Sử dụng ch•ơng trình Link để liên kết các ch•ơng trình liên kết tạo ra
file chạy (Run File).
d- Chạy ch•ơng trình.
B•ớc 01: Tạo ch•ơng trình nguồn.
Sử dụng ch•ơng trình soạn thảo text để tạo một file có tên Prg01 có
nội dung nh• trên. File có đuôi là *.asm.
B•ớc 02: Dịch ch•ơng trình
Sử dụng ch•ơng trình Masm để dịch ch•ơng trình nguồn thành
một file đối t•ợng có tên là PRG01.OBJ. Câu lệnh có thể là nh• sau:
C:\>Masm PRG01;
Ch•ơng trình sẽ kiểm tra lỗi của ch•ơng trình nguồn. Nếu có lỗi,
ch•ơng trình sẽ báo lỗi cho ng•ời dùng biết. Ch•ơng trình sẽ dịch file
PRG01.ASM thành file đối t•ợng có tên là PRG01.OBJ. Nên có dấu ;
đằng sau câu lệnh.. Thông th•ờng, tên của file mới sẽ lấy mặc định là
tên file cũ với đuôi là OBJ.
File danh sách nguồn:
File sanh sách nguồn (*.LST) là một file text hiển thị các dòng
This document is created with the unregistered version of Document2PDF Pilot.
lệnh và các lệnh mã máy t•ơng đ•ơng và một số thông tin khác về
ch•ơng trình. File này rất hữu dụng cho công việc gỡ rối ch•ơng trình.
File tham khảo chéo (Cross-Reference File):
File có phần mở rộng (*.CRF) liệt kê tên hiển thị trong ch•ơng
trình, hữu dụng khi xác định các biến (Variable), các nhãn (Label) trong
một ch•ơng trình lớn.
B•ớc 03: Liên kết ch•ơng trình:
File OBJ là file chứa mã máy nh•ng không thể xử lý đ•ợc bởi vì
nó không phải là định dạng của file chạy.
Ch•ơng trình Link sẽ liên kết các file Obj thành file có thể xử lý
đ•ợc (.exe file). File dạng này có thể đ•ợc nạp vào bộ nhớ và có thể
chạy.
Cách liên kết ch•ơng trình
C:\>Link PRG01
B•ớc 04: Chạy ch•ơng trình.
Khi liên kết xong, ta sẽ có file PRG01.EXE. Ta có thể chạy file này
trực tiếp từ dấu nhắc lệnh của DOS.
- Một ch•ơng trình khác.
Ch•ơng trình này đ•ợc viết với mục đích hiển thị một chuỗi ký tự.
Để thực hiện ch•ơng trình này ta cần biết thêm một số vấn đề khác.
+ Hàm 9 của ngắt 21h Hiển thị chuỗi ký tự.
Input DX=Địa chỉ độ dời của chuỗi.
Chuỗi phải đ•ợc kết thúc bằng ký tự '$'
+ Một chuỗi có thể khởi tạo trong bộ nhớ nh• sau:
MSG DB 'Hello!$'
+ Lệnh LEA (Load Affective Address).
Cú pháp:
Lea Destination,Source
Lệnh này copy địa chỉ độ dời (Offset) vào thanh ghi công dụng
chung.
Ví dụ:
Lea DX,MSG
Nạp địa chỉ độ dời của biến MSG vào thanh ghi DX
Tuy nhiên để DOS có thể giải quyết đ•ợc các vấn đề khi ta chạy và
dịch ch•ơng trình, ch•ơng trình cần phải thêm 2 câu lệnh sau:
Mov AX,@Data
Mov DS,AX.
@Data là tên của đoạn dữ liệu đ•ợc định nghĩa bởi th• viện .DTA.
Ch•ơng trình dịch sẽ dịch tên @Data thành số hiệu đoạn (Segment). 2
lệnh trên rất cần thiết bởi vì số hiệu của Segment có thể không di chuyển
trực tiếp đến thanh ghi Segment.
Khi thanh ghi DS đ•ợc khởi tạo, ta có thể in dòng chữ "Hello!"
bằng cách đặt địa chỉ vào thanh ghi DX và gọi ngắt 21h của DOS.
Lea DX,MSG ;Lấy thông tin
Mov AH,9 ;Hàm hiện chuỗi ký tự
Int 21h ; Gọi ngắt 21h của DOS để thực
hiện.
Toàn bộ ch•ơng trình nh• sau:
Ch•ơng trình PRG02.Asm
This document is created with the unregistered version of Document2PDF Pilot.
Title PRG02 Print String Program
.Model Small
.Stack 100h
.Data
MSG DB 'Hello!$' ;Khai báo biến MSG
.Code
Main Proc
; Khởi tạo thanh ghi DS
Mov AX,@Data
Mov DS,AX ; Khởi tạo thanh ghi DS
;Hiện thông điệp
Lea DX,MSG ;Nạp thông điệp
Mov AH,9 ;Chức năng hiện chuỗi ký
tự
Int 21h ;Gọi ngắt DOS 21h
;Trở về DOS
Mov AH,4CH
Int 21h
Main Endp
End Main
Ch•ơng trình thêm: Đổi ký tự th•ờng thành ký tự in hoa.
III- Kết luận.
Chúng tôi đã giới thiệu cho các bạn một số cách sử dụng lệnh đúng cú pháp và đúng
quy tắc cũng nh• cách thức để các bạn có thể tạo đ•ợc một ch•ơng trìnhcó thể chạy độc
lập trên nền hệ điều hành. Khi viết một ch•ơng trình đầy đủ, các bạn cần chú ý một số vấn
đề nh• sau.
Một số khai báo cơ bản:
Khai báo bộ nhớ qua từ khoá Model
.Small
.Medium
.Compact
.Large
.Huge
Các kiểu dữ liệu cơ bản
DB, DW, DD, DQ, DT
Các câu lệnh cơ bản:
MOV, XCHG, ADD, SUB, INC, DEC, NEG, INT, LEA.
Cách sử dụng Ngắt 21h (Int 21h) của DOS.
Function 1: Đọc ký tự từ bàn phím
Function 2:Hiện ký tự
Function 9: Hiện chuỗi ký tự
Các b•ớc để tạo một ch•ơng trình chạy độc lập có đuôi là *.EXE
Sử dụng ch•ơng trình MASM để tạo ch•ơng trình chạy.
a- Sử dụng một ch•ơng trình soạn thảo text để tạo ch•ơng trình nguồn.
b- Sử dụng ch•ơng trình dịch để tạo ra 1 file mã máy (Object File).
This document is created with the unregistered version of Document2PDF Pilot.
c- Sử dụng ch•ơng trình Link để liên kết các ch•ơng trình liên kết tạo ra
file chạy (Run File).
d- Chạy ch•ơng trình. Gõ tên File tại dấu nhắc DOS.
Một số ch•ơng trình mẫu: PRG01.ASM, PRG02.ASM.
This document is created with the unregistered version of Document2PDF Pilot.
Chýừng 4: Trạng thái bộ xử lý và các loại cờ.
I- Giới thiệu các cờ:
Một đặc điểm đặc biệt phân biệt giữa computer và các laọi máy móc khác là khả năng
quyết định công việc. Các mạch điện trong CPU có thể thực hiện đ•ợc các quyết định đơn
giản dựa vào trạng thái hiện tại của bộ xử lý. Các trạng thái đ•ợc biểu hiện bởi các cờ trong
thanh ghi cờ của CPU.
Hình minh hoạ sau cho ta thấy cấu trúc của thanh ghi cờ (Flag Register):
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Tại các Bit 0, 2, 4, 7, 11 là các cờ trạng thái.
Tại các Bit 8,9,10 là các cờ điều khiển.
Các bảng sau sẽ mô tả các loại cờ và các đặc điểm của chúng:
Các cờ trạng thái:
Bit Tên cờ Ký hiệu Mô tả
0 Carry Flag CF Mô tả trạng thái dữ liệu đ•ợc nhớ để dành thêm vào bit
sau
2 Parity Flag PF Cờ trạng thái để kiểm tra chẵn lẻ các bits
4 Auxilary Carry Flag AF Đ•ợc sử dụng để mô tả trạng thái nhớ và trạng thái m•ợn
6 Zero Flag ZF Mô tả trạng thái dấu của chữ số +/-
11 Overflow Flag OF Mô tả trạng thái giới hạn của số.
Các cờ điều khiển:
Bit Tên cờ Ký hiệu Mô tả
8 Trap Flag TF Cờ bẫy
9 Interrupt Flag IF Cờ điều khiển ngắt
10 Direction Flag DF Cờ dẫn h•ớng
II- Mô tả trạng thái của bộ xử lý.
1- Trạng thái tràn (Overflow)
Điều cơ bản của trạng thái tràn số liên quan đến thực tế rằng giới hạn của các
số có thể hiển thị trong giới hạn của Computer.
Nh• đã giải thích ở các phần tr•ớc, giới hạn của một số nguyên có dấu có thể
biểu diễn đ•ợc bằng Word 16 bits là -32768 32767. Với số nguyên không dấu là 0
65535. Nếu kết quả tính toán v•ợt quá giới hạn trên, trạng thái tràn sẽ xảy ra và kết
quả sẽ bị cắt bớt để có thể biểu diễn đ•ợc trong thanh ghi, do đó kết quả sẽ là sai. Để
có thể hiểu rõ hơn, ta có thể tham khảo ví dụ sau:
Số có dấu hoặc không dấu là tùy thao quy định. Khi ta thực hiện một phép
tính số học, có thể là phép cộng (+), có thể có 4 tr•ờng hợp xảy ra.
+ Không tràn số.
+ Tràn số vì dấu (+/-).
+ Tràn số không dấu.
+ Tràn số cả tr•ờng hợp có dấu và không dấu.
Ví dụ sau là ví dụ tràn số không dấu. Giả định thanh ghi AX chứa giá trị
FFFFh, Thanh ghi BX chứa giá trị 0001h, Sử dụng lệnh ADD để cộng 2 giá
trị trên.
This document is created with the unregistered version of Document2PDF Pilot.
ADD AX,BX
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Kết quả đúng của phép tính trên là:
FFFFh + 0001h = 100000h 65536 (V•ợt quá giới hạn của số nguyên
dùng cho Word 16 bit). Kết quả đ•ợc l•u trong thanh ghi AX là 0000h (Số 1
là số nhớ và đ•ợc ghi trong cờ Carry). Vậy ta sẽ nhận đ•ợc kết quả sai.
Tuy nhiên kết quả sẽ là đúng trong tr•ờng hợp số có dấu. Giải thích nh• sau:
Ta có FFFFh = -1
0001h = 1
FFFFh + 0001h = 0
Vậy kết quả l•u trong AX là 0000h sẽ là đúng Tràn có dấu không xảy ra.
Một ví dụ khác về tràn số có dấu:
AX và BX cùng chứa giá trị 7FFFh.
ADD AX,BX
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
Kết quả là FFFEh
Ta có 7FFFh = 32767
Vậy 7FFFh + 7FFFh = 32767 + 32767 = 65534. Kết quả này ngoài
giới hạn của số có dấu. Kết quả đ•ợc diễn giải theo số có dấu là FFFEh
= -2 Tình trạng tràn có dấu xảy ra.
- Cách thức bộ xử lý biểu hiện trạng thái tràn.:
Bộ xử lý sẽ thiết lập cờ OF = 1 với tràn số không dấu, CF = 1 với
tràn số có dấu. Điều này sẽ giúp ch•ơng tình hoạt động chính xác. nếu
không có hoạt dộng gí xảy ra ngay lúc đó, các câu lệnh khác phía sau sẽ
làm cho cờ tràn sẽ đ•ợc tắt OF = 0.
Để xác định trạng thái tràn số, bộ xử lý không dịch kết quả là số
có dấu hoặc không dấu. Hành động là sẽ sử dụng cả 2 cách thông dịch
cho mỗi phép toán và bật các cờ CF và OF cho trạng thái tràn số không
dấu và tràn số có dấu. Nếu Tính toán là số có dấu, chỉ có OF đ•ợc để ý
và CF sẽ bị lờ đi, Ng•ợc lại, CF sẽ đ•ợc để ý và OF sẽ bị lờ đi.
- Cách thức bộ xử lý xác định trạng thái tràn.
Có thể có nhiều lệnh làm xảy ra trạng thái tràn số nh•ng để đơn
giản vấn đề, ta chỉ giới hạn ở các lệnh cộng và trừ.
+ Tràn số không dấu: Trong phép toán cộng, Tràn số không dấu
xảy ra khi có số nhớ trên Bit MSB (Most Significant Bit). Điều đó có
nghĩa là kết quả đúng lớn hơn số không có dấu. ví dụ nh• FFFFh cho 1
Word và FFh cho 1 Byte. Trong phép trừ, Tràn số không dấu xảy ra khi
phải m•ợn thêm một số hạng từ MSB và kết quả sẽ phải nhỏ hơn 0.
+ Tràn số có dấu:
Phép cộng các số cùng dấu, trạng thái tràn số xảy ra khi kết
quả có dấu khác. Điều này xảy ra nh•
Các file đính kèm theo tài liệu này:
- Comarch08_20050429_013838.pdf