Hợp ngữ và lập trình hệ thống - Chương 1: Ngôn ngữ assembler (asm) và cách lập trình
1. Ngôn ngữ ASM 2. Hệ lệnh ASM 3. Các lệnh điều khiển khi dịch chương trình ASM 4. Macro và Chương trình con
Bạn đang xem trước 20 trang tài liệu Hợp ngữ và lập trình hệ thống - Chương 1: Ngôn ngữ assembler (asm) và cách lập trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LOGO
HỢP NGỮ và LẬP TRÌNH HỆ THỐNG
GV: Phạm Công Hòa
Tel: 091.552.9889
Email: conghoaf1@gmail.com
CHƯƠNG 1: NGÔN NGỮ ASSEMBLER (ASM)
VÀ CÁCH LẬP TRÌNH
2
NỘI DUNG HỌC PHẦN
I NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
II LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASM
III LẬP TRÌNH HỆ THỐNG
3
I NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
1. Ngôn ngữ ASM
2. Hệ lệnh ASM
3. Các lệnh điều khiển khi dịch chương trình ASM
4. Macro và Chương trình con
4
1.1. Giới thiệu chung
1.2. Cài đặt chương trình dịch
1.3. Các bước thực hiện một chương trình ASM
1.4. Cấu trúc chung của một chương trình thuần túy ASM
- Nội dung:
1. NGÔN NGỮ ASM
5
1. NGÔN NGỮ ASM
1.1. Giới thiệu chung
- ASM là ngôn ngữ bậc thấp, gần ngôn ngữ máy.
- Ưu điểm:
Tốc độ nhanh.
Tiết kiệm vùng nhớ.
- Nhược điểm:
Khó viết vì phải am hiểu phần cứng.
Khó sửa lỗi (lỗi cú pháp và lỗi thuật toán)..
- Ứng dụng:
Biết lõi của hệ điều hành.
Viết chương trình đo và điều khiển trong công nghiệp
Viết chương trình virus
6
1. NGÔN NGỮ ASM
1.2. Cài đặt chương trình dịch
- Sử dụng MASM (Microsoft) hoặc TASM (Borland).
Với TASM, có thể copy nguyên CD bản quyền hoặc copy 4 tệp
chính:
Tasm.exe
Tlink.exe
DpmiLoad.exe
DpmiMem.dll
- Sử dụng EMU8086
7
1. NGÔN NGỮ ASM
1.3. Các bước thực hiện một chương trình ASM
- Gồm 4 bước (Với TASM):
Bước 1: Dùng chương trình sọan thảo bất kỳ (NC, EDIT, TC,
NOTEPAD,) để viết các lệnh chương trình, lưu vào tệp tin có đuôi “.asm”.
Bước 2: Dịch tệp “.asm” sang “.obj”. Nếu dịch thành công ta sẽ thấy xuất
hiện tệp “.obj”, ngược lại thấy thông báo lỗi dạng: **Error**
Bước 3: Dịch tệp “.obj” sang “.exe”.
Bước 4: Chạy chương trình (Gọi thi hành tệp “.exe”).
8
1. NGÔN NGỮ ASM
1.4. Cấu trúc chung của một chương trình thuần túy ASM
[Phần khai báo MACRO, STRUC, RECORD và UNION] (nếu có)
.MODEL
.STACK
.DATA
;Khai báo biến
.CODE
Nhãn:
;Thân chương trình
[Các chương trình con] (nếu có)
END Nhãn
- Cấu trúc chương trình ASM dạng đơn giản:
9
1. NGÔN NGỮ ASM
.MODEL small
.STACK 100h
.DATA
s1 DB 'Hello world!$‟
.CODE
Main:
Mov ax, @data
Mov ds, ax
Lea dx, s1
Mov ah,9
Int 21h
Mov ah,4ch
Int 21h
End Main
- Ví dụ một chương trình ASM đơn giản: Hiện xâu ký tự “Hello
world!” ra màn hình.
10
I NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
1. Ngôn ngữ ASM
2. Hệ lệnh ASM
3. Các lệnh điều khiển khi dịch chương trình ASM
4. Macro và Chương trình con
5. Chương trình ASM dạng COM
11
2.1. Hỗ trợ của hệ thống cho lập trình ASM
2.2. Cú pháp 1 dòng lệnh trong ASM
2.3. Hệ thống lệnh ASM
- Nội dung:
2. HỆ LỆNH ASSEMBLER
12
2.1. Hỗ trợ của hệ thống cho lập trình ASM
2.1.1. Thanh ghi (Registers)
2. HỆ LỆNH ASSEMBLER
CPU
13
2.1. Hỗ trợ của hệ thống cho lập trình ASM
Thanh ghi (Registers)
- Thanh ghi là vùng nhớ đặc biệt (dạng RAM) nằm ở CPU
2. HỆ LỆNH ASSEMBLER
14
Phân loại thanh ghi:
• Nhóm 1: Gồm 1 thanh ghi cờ 16 bít. Người lập trình ASM hay
lấy trạng thái các bit cờ làm điều kiện cho các lệnh nhảy (cờ CF).
• Nhóm 2: Gồm 8 thanh ghi đa năng 16 bit:
AX (Accumulator register)
3 mode truy
nhập: AH,
AL, AX
BX (Base register)
CX (Counter regigter)
DX (Data regigter)
SI
1 mode truy
nhập
DI
BP
SP
*Người lập trình chỉ được phép dùng 7 thanh ghi đầu để thay cho biến.
2. HỆ LỆNH ASSEMBLER
15
Phân loại thanh ghi (tiếp):
• Nhóm 3: Gồm 1 thanh ghi 16 bit con trỏ lệnh: IP
• Nhóm 4: Gồm 4 thanh ghi segment 16 bit: CS, DS, ES, SS
2. HỆ LỆNH ASSEMBLER
16
• AX, thanh ghi tích luỹ (Accumulatior Register): đây là thanh ghi
chính để thực hiện các phép toán số học, các lệnh xuất nhập cổng.
Ngoài ra nó cũng được dùng trong một số lệnh xử lý chuỗi.
• BX, thanh ghi cơ sở (Base Register): Dùng để chỉ đến vị trí của một
ô nhớ trong một đoạn. Thường thanh ghi BX được dùng trong phép
định địa chỉ cơ sở khi truy xuất các dữ liệu trong bộ nhớ.
• CX, thanh ghi đếm (Count Register): thường dùng để định số lần lặp
lại trong một lệnh.
• DX, thanh ghi dữ liệu (Data Register): thường dùng để ghi kết quả
của các phép toán nhân và chia, định địa cổng trong các phép xuất
nhập cổng.
2. HỆ LỆNH ASSEMBLER
Một số ý nghĩa chung của các thanh ghi:
17
• Cờ nhớ CF (Carry Flag): Phép toán có/không mượn.
• Cờ phụ AF (Auxiliary Carry Flag): Phép toán có/không mượn đối với
4 bit thấp.
• Cờ Zero ZF (Zero Flag): Phép toán có/không bằng 0.
• Cờ dấu SF (Sign Flag): Có giá trị tương ứng với bít cao nhất của kết
quả phép toán vừa được thực hiện.
• Cờ chẵn lẻ PF (Parity Flag): Tổng 8 bít thấp là số chẵn/lẻ.
• Cờ tràn OF (Overflow Flag): kết quả phép toán các số có dấu bị sai.
2. HỆ LỆNH ASSEMBLER
18
2.1.2. Cách thể hiện địa chỉ của một ô nhớ.
Địa chỉ 1 ô nhớ = Segment : Offset
(1 segment = 64K)
- Giải thích: Phần Segment cho biết ô nhớ đó nằm ở Segment
nào, phần Offset cho biết vị trí từ đầu segment đến ô nhớ đó.
- Ví dụ: Địa chỉ ô nhớ (4:12) cho ta biết ô nhớ nằm ở vị trí thứ 12
của segment 4.
• Dạng Logic:
Địa chỉ 1 ô nhớ = Segment * 16 + Offset
• Dạng vật lý:
2. HỆ LỆNH ASSEMBLER
19
2.1.3. Một số hàm thường dùng của hệ thống hỗ trợ lập trình ASM
• Hàm số 1: Chờ nhận 1 ký tự từ bàn phím.
Mov ah,1
Int 21h
Kết quả: phần AL của thanh ghi AX sẽ nhận mã ASCII của bàn phím.
Ví dụ: Khi người dùng bấm ký tự „A‟, giá trị thanh ghi AL sẽ là:
0 1 0 0 0 0 0 1
2. HỆ LỆNH ASSEMBLER
20
• Hàm số 2: Hiện 1 ký tự ra màn hình tại vị trí con trỏ.
Mov al, Mã_ASCII_của_ký_tự
Mov ah, 0eh
Int 10h
Mov al, Mã_ASCII_của_ký_tự
Mov ah, 2
Int 21h
- Cách 1:
- Cách 2:
2. HỆ LỆNH ASSEMBLER
21
• Hàm số 3: Hiện 1 xâu ký tự (kết thúc bằng dấu $ ra màn hình)
Lea dx, tên_biến_xâu
Mov ah,9
Int 21h
• Hàm số 4: Kết thúc chưong trình ASM, trở về DOS
Mov ah,4ch
Int 21h
2. HỆ LỆNH ASSEMBLER
22
2.2. Cú pháp 1 dòng lệnh trong ASM
- Trong ngôn ngữ ASM mỗi lệnh được viết trên 1 dòng với cú
pháp như sau (không phân biệt chữ hoa/thường):
[Nhãn:] [Tên lệnh] [toán hạng] [;Chú thích]
- Các lệnh trong ngôn ngữ ASM thường được viết tắt bởi các từ tiếng Anh như:
Add Addition
Mul Multiplication
Mov Move
2. HỆ LỆNH ASSEMBLER
23
- Một số quy ước về các toán hạng:
Toán hạng nguồn SRC (Source)
Toán hạng đích DST (Destination)
Thanh ghi REG (Register)
Biến nhớ Mem (Memory)
Hằng số dữ liệu Data
Thanh ghi Segment SegReg (Segment Register)
2. HỆ LỆNH ASSEMBLER
24
2.3. Hệ thống lệnh ASM
Các lệnh di chuyển dữ liệu.
- Phân loại lệnh:
Nhóm lệnh số học.
Nhóm lệnh thao tác bit.
Nhóm lệnh làm việc với xâu ký tự.
Nhóm lệnh rẽ nhánh.
Nhóm lệnh làm việc với các bit cờ.
2. HỆ LỆNH ASSEMBLER
25
2.3.1. Các lệnh di chuyển dữ liệu.
Lệnh 1: MOV
- Chức năng: Đưa giá trị toán hạng nguồn SRC vào toán hạng đích DST.
- Cú pháp: MOV DST, SRC
- Chú ý:
+ Các toán hạng DST và SRC có thể chuyển nhận giá trị theo các dạng:
DST SRC Ví dụ
Reg1 Reg2 Mov ax, bx
Reg Mem Mov ax, value
Reg Data Mov ax, 123
Mem Reg Mov value, bx
Mem Data Mov value, 50
SegReg Reg16 Mov ds, ax
Reg16 SegReg Mov ax, es
SegReg Mem Mov ds, value
2. HỆ LỆNH ASSEMBLER
26
Lệnh 1: MOV (tiếp)
Nếu muốn chuyển giá trị từ mem1 sang mem2 ta phải chuyển gián
tiếp theo cách:
Mov reg, mem1
Mov mem2, reg
2. HỆ LỆNH ASSEMBLER
27
Lệnh 2: PUSH
- Cú pháp: PUSH DST
- Chức năng: Đưa 2 byte của DST vào đỉnh STACK
Lệnh 3: POP
- Cú pháp: POP DST
- Chức năng: Lấy 2 byte của đỉnh STACK và đưa vào DST
2. HỆ LỆNH ASSEMBLER
28
(Sau lệnh Pop AX, trong stack chỉ còn chứa giá trị 158)
2. HỆ LỆNH ASSEMBLER
29
Lệnh 4: XCHG
- Cú pháp: XCHG DST, SRC
- Chức năng: Hoán đổi nội dung giá trị của 2 toán hạng.
- Chú ý: DST và SRC có thể là :
Reg1, Reg2
Reg, Mem
2. HỆ LỆNH ASSEMBLER
30
Lệnh 5: IN
- Cú pháp: IN AL/AX, Địa_chỉ_cổng
- Chức năng: Đọc địa chỉ cổng dữ liệu 8/16 bit.
- Chú ý: Nếu địa chỉ cổng <256 thì địa chỉ đó có thể dùng trực tiếp trong
lệnh IN.
- Ví dụ: Cổng COM1 của máy tính có địa chỉ 3f8h, muốn đọc nội dung từ
cổng COM1 ta phải thực hiện:
Mov dx, 3f8h
In al, dx
2. HỆ LỆNH ASSEMBLER
31
Lệnh 6: OUT
- Cú pháp: OUT Địa_chỉ_cổng, AL/AX
- Chức năng: Đưa địa chỉ có trong thanh ghi AL/AX ra một cổng 8/16 bit.
- Chú ý: Về địa chỉ cổng giống với lệnh IN
2. HỆ LỆNH ASSEMBLER
32
Lệnh 7: LEA
- Cú pháp: LEA Reg, Value
- Chức năng: Lấy địa chỉ offset của biến đưa vào thanh ghi Reg.
Lệnh 8: LDS
- Cú pháp: LDS Reg16, Mem
- Chức năng: Đưa 2 byte của biến nhớ vào thanh ghi 16 và nội dung 2
byte tiếp theo đưa vào DS.
Lệnh 9: LES
- Cú pháp: LES Reg16, Mem
- Chức năng: Giống lệnh LDS chỉ khác DS được thay thế bằng ES.
2. HỆ LỆNH ASSEMBLER
33
2.3.2. Nhóm lệnh số học.
- Nhóm lệnh thực hiện các phép toán số học: +,-,*,/,
- Chú ý: Hầu hết các lệnh của nhóm này khi thực hiện có thể làm thay đổi
các bit cờ.
2. HỆ LỆNH ASSEMBLER
34
- Cú pháp: ADD DST, SRC
- Chức năng: Cộng giá trị 2 toán hạng. Kết quả của phép cộng sẽ nằm ở
DST.
Lệnh 1: ADD
- Chú ý:
DST SRC Ví dụ
Reg1 Reg2 Add ax, bx
Reg Data Add cx, 200
Reg Mem Add ax, value
Mem Reg Add value, dx
Mem Data Add value, 300
(Bảng*)
+ Các cờ bị tác động: C, P, A, Z, S, O
+ Các toán hạng sử dụng trong hàm có thể là:
2. HỆ LỆNH ASSEMBLER
35
- Cú pháp: ADC DST, SRC
- Chức năng: Cộng giá trị 2 toán hạng và giá trị cờ.
Lệnh 2: ADC
- Chú ý:
+ (Bảng*)
+ Các cờ bị tác động: C, P, A, Z, S, O
2. HỆ LỆNH ASSEMBLER
36
- Cú pháp: INC DST
- Chức năng: Tăng giá trị của toán hạng DST lên 1
Lệnh 3: INC
- Chú ý:
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (mem)
+ Các cờ bị tác động: C, P, A, Z, S, O
2. HỆ LỆNH ASSEMBLER
37
- Cú pháp: SUB DST, SRC
- Chức năng: Phép trừ DTS – SRC (DST DST – SRC)
Lệnh 4: SUB
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
38
- Cú pháp: DEC DST
- Chức năng: Trừ giá trị toán hạng DST đi 1
Lệnh 5: DEC
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).
2. HỆ LỆNH ASSEMBLER
39
- Cú pháp: NEG DST
- Chức năng: Đổi dấu giá trị của toán hạng.
Lệnh 6: NEG
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).
2. HỆ LỆNH ASSEMBLER
40
- Cú pháp: CMP DST, SRC
- Chức năng: So sánh nội dung 2 toán hạng và dựng cờ.
Lệnh 7: CMP
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
+ Kết quả: Nếu DST<SRC thì cờ C = 1
Nếu DST>=SRC thì cờ C = 0
Nếu DST=SRC thì cờ Z = 1
Nếu DSTSRC thì cờ Z = 0
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
41
- Cú pháp: MUL|IMUL SRC
- Chức năng: Thực hiện phép nhân không dấu | phép nhân có dấu.
Lệnh 8: MUL|IMUL
- Chú ý:
+ Nếu toán hạng nguồn SRC là 8 bit thì kết quả là AX (AX=AL*SRC)
+ Toán hạng nguồn có thể là Reg hoặc Mem.
+ Phải xóa giá trị nằm trong DX trước khi thực hiện phép nhân.
+ Nếu toán hạng nguồn SRC là 16 bit thì kết quả là DX:AX
(DX:AX=AX*SRC)
2. HỆ LỆNH ASSEMBLER
42
- Cú pháp: DIV|IDIV SRC
- Chức năng: Thực hiện phép chia giữa 2 toán hạng (không dấu|có
dấu).
Lệnh 9: DIV|IDIV
- Chú ý:
+ Chia số 16 bit (nằm trong AX) cho số 8 bit, ta được kết quả:
AL: thương số; AH: số dư
+ Chia số 32 bit (nằm trong DX:AX) cho số 16 bit, ta được kết quả:
AX: thương số; DX: số dư
+ Phải xóa giá trị nằm trong DX trước khi thực hiện phép chia.
2. HỆ LỆNH ASSEMBLER
43
2.3.3. Nhóm lệnh thao tác bit.
- Nhóm lệnh thực hiện các phép toán dịch chuyển bit, đảo bit, so
sánh các bit,.
- Chú ý: Hầu hết các lệnh của nhóm này khi thực hiện có thể làm
thay đổi các bit cờ.
2. HỆ LỆNH ASSEMBLER
44
- Cú pháp: AND DST, SRC
- Chức năng: Thực hiện phép “và” logic. Bit của kết quả = 1 khi 2 bit
tương ứng của 2 toán hạng đều bằng 1.
Lệnh 1: AND
- Chú ý:
+ Các cờ bị tác động: P, Z, S
- Ví dụ: al = 0101 1010
bl = 1001 0110
AND al,bl
cho kết quả: 0001 0010
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
45
- Cú pháp: OR DST, SRC
- Chức năng: Thực hiện phép “hoặc” logic. Bit của kết quả = 1 khi chỉ
cần 1 trong 2 bit tương ứng của 2 toán hạng bằng 1.
Lệnh 2: OR
- Chú ý:
+ Các cờ bị tác động: P, Z, S
- Ví dụ: al = 1010 0110
bl = 0101 0110
OR al,bl
cho kết quả: 1111 0110
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
46
- Cú pháp: XOR DST, SRC
- Chức năng: Thực hiện phép toán OR có loại trừ. Bit của kết quả = 1
khi 2 bit tương ứng của 2 toán hạng có giá trị khác nhau.
Lệnh 3: XOR
- Chú ý:
+ Các cờ bị tác động: P, Z, S
- Ví dụ: al = 1010 0110
bl = 0101 0110
XOR al,bl
cho kết quả: kq= 1111 0000
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
47
Ví dụ: Thực hiện gán giá trị của thanh ghi AX bằng 0
- Cách 1: mov ax, 0
- Cách 2: sub ax, ax
- Cách 3: and ax, 0
- Cách 4: xor ax, ax
2. HỆ LỆNH ASSEMBLER
48
- Cú pháp: SHL DST, count
- Chức năng: Dịch trái toán hạng count bit.
Lệnh 4: SHL (Shift Left)
+ Các cờ bị tác động: C, P, Z, S, O
+ Dịch trái 1 bit: Bit đầu tiên (bên trái) được chuyển vào cờ C
+ Dịch count bit: Bit thứ count được chuyển vào cờ C
(bit đầu tiên bên phải sẽ được gán = 0)
+ Nếu count=1 thì ta có thể đặt số 1 trực tiếp trong lệnh, nếu count >1
thì ta phải sử dụng đến thanh ghi CL làm trung gian:
Mov cl, 4
SHL ax, cl
- Chú ý:
2. HỆ LỆNH ASSEMBLER
49
2. HỆ LỆNH ASSEMBLER
50
- Cú pháp: SHR DST, count
- Chức năng: Dịch phải toán hạng count bit.
Lệnh 5: SHR (Shift Right)
+ Nếu count=1 thì ta có thể đặt số 1 trực tiếp trong lệnh, nếu count >1
thì ta phải sử dụng đến thanh ghi CL làm trung gian:
Mov cl, 4
SHR ax, cl
- Chú ý:
2. HỆ LỆNH ASSEMBLER
+ Các cờ bị tác động: C, P, Z, S, O
+ Dịch phải 1 bit: Bit đầu tiên (bên phải) được chuyển vào cờ C
+ Dịch count bit: Bit thứ count được chuyển vào cờ C
51
- Cú pháp: SAR DST, count
- Chức năng: Mỗi lần dịch = Chia đôi giá trị toán hạng đích DST làm
tròn dưới.
Lệnh 6: SAR (Shift Arithmetic Right )
+ Các cờ bị tác động: C, P, Z, S, O
+ Giống với lệnh SHR
- Chú ý:
-Ví dụ: dịch 1 lần: 1000 1010 -> 0100 0101
2. HỆ LỆNH ASSEMBLER
52
- Cú pháp: ROL DST, count
- Chức năng: Dịch các bit của toán hạng đích DST sang trái theo vòng
tròn.
Lệnh 7: ROL (Rotate Left)
+ Các cờ bị tác động: C, P, Z, S, O
+ Giống với lệnh SHR
- Chú ý:
-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101
2. HỆ LỆNH ASSEMBLER
53
2. HỆ LỆNH ASSEMBLER
54
- Cú pháp: ROR DST, count
- Chức năng: Dịch các bit của toán hạng đích DST sang phải theo vòng
tròn.
Lệnh 8: ROR (Rotate Right)
+ Các cờ bị tác động: C, P, Z, S, O
+ Giống với lệnh SHR
- Chú ý:
-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101
2. HỆ LỆNH ASSEMBLER
55
2.3.4. Nhóm lệnh làm việc với xâu ký tự.
Lệnh 1: MOVSB|MOVSW
- Cú pháp: MOVSB/MOVSW
- Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng Word) từ
vùng nhớ trỏ bởi DS:SI đến vùng nhớ trỏ bởi ES:DI
Lệnh 2: LODSB|LODSW
- Cú pháp: LODSB/LODSW
- Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng Word) từ
vùng nhớ trỏ bởi DS:SI đến vùng nhớ trỏ bởi AL/AX
2. HỆ LỆNH ASSEMBLER
56
Lệnh 3: STOSB|STOSW
- Cú pháp: STOSB/STOSW
- Chức năng: Chuyển các ký tự xâu theo từng byte (hoặc từng
Word) từ vùng nhớ trỏ bởi AL/AX đến vùng nhớ trỏ bởi DS:DI
Lệnh 4: CMPSB|CMPSW
- Cú pháp: CMPSB/CMPSW
- Chức năng: So sánh các ký tự của 2 xâu theo từng byte giữa 2
vùng nhớ DS:SI và ES:DI.
2. HỆ LỆNH ASSEMBLER
57
2.3.5. Nhóm lệnh rẽ nhánh
Lệnh 1: CALL
- Cú pháp: CALL Tên_CTCon
- Chức năng: Gọi thực hiện chương trình con (có tên Tên_CTCon )
Lệnh 2: RET
- Cú pháp: RET
- Chức năng: Từ chương trình con quay về đoạn chương trình đã gọi nó.
2. HỆ LỆNH ASSEMBLER
58
Lệnh 3: INT
- Cú pháp: INT n
- Chức năng: Gọi một chương trình con phục vụ ngắt của hệ thống.
Lệnh 4: IRET
- Cú pháp: IRET
- Chức năng: Trở về đoạn chương trình đã kích hoặt nó từ chương trình
con phục vụ ngắt.
- Chú ý: n là số ngắt
- Ví dụ: int 21h
2. HỆ LỆNH ASSEMBLER
59
Lệnh 5: JMP (jump)
- Cú pháp: JMP nhãn (hoặc địa chỉ Seg:Offset)
- Chức năng: Nhảy không điều kiện tới 1 nhãn.
- Chú ý: Bước nhảy của lệnh JMP<=64K
2. HỆ LỆNH ASSEMBLER
60
Lệnh 6: Tập các lệnh nhảy có điều kiện
- Cú pháp: Cmp DST,SRC
Tên_lệnh nhãn
- Bao gồm các lệnh:
Tên_lệnh Ý nghĩa
JB Jump below Nhảy nếu DST nhỏ hơn SRC
Jnae Jump not above and
equal
Nhảy nếu không lơn hơn hay bằng
Jbe/Jna
Je
Jne
Ja
Jae
2. HỆ LỆNH ASSEMBLER
61
Lệnh 6: Tập các lệnh nhảy có điều kiện (tiếp)
- Với số có dấu:
Tên_lệnh Ý nghĩa
Jl Jump less Nhảy nếu DST nhỏ hơn SRC
Jle
Jg Jump greater Nhảy nếu DST lớn hơn SRC
2. HỆ LỆNH ASSEMBLER
62
Lệnh 7: Lệnh nhảy theo trạng thái bit cờ.
- Cú pháp: JC Nhãn Nếu cờ C=1 thì nhảy tới Nhãn
JNC Nhãn Nếu cờ C=0 thì nhảy tới Nhãn
- Chú ý: Tương tự với các lệnh JZ, JNZ, JS, JNS
2. HỆ LỆNH ASSEMBLER
63
Lệnh 8: LOOP
- Chú ý: Thực hiện lặp các công việc nằm giữa Nhãn và LOOP cho đến
khi giá trị của CX=0, sau mỗi lần lặp CX tự động giảm đi 1.
Cú pháp: Mov cx, số_lần_lặp
Nhãn:
;Khối lệnh ASM
LOOP Nhãn
2. HỆ LỆNH ASSEMBLER
64
2.3.6. Nhóm lệnh làm việc với các bit cờ.
Lệnh 1: CLC (Clear Carry)
- Cú pháp: CLC
- Chức năng: Gán giá trị cờ C = 0
Lệnh 2: STC (Set Carry)
- Cú pháp: STC
- Chức năng: Gán giá trị cờ C = 1
2. HỆ LỆNH ASSEMBLER
65
2. HỆ LỆNH ASSEMBLER
Lệnh 3: CMC
- Cú pháp: CMC
- Chức năng: Đảo bit cờ C
Lệnh 4: CLI (Clear Interrupt flag)
- Cú pháp: CLI
- Chức năng: Gán cờ I = 0 (cấm ngắt cứng – trừ ngắt không che).
Lệnh 5: STI (Set Interrupt flag)
- Cú pháp: STI
- Chức năng: Gán cờ I = 1 (cho phép ngắt với ngắt cứng).
66
NỘI DUNG HỌC PHẦN
I NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
1. Ngôn ngữ ASM
2. Hệ lệnh ASM
3. Các lệnh điều khiển khi dịch chương trình ASM
4. Macro và Chương trình con
5. Chương trình ASM dạng COM
67
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
Các lệnh điều khiển Segment đơn giản
- Bao gồm:
.MODEL
.STACK
.DATA
.CODE
68
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
- Chức năng: Báo cho chương trình dịch của ASM biết để xác lập một
vùng nhớ RAM thích hợp cho chương trình.
3.1. Lệnh điều khiển .MODEL
- Cú pháp: .MODEL
Kiểu Ý nghĩa
Tiny Vùng nhớ dành cho CODE+DATA<=64Kb
Small CODE<=64Kb; DATA<=64Kb
Compact CODE=64Kb
Medium CODE>=64Kb; DATA<=64Kb
Large CODE>=64Kb; DATA>=64Kb nhưng 1 mảng <=64Kb
Huge CODE>=64Kb; DATA>=64Kb
- Trong đó nhận các giá trị sau:
69
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
- Chức năng: Báo cho chương trình dịch ASM biết để xác lập một vùng
nhớ RAM cho stack.
3.2. Lệnh điều khiển .STACK
- Cú pháp: .STACK
- Trong đó tính theo byte
- Ví dụ:
.STACK 100h ; 100h=256 byte
70
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
- Chức năng: Báo cho ASM biết để xác lập một vùng nhớ RAM dành cho
dữ liệu (các biến trong chương trình).
3.3. Lệnh điều khiển .DATA
- Cú pháp:
.DATA
;Khai báo biến (biến số, biến xâu, biến trường số)
71
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
a) Khai báo biến số:
3.4. Lệnh điều khiển .DATA (tiếp)
- Trong đó có thể là: db (1 byte)
dw (2 byte)
dd (4 byte)
dp (6 byte)
dq (8 byte)
dt (10 byte)
- Giá trị ban đầu có thể là một hằng hoặc „?‟ nếu chưa muốn gán.
- Ví dụ:
.DATA
X db 15
Y dw ?
72
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
b) Khai báo biến xâu:
3.4. Lệnh điều khiển .DATA (tiếp)
- Dạng 1: db
Ví dụ: strName DB „HA$‟
- Dạng 2: db
Ví dụ: strName1 DB 100h dup(„A‟)
strName2 DB 100h dup(?)
Chú ý: Nếu trong chương trình