LOGO
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
Phạm Công Hòa GV: Tel: 091.552.9889 Email: conghoaf1@gmail.com
NỘI DUNG HỌC PHẦN
NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
I
LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASM
II
III LẬP TRÌNH HỆ THỐNG
2
NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
I
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
3
1. NGÔN NGỮ ASM
- Nội dung:
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
4
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:
- 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
5
Tốc độ nhanh. Tiết kiệm vùng nhớ.
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).
- Sử dụng EMU8086
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
6
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”).
7
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
- Cấu trúc chương trình ASM dạng đơn giản:
;Khai báo biến
;Thân chương trình
Nhãn: [Các chương trình con] (nếu có)
[Phần khai báo MACRO, STRUC, RECORD và UNION] (nếu có)
.MODEL
.STACK <Độ_lớn_ngăn_xếp>
.DATA
.CODE
END Nhãn
8
1. NGÔN NGỮ ASM
s1 DB 'Hello world!$‟
Mov ax, @data Mov ds, ax Lea dx, s1 Mov ah,9 Int 21h Mov ah,4ch Int 21h
- 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. .MODEL small .STACK 100h .DATA .CODE Main: End Main
9
NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
I
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
10
2. HỆ LỆNH ASSEMBLER
- Nội dung:
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
11
2. HỆ LỆNH ASSEMBLER
2.1. Hỗ trợ của hệ thống cho lập trình ASM
2.1.1. Thanh ghi (Registers)
CPU
12
2. HỆ LỆNH ASSEMBLER
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
13
2. HỆ LỆNH ASSEMBLER
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)
BX (Base register)
CX (Counter regigter)
3 mode truy nhập: AH, AL, AX
DX (Data regigter)
SI
DI
1 mode truy nhập
BP
SP
*Người lập trình chỉ được phép dùng 7 thanh ghi đầu để thay cho biến.
14
2. HỆ LỆNH ASSEMBLER
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
15
2. HỆ LỆNH ASSEMBLER
Một số ý nghĩa chung của các thanh ghi:
• 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.
16
• 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
• 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.
17
• 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
2.1.2. Cách thể hiện địa chỉ của một ô nhớ.
(1 segment = 64K)
• Dạng Logic: Địa chỉ 1 ô nhớ = Segment : Offset - 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 vật lý:
Địa chỉ 1 ô nhớ = Segment * 16 + Offset
18
2. HỆ LỆNH ASSEMBLER
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
19
2. HỆ LỆNH ASSEMBLER
• Hàm số 2: Hiện 1 ký tự ra màn hình tại vị trí con trỏ.
- Cách 1:
Mov al, Mã_ASCII_của_ký_tự Mov ah, 0eh Int 10h
- Cách 2:
Mov al, Mã_ASCII_của_ký_tự Mov ah, 2 Int 21h
20
2. HỆ LỆNH ASSEMBLER
• 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
21
2. HỆ LỆNH ASSEMBLER
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ư:
Addition Multiplication Move …
Add Mul Mov …
22
2. HỆ LỆNH ASSEMBLER
- 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 Thanh ghi Biến nhớ
DST (Destination) REG (Register) Mem (Memory)
Hằng số dữ liệu
Data
Thanh ghi Segment
SegReg (Segment Register)
23
2. HỆ LỆNH ASSEMBLER
2.3. Hệ thống lệnh ASM
- Phân loại lệnh:
Các lệnh di chuyển dữ liệu.
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ờ.
24
2. HỆ LỆNH ASSEMBLER
MOV DST, SRC
2.3.1. Các lệnh di chuyển dữ liệu. Lệnh 1: MOV - Cú pháp: - Chức năng: Đưa giá trị toán hạng nguồn SRC vào toán hạng đích DST.
- 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
25
2. HỆ LỆNH ASSEMBLER
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:
26
Mov reg, mem1 Mov mem2, reg
2. HỆ LỆNH ASSEMBLER
Lệnh 2: PUSH
- Cú pháp: PUSH DST
Lệnh 3: POP
- Chức năng: Đưa 2 byte của DST vào đỉnh STACK
- Cú pháp: POP DST
27
- Chức năng: Lấy 2 byte của đỉnh STACK và đưa vào DST
2. HỆ LỆNH ASSEMBLER
(Sau lệnh Pop AX, trong stack chỉ còn chứa giá trị 158)
28
2. HỆ LỆNH ASSEMBLER
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.
29
- Chú ý: DST và SRC có thể là : Reg1, Reg2 Reg, Mem
2. HỆ LỆNH ASSEMBLER
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.
30
- 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
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.
31
- Chú ý: Về địa chỉ cổng giống với lệnh IN
2. HỆ LỆNH ASSEMBLER
Lệnh 7: LEA
- Cú pháp: LEA Reg, Value
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.
32
- Chức năng: Lấy địa chỉ offset của biến đưa vào thanh ghi Reg.
2. HỆ LỆNH ASSEMBLER
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: +,-,*,/,…
33
- 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
Lệnh 1: ADD
- 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. - Chú ý:
(Bảng*)
+ Các toán hạng sử dụng trong hàm có thể là:
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
+ Các cờ bị tác động: C, P, A, Z, S, O
34
2. HỆ LỆNH ASSEMBLER
Lệnh 2: ADC
- Chức năng: Cộng giá trị 2 toán hạng và giá trị cờ.
- Cú pháp: ADC DST, SRC
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
35
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
Lệnh 3: INC
- Chức năng: Tăng giá trị của toán hạng DST lên 1
- Cú pháp: INC DST
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
36
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (mem)
2. HỆ LỆNH ASSEMBLER
Lệnh 4: SUB
- Chức năng: Phép trừ DTS – SRC (DST DST – SRC)
- Cú pháp: SUB DST, SRC
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
37
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
Lệnh 5: DEC
- Chức năng: Trừ giá trị toán hạng DST đi 1
- Cú pháp: DEC DST
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
38
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).
2. HỆ LỆNH ASSEMBLER
Lệnh 6: NEG
- Chức năng: Đổi dấu giá trị của toán hạng.
- Cú pháp: NEG DST
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
39
+ Toán hạng có thể là thanh ghi (Reg) hoặc biến nhớ (Mem).
2. HỆ LỆNH ASSEMBLER
Lệnh 7: CMP
- Chức năng: So sánh nội dung 2 toán hạng và dựng cờ.
- Cú pháp: CMP DST, SRC
- Chú ý:
+ Các cờ bị tác động: C, P, A, Z, S, O
+ Kết quả:
Nếu DST
thì cờ C = 1 thì cờ C = 0 thì cờ Z = 1 thì cờ Z = 0
40
+ (Bảng*)
2. HỆ LỆNH ASSEMBLER
Lệnh 8: MUL|IMUL - 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.
toán hạng nguồn SRC
là 16 bit
là DX:AX
+ 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 thì kết quả (DX:AX=AX*SRC)
41
- Chú ý:
2. HỆ LỆNH ASSEMBLER
Lệnh 9: DIV|IDIV
- 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). - Chú ý:
42
+ 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
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ờ.
43
2. HỆ LỆNH ASSEMBLER
Lệnh 1: AND
- 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.
al = 0101 1010 bl = 1001 0110
cho kết quả:
0001 0010
- Ví dụ: AND al,bl
- Chú ý:
44
+ (Bảng*) + Các cờ bị tác động: P, Z, S
2. HỆ LỆNH ASSEMBLER
Lệnh 2: OR
- 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.
al = 1010 0110 bl = 0101 0110
cho kết quả: 1111 0110
- Ví dụ: OR al,bl
- Chú ý:
45
+ (Bảng*) + Các cờ bị tác động: P, Z, S
2. HỆ LỆNH ASSEMBLER
Lệnh 3: XOR
- 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.
al = 1010 0110 bl = 0101 0110
cho kết quả:
kq= 1111 0000
- Ví dụ: XOR al,bl
- Chú ý:
46
+ (Bảng*) + Các cờ bị tác động: P, Z, S
2. HỆ LỆNH ASSEMBLER
Ví dụ: Thực hiện gán giá trị của thanh ghi AX bằng 0 mov ax, 0 sub ax, ax and ax, 0 xor ax, ax
- Cách 1: - Cách 2: - Cách 3: - Cách 4:
47
2. HỆ LỆNH ASSEMBLER
Lệnh 4: SHL (Shift Left)
- Chức năng: Dịch trái toán hạng count bit.
- Cú pháp: SHL DST, count
- Chú ý:
Mov cl, 4 SHL ax, cl
48
+ 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: + 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)
2. HỆ LỆNH ASSEMBLER
49
2. HỆ LỆNH ASSEMBLER
Lệnh 5: SHR (Shift Right)
- Chức năng: Dịch phải toán hạng count bit.
- Cú pháp: SHR DST, count
- Chú ý:
Mov cl, 4 SHR ax, cl
50
+ 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: + 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
2. HỆ LỆNH ASSEMBLER
Lệnh 6: SAR (Shift Arithmetic Right )
- 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.
+ Giống với lệnh SHR
- Chú ý:
+ Các cờ bị tác động: C, P, Z, S, O
51
-Ví dụ: dịch 1 lần: 1000 1010 -> 0100 0101
2. HỆ LỆNH ASSEMBLER
Lệnh 7: ROL (Rotate Left)
- 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.
+ Giống với lệnh SHR
- Chú ý:
+ Các cờ bị tác động: C, P, Z, S, O
52
-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101
2. HỆ LỆNH ASSEMBLER
53
2. HỆ LỆNH ASSEMBLER
Lệnh 8: ROR (Rotate Right)
- 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.
+ Giống với lệnh SHR
- Chú ý:
+ Các cờ bị tác động: C, P, Z, S, O
54
-Ví dụ: dịch 1 lần: 1000 1010 -> 0001 0101
2. HỆ LỆNH ASSEMBLER
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
Lệnh 2: 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 ES:DI
- Cú pháp: LODSB/LODSW
55
- 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
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.
56
2. HỆ LỆNH ASSEMBLER
2.3.5. Nhóm lệnh rẽ nhánh Lệnh 1: CALL
- Cú pháp: CALL Tên_CTCon
Lệnh 2: RET
- Chức năng: Gọi thực hiện chương trình con (có tên Tên_CTCon )
- Chức năng: Từ chương trình con quay về đoạn chương trình đã gọi nó.
57
- Cú pháp: RET
2. HỆ LỆNH ASSEMBLER
Lệnh 3: INT
- Chức năng: Gọi một chương trình con phục vụ ngắt của hệ thống.
- Cú pháp: INT n
- Chú ý: n là số ngắt
Lệnh 4: IRET
- Ví dụ: int 21h
- Cú pháp: IRET
58
- 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.
2. HỆ LỆNH ASSEMBLER
Lệnh 5: JMP (jump)
- Chức năng: Nhảy không điều kiện tới 1 nhãn.
- Cú pháp: JMP nhãn (hoặc địa chỉ Seg:Offset)
59
- Chú ý: Bước nhảy của lệnh JMP<=64K
2. HỆ LỆNH ASSEMBLER
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:
Ý nghĩa
Tên_lệnh
Jump below
Nhảy nếu DST nhỏ hơn SRC
JB
Nhảy nếu không lơn hơn hay bằng
Jnae
Jump not above and equal
Jbe/Jna …
…
Je
…
…
Jne
…
…
Ja
…
…
Jae
…
…
60
2. HỆ LỆNH ASSEMBLER
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
61
2. HỆ LỆNH ASSEMBLER
Nếu cờ C=1 thì nhảy tới Nhãn Nếu cờ C=0 thì nhảy tới Nhãn
Lệnh 7: Lệnh nhảy theo trạng thái bit cờ. - Cú pháp: JC Nhãn JNC Nhãn
62
- Chú ý: Tương tự với các lệnh JZ, JNZ, JS, JNS
2. HỆ LỆNH ASSEMBLER
Lệnh 8: LOOP
Cú pháp:
;Khối lệnh ASM
Mov cx, số_lần_lặp Nhãn: LOOP Nhãn
63
- 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.
2. HỆ LỆNH ASSEMBLER
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
Lệnh 2: STC (Set Carry)
- Chức năng: Gán giá trị cờ C = 0
- Chức năng: Gán giá trị cờ C = 1
64
- Cú pháp: STC
2. HỆ LỆNH ASSEMBLER
Lệnh 3: CMC
- Chức năng: Đảo bit cờ C
Lệnh 4: CLI (Clear Interrupt flag)
- Cú pháp: CMC
- Cú pháp: CLI
Lệnh 5: STI (Set Interrupt flag)
- Cú pháp: STI
- Chức năng: Gán cờ I = 0 (cấm ngắt cứng – trừ ngắt không che).
65
- Chức năng: Gán cờ I = 1 (cho phép ngắt với ngắt cứng).
NỘI DUNG HỌC PHẦN
NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
I
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
66
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
67
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.1. Lệnh điều khiển .MODEL
- 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.
.MODEL
- Cú pháp:
- Trong đó
Kiểu
Ý nghĩa
Tiny
Vùng nhớ dành cho CODE+DATA<=64Kb
Small
CODE<=64Kb; DATA<=64Kb
Compact
CODE<=64Kb; DATA>=64Kb
Medium
CODE>=64Kb; DATA<=64Kb
Large
CODE>=64Kb; DATA>=64Kb nhưng 1 mảng <=64Kb
Huge
CODE>=64Kb; DATA>=64Kb
68
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.2. Lệnh điều khiển .STACK
- 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.
.STACK <Độ_lớn >
- Cú pháp:
- Trong đó <Độ_lớn> tính theo byte
.STACK 100h ; 100h=256 byte
69
- Ví dụ:
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.3. Lệnh điều khiển .DATA
- 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).
.DATA
70
- Cú pháp: ;Khai báo biến (biến số, biến xâu, biến trường số)
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.4. Lệnh điều khiển .DATA (tiếp) a) Khai báo biến số:
- Trong đó
.DATA
X db 15 Y dw ?
71
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.4. Lệnh điều khiển .DATA (tiếp) b) Khai báo biến xâu:
- Dạng 1: Ví dụ: strName DB „HA$‟
- Dạng 2: Ví dụ: strName1 DB 100h dup(„A‟) strName2 DB 100h dup(?)
72
Chú ý: Nếu trong chương trình có khai báo .DATA (và có khai báo biến) thì người lập trình ASM phải đưa địa chỉ Segment dữ liệu vào thanh ghi DS nhờ 2 lệnh sau: Mov AX, @data Mov DS, AX
3. CÁC LỆNH ĐIỀU KHIỂN KHI DỊCH CHƯƠNG TRÌNH
3.5. Lệnh điều khiển .CODE
- Chức năng: Báo cho chương trình dịch ASM biết để xác lập vùng nhớ RAM cho phần mã lệnh chương trình.
; Thân chương trình
- Cú pháp:
.CODE
Nhãn_chương_trình: END Nhãn_chương_trình
73
Bài tập thực hành phần 1
74
Bài tập thực hành phần 1
Ví dụ 1: Viết chương trình thuần túy asm thực hiện các công việc sau:
75
- Hiện xâu „Hello World!‟ ra màn hình
Bài tập thực hành phần 1
Ví dụ 2: Viết chương trình thuần túy asm thực hiện các công việc sau:
- Hiện 1 số nguyên nằm trong thanh ghi ax ra màn hình dạng nhị phân Ví dụ: AX chứa giá trị 5, hiện thị trên màn hình
76
+ Dạng đầy đủ: 0000 0000 0000 0101 + Dạng rút gọn: 101
NỘI DUNG HỌC PHẦN
NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH
I
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
77
4. MACRO và CHƯƠNG TRÌNH CON
4.1. Macro
- Ý nghĩa: Cho phép người lập trình ASM tạo ra các lệnh mới trên cơ sở sử dụng các lệnh chuẩn ASM.
Tạo Macro
- Có thể viết các macro trong các tệp tin độc lập.
;Bảo vệ các thanh ghi mà thân macro sẽ phá vỡ. ;Các lệnh ASM. ;Hồi phục lại các lệnh Macro mà thân chương trình đã phá vỡ.
- Cú pháp:
78
4. MACRO và CHƯƠNG TRÌNH CON
Sử dụng Macro
INCLUDE Ổ_đĩa:\Đường_dẫn\Tên_tệp_chứa_Macro
79
- Sau khi đã tạo ra một macro ta khai báo chèn macro trong thân chương trình ASM của ta bằng lệnh INCLUDE với cú pháp như sau: -Ví dụ: Include C:\TASM\lib1.asm - Thông thường dòng lệnh chèn macro được đặt ở đầu các chương trình ASM.
4. MACRO và CHƯƠNG TRÌNH CON
- Ví dụ 1: Tạo 1 macro cho phép xóa màn hình. (tương đương hàm clrscr() trong C/C++)
Một số ví dụ
Mov ah, 0fh Int 10h => Giá trị Mode màn hình sẽ được đưa vào thanh ghi AL
80
+ Cơ chế của màn hình ở chế độ text: Mỗi lần đặt Mode cho màn hình thì màn hình sẽ bị xóa toán bộ và con trỏ đứng ở vị trí góc trên bên trái. • Lấy Mode màn hình (Get mode): • Đặt Mode màn hình (Set mode): Mov AL, số_mode Mov AH,0h Int 10h
4. MACRO và CHƯƠNG TRÌNH CON
4.1. Macro (tiếp)
81
+ Viết macro: Đặt Macro vào tệp tin LIB1.asm clrscr MACRO Push AX Mov AH,0Fh Int 10h Mov AH,0h Int 10h Pop AX ENDM
4. MACRO và CHƯƠNG TRÌNH CON
- Ví dụ 2: Tạo 1 macro cho phép hiện 1 xâu ký tự ra màn hình.
+ Viết macro: Đặt Macro vào tệp tin LIB1.asm
Push AX DX Lea DX, xau Mov AH, 9 Int 21h Pop DX AX
82
Hien_xau MACRO xau ENDM
4. MACRO và CHƯƠNG TRÌNH CON
4.2. Chương trình con
83
- Khái niệm: Đoạn chương trình độc lập giải quyết một nhiệm vụ nào đó. - Ý nghĩa: + Làm cho chương trình có cấu trúc. + Tiết kiệm bộ nhớ. + Giảm mã lệnh, thuận tiện cho việc sửa lỗi.
4. MACRO và CHƯƠNG TRÌNH CON
4.2.1. Cơ chế thực hiện khi một chương trình con được gọi:
- Khi một chương trình con được gọi, chương trình dịch sẽ thực hiện lần lượt các bước sau: • Bước 1: Đưa tham số thực sự vào STACK. • Bước 2: Địa chỉ lệnh tiếp theo được đưa vào STACK. • Bước 3: Chương trình dịch đưa địa chỉ đầu của chương trình con vào thanh ghi CS:IP và chuyển sang chương trình con. • Bước 4: Thực hiện các lệnh trong chương trình con cho đến khi gặp lệnh return thì vào STACK lấy các lệnh tiếp theo trong thanh ghi CS:IP và quay về nơi đã gọi chương trình con. • Bước 5: Tiếp tục các lệnh trong chương trình chính.
84
4. MACRO và CHƯƠNG TRÌNH CON
4.2.2. Cú pháp một chương trình con ASM
PROC [Near|Far]
85
4. MACRO và CHƯƠNG TRÌNH CON
4.2.2. Cú pháp một chương trình con ASM (tiếp)
+ Near: (Mặc định) Mã lệnh chương trình con và chương
+ Phần MODEL trong chương trình chính sẽ cho biết
86
- Trong đó: trình chính cùng nằm trên 1 Segment, khác nhau Offset. + Far: Mã lệnh chương trình con và chương trình chính không cùng nằm trên 1 Segment. Địa chỉ vùng nhớ chưa mã lệnh chương trình con và chương trình chính khác nhau cả Segment và Offset. chương trình con là Near hay Far: tiny, small, compact medium, large, huge .MODEL .MODEL => Near => Far
4. MACRO và CHƯƠNG TRÌNH CON
4.2.3. Một số ví dụ Ví dụ 1: Tạo 1 chương trình con cho phép nhận 1 giá trị số nguyên từ bàn phím. Kết thúc nhập giá trị số bằng phím Enter.
- Chú ý: + Không cho phép vào sai và sửa. + Giá trị số nguyên nhận được đặt trong thanh ghi AX.
- Thuật toán: • Kiểm tra ký tự đầu tiên Nếu là ”-” thì biến cờ dấu = 1, khác “-“ thì biến cờ dấu = 0. • Các ký tự tiếp theo: Nhận từng ký tự và đưa vào AL (dạng mã ASCII), dùng lệnh SUB để được giá trị. • Số nhận được sẽ = số vừa vào + phần số trước đưa vào nhân với 10.
*) Soạn thảo lệnh và đặt trong tệp lib2.asm
87
4. MACRO và CHƯƠNG TRÌNH CON
Ví dụ 2: Tạo 1 chương trình con cho phép hiện giá trị có trong thanh ghi AX ra màn hình dạng cơ số 10.
- Thuật toán: • Nếu AX chứa số nguyên dương: Chia số trong AX cho 10, đưa phần dư vào STACK và phần thương vào AX cho đến khi AX=0 thì dừng. Lấy từng chữ số lưu trong STACK và hiện ra màn hình. • Nếu AX chứa số âm: Đổi dấu AX và hiện giống phần nguyên dương.
*) Soạn thảo lệnh và đặt trong tệp lib2.asm
88
Bài tập thực hành phần 2
89
Bài tập thực hành phần 2
Bài tập 1: Viết chương trình thuần túy asm thực hiện các công việc sau:
- Nhập từ bàn phím 2 số nguyên.
- Kiểm tra và hiện giá trị nhỏ nhất trong 2 số vừa nhập.
*) Soạn thảo lệnh và đặt trong tệp tin baitap01.asm
90
Bài tập thực hành phần 2
Mời nhập giá trị b = 5 Tổng của 10 và 5 là: 15 Có tiếp tục không (c/k?):
Bài tập 2: Nhập từ bàn phím 2 số nguyên a và b. Tính tổng 2 số và hiện ra màn hình. Chương trình khi thực hiện có dạng: Mời nhập giá trị a = 10 Nếu chọn „c‟ thì tiếp tục thực hiện chương trình
*) Soạn thảo lệnh và đặt trong tệp tin baitap02.asm
91
Bài tập thực hành phần 2
Bài tập 3: Nhập từ bàn phím 1 số nguyên a (1<=a<=7). Tính giai thừa của a và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình
Mời nhập giá trị a = 5 Giai thừa của 5 là: 120 Có tiếp tục không (c/k?):
*) Soạn thảo lệnh và đặt trong tệp tin baitap03.asm
92
Bài tập thực hành phần 2
Mời nhập giá trị N = 10 Tổng từ 1 đến 10 là : 55 Có tiếp tục không (c/k?):
Bài tập 4: Nhập từ bàn phím 1 số nguyên N. Tính tổng các số nằm trong đoạn [1..N] và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình
*) Soạn thảo lệnh và đặt trong tệp tin baitap04.asm
93
Bài tập thực hành phần 2
Nhập số lượng phần tử của dãy N= 3 Số thứ 1 : 6 Số thứ 2 : -3 Số thứ 3 : -7 Tổng các số âm là: -10 Có tiếp tục không (c/k?):
Bài tập 5: Nhập từ bàn phím 1 dãy N số nguyên. Tính tổng các số âm có trong dãy và hiện kết quả ra màn hình. Chương trình khi thực hiện có dạng: Nếu chọn „c‟ thì tiếp tục thực hiện chương trình
*) Soạn thảo lệnh và đặt trong tệp tin baitap05.asm
94
Q & A
95