- Ch ng trình l n và nằm nhi u đo n khác nhau. - Có thể gọi các ch ng trình con d ng Far.
- Kích th c tập tin tùy ý.
- Có header đầu tập tin để ch a các thông tin đi u khiển cần thi t. - Thi hành chậm h n tập tin d ng COM.
Tập tin d ng EXE, không dùng l nh ORG 100h đầu ch ng trình.
Cấu trúc chương trình điển hình của tập tin dạng EXE như sau: …. ; Khai báo hằng số (nếu có)
MNAME MACRO ; (Nếu có)
… ; Viết lệnh Macro
ENDM
DSEG SEGMENT
… ; Khai báo dữ liệu
DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG
MOV DS, AX ; khởi động DS
…….
……. ; (Chương trình chính)
…….
MOV AH, 4Ch ; hay MOV AX,4C00h
INT 21h ; thoát CT_CON PROC …….. ; Viết các Thủ tục (Nếu có) RET CT_CON ENDP CSEG ENDS END start 6.2.4 Ví d
Đo n ch ng trình h p ng sau thực hi n vi c in ký tự ‘B’ lên màn hình s dụng các câu l nh đ c giải thích nh sau:
MOV AH, 02h ; Sử dụng hàm in ký tự của ngắt 21h MOV DL, ‘B’ ; DL chứa ký tự cần in
INT 21h ; Gọi ngắt để thực công việc
a). Mu n đo n ch ng trình này thực thi trên máy tính d ng COM thì phải dùng cấu trúc ch ng trình d ng COM để vi t, nh sau:
PAGE 60,132
TITLE chuong trinh dang .COM CSEG SEGMENT
ASSUME CS: CSEG
ORG 100h
Begin: MOV AH, 02h ; Sử dụng hàm in ký tự của ngắt 21h
MOV DL, ‘B’ ; DL chứa ký tự cần in
INT 21h ; Gọi ngắt để thực công việc
CSEG ENDS END Begin
b) Mu n đo n ch ng trình này thực thi trên máy tính d ng EXE thì phải dùng cấu trúc ch ng trình d ng EXE để vi t, nh sau:
DSEG SEGMENT
; Vì không có biến để khai báo nên đoạn DSEG có thể bỏ đi
DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG Begin: MOV AX, DSEG
MOV DS, AX
MOV AH, 02h ; Sử dụng hàm in 1 ký tự của ngắt 21h
MOV DL, ‘B’ ; DL chứa ký tự cần in
INT 21h ; Gọi ngắt để thực công việc
MOV AH, 4Ch ; AH chứa 4Ch để thoát khi gọi ngắt 21
INT 21h CSEG ENDS END Begin
c) Vi t l i ch ng trình trên nh ng khôngkhai báo đo n DSEG, khi đó ch ng trình ch có 1 đo n duy nhất, nh sau:
CSEG SEGMENT
ASSUME CS: CSEG, DS: CSEG Begin: MOV AX, CSEG
MOV DS, AX
MOV AH, 02h ; Sử dụng hàm in ký tự của ngắt 21h
MOV DL, ‘B’ ; DL chứa ký tự cần in
INT 21h ; Gọi ngắt để thực công việc
MOV AH, 4Ch ; AH chứa trị 4Ch để thoát
INT 21h CSEG ENDS
6.2.5 Cách t o 1 ch ng trình bằng h p ng
Để t o m t ch ng trình vi t bằng h p ng ch y trên máy tính PC, ta cần phải có b trình h p d ch MASM (hay TASM). Trình h p d ch MASM đ c cung cấp g m 2 tập tin c bản: MASM.EXE (h p d ch) và LINK.EXE (liên k t). Ngoài ra còn m t s tập tin khác nh EXE2BIN.COM dùng để chuyển sang d ng COM và DEBUG.COM dùng để g r i ch ng trình. Các tập tin này đ c thực thi d i MSDOS. Cần ba hoặc b n b c để t o ch ng trình h p ng ch y đ c trên máy tính PC
B C 1: So n thảo tập tin ngu n và l u tập tin lên điã có phần m r ng là (*.ASM)
Ví dụ: Dùng trình so n thảo Notepad hoặc trình so n thảo văn bản TEXT so n thảo ch ng trình nh các ví dụ trên và l u vào đĩa có tên VIDU.ASM
B C 2: H p d ch file ASM thành file đ i t ng (VIDU.OBJ)
Giả s các tập tin cần thi t: MASM.EXE (h p d ch) và LINK.EXE (liên k t). EXE2BIN.COM (Chuyển file .EXE thành file .COM) có trong th mục hi n hành là D:\ Ta ra l nh h p d ch để t o ra file .OBJ nh sau
C:\> MASM <filenamengu n> [filenameđích.OBJ]
Trình h p d ch kiểm tra l i cú pháp trên t ng dòng l nh. N u có l i thì phải quay v b c 1 để s a ch a và d ch l i cho đ n h t l i. N u không nêu filenameđích thì trình d ch s lấy tên filenamengu n v i phần m r ng là .OBJ
Ví dụ: Nh ví dụ trên ta ra l nh D:\MASM vidu
B C 3: Liên k t m t hay nhi u file OBJ thành file thi hành (*.EXE)
D:\> LINK <filename1;> [<filename2;> …] [<filename.exe>] Ví dụ: Nh ví dụ trên ta ra l nh
D:\>LINK VIDU
B C 4: Đ i t EXE sang COM (Dành cho ch ng trình vi t d ng COM)
C:\> EXE2BIN <filename.EXE> <filename.COM>
6.3. M t s l nh c a h p ng 16 bit 6.3.1 Toán h ng
Tập l nh c a 8086 có 111 l nh v i chi u dài có t 1 đ n đ n vài byte. Các CPU sau này (80x86) đ c b sung thêm nhi u l nh m i có ch c năng phong phú h n. CPU 80386 có 206 l nh; CPU Pentium có h n 400 l nh. L nh c a 8086 có t i đa 2 toán h ng, cú pháp chung nh sau:
<Thaotác> Toánhạng1 , Toánhạng_2
Trong đó <Thao tác> (Operation) là bắt bu c, Toánh ng1 (Operand1) là toán h ng đích, Toánh ng2 (Operand2) là toán h ng ngu n. Toán h ng ngu n có thể ch a d li u hoặc đa ch ; toán h ng ngu n không thay đ i b i thao tác c a l nh. Toán h ng đích ch ra n i l u tr d li u là thanh ghi hay trong b nh và d li u này s đ c s dụng để thực thi. Toán h ng có thể là thanh ghi, b nh . Hai toán h ng phải có cùng kích th c. Ta có các lo i toán h ng sau:
- Toán h ng thanh ghi (Register Operand): V i kiểu đnh đa ch này toán h ng là 1 trong các thanh ghi 8bit; 16bit; 32bit c a tập các thanh ghi c a b vi x lý. Tuỳ thu c vào l nh/ch th thanh ghi có thể toán h ng 1; toán h ng 2 hoặc cả 2.
Ví dụ: Bien_1 DW ?
MOV CX,Bien_1 ; Thanh ghi toán h ng 1 MOV Bien_1,BX ; Thanh ghi toán h ng 2 MOV CL,AH ; Thanh ghi cả 2 toán h ng
- Toán h ng t c th i (Immediate operand): V i kiểu đnh đa ch t c th i toán h ng ngu n ch a 1 giá tr là hằng s ; m t biểu th c. Toán h ng đích có thể là 1 thanh ghi hoặc 1 v trí nh
- Toán h ng b nh trực ti p (Direct memory operand): M t trong 2 toán h ng tham chi u đ n 1 v trí nh trong b nh và toán h ng còn l i tham chi u đ n 1 thanh ghi. Không có l nh/ch th nào có 2 toán h ng đ ng th i tham chi u đ n các v trí trong b nh .
- Toán h ng gián ti p b nh (Indirect memory operand): Là kỹ thuật s dụng kiểu đ nh đa ch Segment:Offset. Các thanh ghi s dụng cho mục đích này là BX, DI, SI, BP đ c đặt trong dấu ngoặc vuông [ ]. Các thanh ghi BX, DI, SI th ng k t h p v i thanh ghi Segment DS thành DS:BX, DS:DI, DS:SI để x lý d li u trong
segment d li u. Khi các thanh ghi BX, DI, SI hoặc 1 hằng s đ c đặt trong dấu ngoặc vuông mà trong 1 toán h ng thì ch ra rằng đó là đa ch Offset c a DS.
6.3.2. Nhóm l nh sao chép d li u, đ ach :
1. Lệnh sao chép dữliệu
Cú pháp:
MOV Đích, Nguồn
Trong đó:
Ngu n (toán hạngngu n) : Reg, Mem, Immed.
Đích (toán hạngđích) : Reg, Mem.
Công dụng: Sao chép d li u ngu n vào đích. Sau khi l nh đ c thực hi n thì giá tr toán h ngngu n và toán h ngđích bằng nhau.
Lưu ý:
- L nh MOV không cho phép cả 2 toán h ng là đa ch b nh , toán h ng t c th i cho thanh ghi segment và t thanh ghi Segment đ n thanh ghi Segment
- L nh MOV không ảnh h ng đ n thanh ghi tr ng thái.
Ví dụ:
MOV CX, BX ; Sao chép n i dung thanh ghi BX vào thanh ghi CX. ;Sau khi thực hi n xong, BX=CX.
MOV DX, 1234h ; DL ← 34h, DH ← 12h MOV DS, AX ; DS ← AX
MOV AH, [1234h] ; AH ← M[DS:1234h]
MOV [1235h], DX ; M[DS:1235h] ← DL, M[DS:1236h] ← DH
2. Lệnh hoán đổidữ liệu
Cú pháp:
XCHG Đích, Ngu n
Ngu n, đích: Reg, Mem.
Công dụng: L nh XCHG hoán đ i d li u gi a ngu n và đích. Cả hai toán h ng không đ ng th i là Mem.
Ví dụ:
XCHG AX, [1235h] ; AL ↔ M[DS:1235h], AH ↔ M[DS:1236h]
3. Lệnh lấy địa chỉ độ dời
Cú pháp:
LEA Reg16, Mem16
Công dụng: Lấy đ a ch đ d i c a bi n hay nhãn (mem16) đ a vào thanh ghi đích Reg16 và kh i đ ng thanh ghi đó.
Ví dụ:
LEA DX, bienA ; Lấy đ d i c a bi n bienA l u vào DX
6.3.3. Nhóm l nh tính toán s học.
1. Lệnh cộng hai số nguyên
Cú pháp:
ADD đích, ngu n
Ngu n : Reg, Mem, Immed.
Đích : Reg, Mem.
Công dụng: Lấy toán h ng ngu n c ng toán h ng đích và l u k t quả vào toán h ng đích.
2. Lệnh trừ hai số nguyên
Cú pháp:
SUB đích, ngu n
Ngu n : Reg, Mem, Immed. Đích : Reg, Mem.
Công dụng: Lấy toán h ng đích (s b tr ) tr toán h ng ngu n (s tr ) và l u k t quả vào toán h ng đích.
Ví dụ:
ADD AL, 15 ; AL ← AL + 15 ADD AX, DX ; AX ← AX + DX SUB BX, 15h ; BX ← BX – 15h
3. Lệnh tăng 1 đơn vị (Increment)
Cú pháp:
Đích : Reg, Mem. Lệnh này chỉ có 1 toán hạng
Công dụng: Tăng n i dung c a toán h ng đích thêm 1 đ n v .
4. Lệnh giảm 1 đơn vị (Decrmemt)
Cú pháp:
DEC đích
Đích : Reg, Mem.
Công dụng: Giảm n i dung c a đích đi 1 đ n v .
Ví dụ:
INC AL ; AL ← AL + 1 DEC AX ; AX ← AX - 1 INC bienC ; bienC ← bienC + 1
5. Lệnh nhân hai số nguyên
Cú pháp:
MUL ngu n
Ngu n: Reg, Mem
Công dụng: Nhân thanh ghi tích lũy (AX) v i toán h ng ngu n. Tùy vào kích
th c c a toánh ng ngu n mà CPU thực hi n phép nhân 8 hay 16 bit.
- Nhân 8 bit: dành cho toán h ng ngu n là 8 bit. Khi đó, CPU s lấy thanh ghi AL nhân v i toán h ng ngu n và l u k t quả vào AX.
- Nhân 16 bit: dành cho toán h ng ngu n là 16 bit. Khi đó, CPU s nhân thanh ghi AX v i toán h ng ngu n và l u k t quả vào cặp thanh ghi DX và AX (nghĩa là kết quả có 32 bit, 16 bit cao lưu vào DX, còn 16 bit thấp lưu vào AX)
Ví dụ:
MUL BL ; AX ← AL * BL (nhân 8 bit)
MUL BX ; DX:AX ← AX * BX (nhân 16 bit)
MUL [1235h] ; AX ← AL * M[DS:1235h] (nhân 8 bit)
6. Lệnh chia hai số nguyên
Cú pháp:
DIV ngu n
Công dụng: lấy thanh ghi tích lũy (s b chia) chia cho ngu n (s chia). Tùy vào kích th c c a toán h ng ngu n mà CPU thực hi n phép chia 8 hay 16 bit.
- Chia 8 bit: dành cho toán h ng ngu n là 8 bit. Khi đó, CPU s lấy thanh ghi AX chia cho toán h ng ngu n. Th ng s c a k t quả đ c l u vào AL còn phần d l u vào AH.
- Chia 16 bit: dành cho toán h ng ngu n là 16 bit. Khi đó, CPU lấy cặp thanh ghi DX:AX (s 32 bit) chia cho toán h ng ngu n. Th ng s c a k t quả đ c l u vào AX còn phần d thìl u vào DX.
Ví dụ:
DIV DL ; AL, AH ← AX ÷ DL DIV BX ; AX, DX ← DX:AX ÷ BX
6.3.4. Nhóm l nh logic và ghi dch
1. AND, OR, XOR, TEST: Và, Hoặc, C ng không nh , Kiểm tra bit
Cú pháp:
AND đích, ngu n OR đích, ngu n XOR đích, ngu n TEST đích, ngu n
Ngu n: Reg, Mem hay Immed. Đích: Reg, Mem.
Công dụng: Thực hi n phép toán logic (and, or, xor) theo t ng bit t ng ng gi a toánh ng đích và toán h ng ngu n, l u gi k t quả toán h ng đích.
- L nh TEST thực hi n kiểm tra bit, gi ng l nh AND nh ng không l u gi l i k t quả mà k t quả c a phép toán ch ảnh h ng đ n các c tr ng thái.
Ví dụ:
MOV AL, 01101110b ; AL ← 01101110b
AND AL, 00110110b ; AL ← AL AND 01101110b (AL=00100110b)
XOR AX, AX ; AX ← AX XOR AX (Kết quả: AX = 0)
AND DL, 11000011b ; Xóa 4 bit gi a trong thanh ghi DL
;K t quả kiểm tra s ảnh h ng lên c Zero (ZF)
2. NOT –Đảo bit (Lấy Bù 1)
Cú pháp:
NOT đích
Đích: Reg, Mem
Công dụng: Đảo ng c t ng bit (hay lấy bù 1) toán h ng đích.
Ví dụ:
MOV AH, 0Fh ; AH ← 0Fh (00001111b) NOT AH ; AH = 0F0h (11110000b)
3. SHL –Dịch trái logic ( Shift Left Logical)
Cú pháp:
SHL đích, 1 SHL đích, CL
Đích: Reg, Mem
Công dụng: D ch toán h ng đích sang trái, có thể d ch 1 bit hoặc nhi u h n 1 bit, n u nhi u h n 1 bit thì thanh ghi CL ch a s bit d ch. s 0 đ c s dụng để làm đầy, còn bit b đẩy ra ngoài lần l t đ c đ a vào c Carry (CF).
Ví dụ:
MOV AL, 01101101b ; AL = 01101101b
SHL AL, 1 ; AL = 11011010b và CF=0
4. SHR (logical shift right) dịch phải logic.
Cú pháp:
SHR đích, 1 SHR đích, CL
Công dụng: Gi ng l nh SHL nh ng bây gi d ch toán h ng đích sang phải
Ví dụ:
MOV AL, 01101101b ; AL = 01101101b
SHR AL, 1 ; AL = 00110110b và CF=1
5. SAL (Shift arithmetic left): dịch trái số học
SAL đích, 1 SAL đích, CL Đích: Reg, Mem Công dụng: Gi ng l nh SHL Ví dụ: MOV AL, 01101101b ; AL = 01101101b SAL AL, 1 ; AL = 11011011b và CF=0
6. SAR (Shift arithmetic right) : dịch phải số học
Cú pháp:
SAR đích, 1 SAR đích, CL
Đích: Reg, Mem
Công dụng: L nh này gi ng SHR nh ng MSB (bit cao nhất – bit dấu) đ c s dụng để làm đầy (bảo toàn bit MSB –Bit dấu).
Ví dụ:
MOV AL, 01101101b ; AL = 01101101b
SAR AL, 1 ; AL = 00110110b và CF=1
7. ROL (Rotate left) : quay vòng sang trái
Cú pháp:
ROL đích, 1 ROL đích, CL
Công dụng: Gi ng SHL, nh ng thực hi n vi c quay vòng, Bit b đẩy ra ngoài đ c lấy vào c CF và đi n vào phần tr ng c a đích
Ví dụ:
MOV AL, 01101101b ; AL = 01101101b ROL AL, 1 ; AL = 11011010b và CF=0
8. ROR (Rotate right) : Quay vòng sang phải
Cú pháp:
ROR đích, 1 ROR đích, CL
Đích: Reg, Mem
Công dụng: L nh nầy gi ng ROL nh ng quay vòng sang phải.
Ví dụ:
MOV AL, 01101101b ; AL = 01101101b
SAR AL, 1 ; AL = 00110110b và CF=1
9. RCL (Rotate through carry left): Quay trái qua cờ Carry
Cú pháp:
RCL đích, 1 RCL đích, CL
Công dụng: Gi ng nh l nh ROL nh ng có sự tham gia c a c carry (CF). Bit b đẩy ra ngoài đi n vào c CF, Giá tr trong c CF lần l t đi n vào phần tr ng c a đích. C CF cũng là 1 bit tham gia vào vòng quay
10. RCR (Rotate through carry right): Quay vòng qua cờ sang phải
Cú pháp:
RCR đích, 1 RCR đích, CL
Đích: Reg, Mem
Công dụng: Gi ng RCL nh ng quay vòng sang phải.
6.3.5. Nhóm l nh vào ra ngo i vi.
1. IN - Lấy s li u t ngo i vi.
Cú pháp: IN AL, đ a ch c ng 8 bít IN AL, DX ; DX ch a đ a ch c ng 16 bit
Ý nghĩa: Lấy d li u ngo i vi có đ a ch 8 bit đ a vào thanh ghi AL. N u đ a
ch c a
ngo i vi là 16 bít thì phải dùng DX ch a đ a ch này.
Ví dụ : - Đọc d li u ngo i vi 3Fh
IN AL, 3Fh ; AL ← port(3Fh) (3Fh là địa chỉ c ng 8 bít)
- Đọc d li u ngo i vi 3F8h
MOV DX, 3F8h ; DX ← 3F8h (3F8h là địa chỉ c ng 16 bit)
2. OUT - Đ a s li u ra ngo i vi.
Cú pháp: OUT đ a ch c ng 8 bít, AL ; port(8 bit) ← AL OUT DX, AL ; port(DX) ← AL
Ý nghĩa: Gi ng l nh IN nh ng là xuất d li u trong AL ra ngo i vi.
Ví dụ: MOV DX, 04A5h ; DX ← 04A5h
OUT DX, AL ; port(DX) ← AL
6.3.6. Nhóm l nh h th ng
Nhóm l nh h th ng bao g m các l nh đi u khiển ho t đ ng c a CPU hay thi t lập giá tr các c . Các l nh này không có toán h ng, do đó cú pháp c a l nh rất đ n giản ch g m các tác vụ l nh sau:
CLC ; Xóa c CF (CF = 0) –Clear Carry flag
CMC ; Đảo ng c c CF – Complement Carry flag
CLD ; Xóa c h ng (DF=0) –Clear Diretion flag
STD ; Thi t lập c h ng (DF=1) –Set Diretion flag