1. Tập thanh ghi: 4 thanh ghi đoạn: • CS (Code Segment): thanh ghi đoạn lệnh • DS (Data Segment): thanh ghi đoạn dữ liệu • SS (Stack Segment): thanh ghi đoạn ngăn xếp • ES (Extra Segment): thanh ghi đoạn dữ liệu phụ 3 thanh ghi con trỏ: • IP (Instruction Pointer): thanh ghi con trỏ lệnh • SP (Stack Pointer): con trỏ ngăn xếp • BP (Base Pointer): thanh ghi con trỏ cơ sở 4 thanh ghi dữ liệu: • AX (Accumulator): thanh chứa thanh ghi tích lũy • BX (Base): thanh ghi cơ sở • CX (Count): thanh ghi đếm • DX (Data): thanh ghi dữ liệu Mỗi thanh ghi này đều có thể được chia ra thành 2 nửa có khả năng sử dụng độc lập. Thanh ghi cờ ________________________________________
Trang 14 thanh ghi đoạn:
• CS (Code Segment): thanh ghi đoạn lệnh
• DS (Data Segment): thanh ghi đoạn dữ liệu
• SS (Stack Segment): thanh ghi đoạn ngăn xếp
• ES (Extra Segment): thanh ghi đoạn dữ liệu phụ
3 thanh ghi con trỏ:
• IP (Instruction Pointer): thanh ghi con trỏ lệnh
• SP (Stack Pointer): con trỏ ngăn xếp
• BP (Base Pointer): thanh ghi con trỏ cơ sở
4 thanh ghi dữ liệu:
• AX (Accumulator): thanh chứa - thanh ghi tích lũy
• BX (Base): thanh ghi cơ sở
• CX (Count): thanh ghi đếm
• DX (Data): thanh ghi dữ liệu
Mỗi thanh ghi này đều có thể được chia ra thành 2 nửa có khả năng sử dụng độc lập
Thanh ghi cờ
2 Các bước lập trình
Các bước lập trình hợp ngữ cũng giống như các bước lập trình trong ngôn ngữ bậc cao, cũng gồm những bước như sau:
• Bước 1: Phát biểu bài toán
• Bước 2: Xây dựng thuật giải
Trang 2• Bước 3: Viết mã chương trình
• Bước 4: Dịch và sửa lỗi cú pháp
• Bước 5: Chạy thử và hiệu chỉnh chương trình
3 Cấu trúc chung của lập trình hợp ngữ
• toán hạng đích phải đủ để nhận dữ liệu
• không được sao chép hằng vào thanh ghi đoạn
• 2 toán hạng không đồng thời là vùng nhớ hoặc thanh ghi đoạn
MOV DX, OFFSET MSG ; DX <- địa chỉ ô (MSG)
MOV DX,SEG MSG ; DX <- địa chỉ đoạn (MSG)
4.2 Lệnh XCHG
- Cú pháp: XCHG <đích>,<nguồn>
- Ý nghĩa: lệnh này dùng để hoán chuyển dữ liệu của 2 toán hạng đích và nguồn
- Lưu ý:
• hai toán hạng có thể là thanh ghi hay vùng nhớ cùng kích thước
• không được sao chép hằng vào thanh ghi đoạn
• 2 toán hạng không đồng thời là vùng nhớ
Trang 3• kết quả chứa trong toán hạng đích
• toán hạng nguồn có thể là hằng, thanh ghi hoặc vùng nhớ
• toán hạng đích có thể là thanh ghi hoặc vùng nhớ
• 2 toán hạng không đồng thời là vùng nhớ
• 2 toán hạng có thể có dấu (bù 2) hoặc không dấu
- Ví dụ:
ADD AX,BX ; AX <- AX+BX
ADD AX,vungnho ; AX <- vungnho
ADD AX,2 ; AX <- AX+2
SUB AX,BX ; AX <- AX-BX
SUB AX,vungnho ; AX <- AX-BX
SUB AX,2 ; AX <- AX-2
4.4 Lệnh INC và DEC
- Cú pháp:
INC <đích>
DEC <đích>
- Ý nghĩa: 2 lệnh này dùng để tăng/giảm nội dung trong toán hạng đích
- Lưu ý: toán hạng đích có thể là thanh ghi hoặc vùng nhớ
Trang 4- Ý nghĩa: lệnh này dùng để đổi dấu (dương thành âm, âm thành dương) của toán hạng đích
- Lưu ý:
• toán hạng đích có thể là thanh ghi hoặc vùng nhớ
• nếu toán hạn đích là giá trị âm nhỏ nhất (-128 hay -32768) thì sau lệnh này sẽ không thay đổi giá trị
MOV AH,1 ; chọn chức năng 1
INT 21h ; chờ người sử dụng nhập vào 1 ký tự và lưu vào AL
• AH = 2 : ngắt 21h thực hiện xuất ký tự chứa trong thanh ghi DL ra màn hình
MOV AH,2 ; chọn chức năng 2
MOV DL,'A' ; chọn ký tự hiển thị là A
Trang 5• AH = 4Ch : ngắt 21h thực hiện việc kết thúc chương trình và trả điều khiển về cho hệ điều hành Lệnh viết như sau:
MOV AH,4Ch ; chon chuc nang 4Ch
INT 21h ; ket thuc chuong trinh
- Địa chỉ tương đối có dạng: <địa chỉ đoạn>:<địa chỉ ô>
- Muốn đổi từ địa chỉ tương đối sang địa chỉ tuyệt đối thì ta áp dụng công thức:
Địa chỉ tuyệt đối = địa chỉ đoạn * F + địa chỉ ô
Vậy địa chỉ tuyệt đối = A51h * 16 + CD90h = A510h + CD90h = 172A0h
2 Tính địa chỉ tương đối tương ứng với địa chỉ tương đối A25h:CD09h
Gỉai: tương tự cách tính trên
3 Với địa chỉ tuyệt đối 4A37Bh, hãy tính:
a Địa chỉ ô tương ứng với đoạn 40FFh
b Địa chỉ đoạn tương ứng với ô 123Bh
Trang 6Như vậy ta kết luận ở địa chỉ 2 ta có nội dung là EF
5 Gỉa sử chuỗi "12A45" được lưu trữ trong bộ nhớ từ địa chỉ 0 đến 4 Hãy cho biết nội dung của vùng nhớ (dạng thập lục) từ địa chỉ 0 đến 4
Gỉai: tương tự như câu 4: 05h, 04h, 0Ah, 02h, 01h
6 Viết lệnh định nghĩa từ WORDV có trị -1
Gỉai:
WORDV DB FFd
7 Viết lệnh định nghĩa hằng MSG có trị là 'DAY LÀ THONG BAO'
Gỉai:
MSG EQU 'DAY LA THONG BAO'
8 Viết nhóm lệnh tương đương với các lệnh gán như sau:
c A = 10 - A
NEG A ; A <- (-A) ADD A,10 ; A <- (-A) + 10
d A = B - A * 2
MOV AX,A ; AX <- A
e C = 2 * B - 3 * A
MOV AX,B ; AX <- B
Trang 7MOV C,AX ; C <- 2B MOV AX,A ; AX <- A ADD AX,AX ; AX <- A + A
ADD AX,AX ; AX <- 2A + A
NEG AX ; AX <- (-3A) ADD C,AX ; C <- 2B + (-3A)
Trang 8Mess db CR,LF,'Hello, world!'
db CR,LF,'Hello, solar system!'
3 Viết chương trình nhập một ký tự và hiển thị ở dòng kế tiếp Kết quả có dạng:
Hay nhap mot ky tu: A
; 1 Khai bao du lieu:
; TBao1 db 13,10,'Hay nhap mot ky tu: $'
; Tbao2 db 13,10,'Ky tu da nhap : $'
; 2 Thuat giai:
; - Hien thi TBao1
Trang 9; - Nhap mot ky tu
; - Dua gia tri vao thanh ghi bl
; - Hien thi TBao2
; - Hien thi KyTu
TBao1 db CR,LF,'Hay nhap mot ky tu: $'
TBao2 db CR,LF,'Ky tu da nhap : $'
; dung sau theo thu tu ma ASCII Ket qua co dang:
; Hay nhap mot ky tu: B
; Ky tu dung truoc : A
Trang 10; Ky tu dung sau : C
; Ten file: bt04.asm
; Ngay tao: 17/03/2009 - 08:37
; Huong dan:
; 1 Khai bao du lieu:
; TBao1 db 13,10,'Hay nhap mot ky tu: $'
; Tbao2 db 13,10,'Ky tu dung truoc : $'
; TBao3 db 13,10,'Ky tu dung sau : $'
; 2 Thuat giai:
; - Hien thi TBao1
; - Nhap mot ky tu
; - Dua gia tri vao thanh ghi bl
; - Hien thi TBao2
; - Giam 1 gia tri
; - Hien thi TBao3
; - Tang 2 gia tri
TBao1 db CR,LF,'Hay nhap mot ky tu: $'
TBao2 db CR,LF,'Ky tu dung truoc : $'
TBao3 db CR,LF,'Ky tu dung sau : $'
Trang 11Nhap ky tu thu nhat: 2
Nhap ky tu thu hai : 3
• Thanh ghi (register)
• Lấy ngay (immediate)
Trang 123 Định vị trực tiếp
- Định vị trực tiếp tương tự như định vị lấy ngay, chỉ khác ở chỗ là địa chỉ của tác tố được ghitrong lệnh thay vì là dữ liệu Nói cách khác, địa chỉ (trong bộ nhớ) của dữ liệu chứa trong lệnh
- Ví dụ:
MOV [7000h],AX ; chuyển giá trị trong thanh ghi AX vào trong
bộ nhớ ở địa chỉ ô là 7000h
- Ngoài ra lệnh trên còn có thể hiểu như sau:
MOV DS:[7000h],AX ; chuyển giá trị trong thanh ghi AX vào
trong bộ nhớ ở địa chỉ ô là 7000h
- Theo cách ghi thứ hai thì ta thấy cách ghi giống như cách thể hiện 1 địa chỉ tương đối
<địa chỉ đoạn>:<địa chỉ ô nhớ> <-> DS:[7000h]
- Cả hai cách ghi đều như nhau, cách thứ nhất nếu không ghi địa chỉ đoạn nào thì ngầm hiểu
là lấy đoạn DS làm chuẩn
4 Định vị gián tiếp thanh ghi
- Trong chế độ định vị này, địa chỉ ô của các tác tố chứa trong các thanh ghi BX, BP, SI hoặc
DI (địa chỉ đoạn chứa trong DS tương ứng với BX, SI, DI và SS tương ứng với BP) Nói cáchkhác địa chỉ tác tố không chứa trực tiếp trong lệnh mà gián tiếp thông qua một thanh ghi
- Ví dụ lệnh sau trừ nội dung DX với vùng nhớ có địa chỉ chứa trong DS:BX
SUB DX,[BX]
SUB DX,BX ; lưu ý này trên sẽ khác với lệnh trên
- Vì lệnh đầu tiên lấy dữ liệu từ vùng nhớ (định vị gián tiếp thanh ghi), lệnh thứ hai lấy dữ liệu từ thanh ghi (định vị thanh ghi)
- Gỉa sử ta có nội dung các thanh ghi và vùng nhớ như sau:
Thanh ghi Nội dung thanh ghi Nội dung vùng nhớ Địa chỉ vùng nhớ
MOV CX,[SI] ; CX <- 20FE
MOV BX,[AX] ; tác tố nguồn không hợp lệ
ADD [SI],[DI] ; lệnh này không hợp lệ
Trang 13- Trong cách định vị này, địa chỉ tác tố được xác định bằng cách cộng nội dung thanh ghi cơ
sở với nội dung thanh ghi chỉ số và có thể cộng với một trị có dấu 8 hoặc 16 bit
Trang 14• Cờ điều khiển: IF (interrupt enable flag), DF (direction flag) và TF (trap flag)
• Cờ trạng thái: CF (carry flag), PF (parity flag), AF (auxiliary flag), ZF (zero flag), SF (sign flag), OF (overflow flag), NT (nested flag), IOPL (input/output privilege level)
- Vị trí của các cờ như sau:
ZF ZR NZ Không/Khác không (Zero/Not zero)
AF AC NA Gởi phụ/Không gởi phụ (Axiliary Carry/Not Axiliary Carry)
PF PE PO Chẵn/Lẻ (Parity Even/Parity Odd)
CF CY NC Gởi/Không gởi (Carry Yes/Not Carry)
a Cờ gởi (CF)
- Có trị 1 khi có nhớ hoặc mượn từ bit MSB (bit cao nhất của dãy số nhị phân), tức bit 7 hoặc
15 hặc 31 trong phép tính cộng và trừ (còn gọi là tràn không dấu), ngược lại là 0 Cờ này có thể thay đổi theo lệnh dịch và quay Nói cách khác, cờ CF có 2 giá trị:
• CF = 1 , khi thực hiện phép tính cộng hay trừ không dấu mà có tràn
• CF = 0 , ngược lại
- Ngoài ra ta còn có 3 lệnh liên quan đến cờ CF
• Lệnh CLC (Clear Carry flag): xoá 0 CF
• Lệnh STC (Set Carry flag): đặt 1 cho CF
• Lệnh CMC (Complement Carry flag): đảo trị của CF
- Ví dụ:
Trang 15- Có trị 1 khi có nhớ hoặc mượn từ bit 3 (tức là nhớ hoặc mượn từ 4 bit thấp), ngược lại là 0
Cờ này thường dùng trong các lệnh với số BCD
Trang 16Phần bài tập của chương này thì gồm có 2 phần:
- Phần xác định dạng chế độ định vị của các câu lệnh
- Các bài tập xác định cờ
Phần 1: Xác định các chế độ định vị của các câu lệnh
1 Xác định kiểu định vị nguồn và đích trong các lệnh sau:
a MOV AX,BX ; b MOV AH,7 ; c MOV [DI],AL ; d MOV AX,[BP] ; e MOV AL,[SI+6]Gỉai:
a MOV AX,BX ; định vị thanh ghi
b MOV AH,7 ; định vị lấy ngay
c MOV [DI],AL ; định vị gián tiếp thanh ghi
d MOV AX,[BP] ; định vị gián tiếp thanh ghi
e MOV AL,[SI+6] ; định vị chỉ số
2 Gỉa sử AX = 0500h ; BX = 1000h ; SI = 1500h ; DI = 2000h ; [DS] = 0100h ; [DS] = 0150h ; [DS] = 0200h ; [DS] = 0250h ; [DS] = 0300h và BETA là biến từ nằm ở địa chỉ ô 1000h Trong các lệnh sau đây, nếu hợp lệ (nếu không hợp lệ, giải thích tại sao), hãy cho biết địa chỉ ô của các tác tố nguồn hoặc thanh ghi và kết quả lưu trong tác tố đích
a MOV DL,SI ; b MOV DI,[DI] ; c ADD AX,[SI] ; d SUB BX,[DI] ; e LEA
BX,BETA[BX] ; f ADD [SI],[DI] ; g ADD BH,[BL] ; h ADD AH,[SI] ; i MOV AX,[BX+DI+BETA]
a MOV [1234h],AL ; định vị trực tiếp
địa chỉ tuyết đối = DS * 16 + 1234h = DF0B4h
b MOV BL,[BX+DI] ; định vị chỉ số cơ sở
địa chỉ tuyết đối = DS * 16 + BX + DI = E24C6h
Trang 17e MOV AL,[BP+DI]+110b ; định vị chỉ số cơ sở
địa chỉ tuyết đối = DS * 16 + BP + DI + 6h = E1BEFh
Phần 2: Xác định cờ
1 Cho biết nội dung của tác tố đích và trị cờ CF, SF, ZF, PF và OF sau khi thực hiện các lệnhsau:
a ADD AX,BX ; với AX = 7FFFh và BX = 1
b SUB AL,BL ; với AL = 1 và BL = FFh
c DEC AL ; với AL = 0
d NEG AL ; với AL = 7Fh
e XCHG AX,BX ; với AX = 1ABCh và BX = 712Ah
f ADD AL,BL ; với AL = 80h và BL = FFh
g SUB AX,BX ; với AX = 0 và BX = 8000h
Đối với lệnh ADD AX,BX thì SF = 1 vì kết quả là 1000 0000 0000 0000b (bit MSB là 1)
- Cờ ZF (cờ không, = 1 khi kết quả là 0, ngược lại = 0 khi kết quả khác 0)
Đối với lệnh ADD AX,BX thì ZF = 0 vì kết quả là một số khác 0
- Cờ PF (cờ chẵn lẽ, = 1 khi tổng số bit 1 là số chẵn, ngược lại = 0 khi tổng số bit 1 là số lẻ))Đối với lệnh ADD AX,BX thì PF = 0 vì kết quả 1000 0000 0000 0000b có tổng số bit 1 là 1 (là số lẻ)
- Cờ OF (cờ tràn, = 1 khi cộng/trừ hai số nguyên cùng dấu mà kết quả cho ra số nguyên khác dấu, ngược lại = 0)
Đối với lệnh ADD AX,BX thì OF = 1 vì kết quả 1000 0000 0000 0000b khác dấu
Các câu khác các anh chị làm tương tự nhưng nhớ là trước khi xác định cờ thì phải đổi ra số nhị phân sau đó thực hiện phép toán rồi mới xác định cờ
2 Cho biết kết quả sau khi thực hiện lệnh ADD AX,BX và trạng thái tràn (có dấu hoặc khôngdấu) có xảy ra không với:
Đối với bài này các anh chị làm tương tự như trên nhưng người ta chỉ hỏi 2 cờ CF và OF thôi
3 Cho biết kết quả sau khi thực hiện lệnh SUB AX,BX và trạng thái tràn (có dấu hoặc không dấu) có xảy ra không với:
a AX = 2143h và BX = 1986h
Trang 18CMP <tác tố đích>,<tác tố nguồn> ; điều kiện so sánh đúng
J<đkiệnsai> <tên nhãn sai> ; nhảy tới nhãn sai
• A : Above (lớn hơn – so sánh số không dấu)
• B : Below (nhỏ hơn – so sánh số không dấu)
• G : Greater (lớn hơn – so sánh số có dấu)
• L : Less (lớn hơn – so sánh số có dấu)
• E : Equal (bằng)
Sau đây là danh sách một số lệnh nhảy được dùng
Trang 19Lệnh nhảy theo kết quả không dấuJB/JNAE Nhảy nếu dưới/không trên hoặc bằng CF = 1
JAE/JNB Nhảy nếu trên hoặc bằng/không dưới CF = 0
JBE/JNA Nhảy nếu dưới hoặc bằng/không trên (CF or ZF) = 1
JA/JNBE Nhảy nếu trên/không dưới hoặc bằng (CF or ZF) = 0
Lệnh nhảy theo kết quả có dấuJL/JNGE Nhảy nếu nhỏ hơn/không lớn hơn hoặc bằng (SF or OF) = 1
JGE/JNL Nhảy nếu trên lớn hơn hoặc bằng/không nhỏ hơn (SF or OF) = 0
JLE/JNG Nhảy nếu nhỏ hơn hoặc bằng/không nhỏ hơn ((SF xor OF) or ZF) = 1
JG/JNLE Nhảy nếu lớn hơn/không nhỏ hơn hoặc bằng ((SF xor OF) or ZF) = 0
Lệnh nhảy khácJE/JZ Nhảy nếu bằng/nhảy nếu bằng không ZF = 1
JNE/JNZ Nhảy nếu không bằng/Nhảy nếu khác không ZF = 0
JP/JPE Nhảy nếu có bit kiểm/có bit kiểm chẵn PF = 1
JNP/JPO Nhảy nếu không có bit kiểm/có bit lẻ PF = 0
- Ví dụ: thanh ghi AL chứa 1 ký tự chữ Nếu ký tự chữ hoa thì hiển thị
- Thuật toán: Nếu AL chứa các giá trị <= 5Ah (ký tự Z trong ASCII) thì hiển thị ký tự đóCode:
CMP <tác tố đích>,<tác tố nguồn> ; điều kiện so sánh đúng
J<đkiệnsai> <tên nhãn CV2> ; nhảy tới nhãn CV2
; thực hiện CV1
JMP <nhãn kết thúc>
<tên nhãn CV2>:
Trang 20; thực hiện công việc CV2
DEC <tác tố đích> ; giảm giá trị của tác tố đích 1 đơn vị
JNZ <nhãn For> ; nhảy đến <nhãn For> nếu khác 0
+ Khởi tạo DL = 'A'
+ Lặp lại 26 lần, hiển thị + tăng giá trị DL lên 1 đơn vị
Trang 21CMP <tác tố đích>,<tác tố nguồn> ; điều kiện đúng
Jđksai <nhãn sai> ; điều kiện sai thì dừng
; thực hiện công việc trong vòn lặp
Trang 22II Giới thiệu một số lệnh nâng cao
0111
0110
; đổi chữ thường thành hoa
MOV DL,'a' ; DL = 'a'
Trang 23OR AL,10000001b ; AL = 10000011b
; đổi 0 9 thành ký số '0' '9'
MOV AL,5 ; AL = 05h
OR AL,30h ; AL = 35h
; đổi chữ hoa thành thường
MOV DL,'A' ; DL = 'A'
- Ví dụ sau kiểm tra bit 13 trong thanh ghi DX là 0 hay 1:
Trang 24a Lệnh SHL/SAL (Shift Logical/Arithmetic Left)
Trang 25c Lệnh ROL/ROR (Rotate Left/Rotate Right)
- Cú pháp:
ROL <đích>,<số đếm>
ROR <đích>,<số đếm>
- Ý nghĩa: Lệnh này tương tự như SHL và SHR nhưng bit MSB của đích ngoài việc đưa vào
CF còn vòng lại và đưa vào LSB Chỉ có CF và OF bị ảnh hưởng (nhưng bit LSB của đích ngoài việc đưa vào CF còn vòng lại và đưa vào MSB Chỉ có CF và OF bị ảnh hưởng)
d Lệnh RCL/RCR (Rotate Left through Carry/Rotate Right through Carry)
http://www.mediafire.com/?gyzwojdwmou <~~ Giáo Trình VXL
http://www.mediafire.com/?mzwm4yemjzi <~~ Bài tập VXL