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]
Gỉai:
a. MOV DL,SI ; DL <- 1500h
b. MOV DI,[DI] ; DI <- 0200h
c. ADD AX,[SI] ; AX <- 0650h
d. SUB BX,[DI] ; BX <- 0800h
e. LEA BX,BETA[BX] ; BX <- 0100h
f. ADD [SI],[DI] ; không hợp lệ (vì 2 tác tố đều là vùng nhớ)
g. ADD BH,[BL] ; BH <- 10h
h. ADD AH,[SI] ; AH <- 0155h
i. MOV AX,[BX+DI+BETA] ; AX <- 3100h
25 trang |
Chia sẻ: maiphuongdc | Lượt xem: 4943 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Ôn tập Vi Xử Lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
(-32768)NEG AX ; AX <- (-32768)MOV DL,-128 ; DL <- (-128)NEG DL ; DL <- (-128)4.6. Lệnh INT 21h- Lệnh này là một trình con của hệ điều hành. Trình con này có nhiều chức năng khác nhau tuỳ theo trị của thanh ghi AH. Sau đây là một số chức năng (hàm) thông dụng.
AH = 1 : ngắt 21h thực hiện nhập một ký tự từ bàn phím, mã ASCII ký tự nhận được (hoặc 0 nếu là phím điều khiển) chứa trong AL. Nếu ký tự thông thường được gõ vào thì sẽ hiển thị trên màn hình. Lệnh viết như sau:MOV AH,1 ; chọn chức năng 1INT 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ìnhMOV AH,2 ; chọn chức năng 2MOV DL,'A' ; chọn ký tự hiển thị là AINT 21h ; hiển thị ký tự
AH = 9 : ngắt 21h thực hiện xuất chuỗi ký tự có địa chỉ ô chứa trong thanh ghi DX (và địa chỉ đoạn chứa trong DS) ra màn hình. Chú ý chuỗi ký tự phải kết thúc bằng ký tự $.DataMSG DB "Chuoi can hien thi$".Code; Dua dia chi doan du lieu vao DSMOV AX,@DataMOV DS,AX; Hien thi cau chaoMOV AH,9LEA DX,AXINT 21h
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 4ChINT 21h ; ket thuc chuong trinh
4.6. Lệnh INT 10hLệnh này dùng để xoá màn hìnhMOV AX,3INT 10h
Bài tập Phần 1
- Bài tập của phần này gồm có 2 phần:
Lý thuyết
Bài tập
I. Lý thuyết1. Tính địa chỉ tuyệt đối tương ứng với địa chỉ tương đối A51h:CD90hGỉai:- Địa chỉ tương đối có dạng: :- 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 = 172A0h2. Tính địa chỉ tương đối tương ứng với địa chỉ tương đối A25h:CD09hGỉ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 40FFhb. Địa chỉ đoạn tương ứng với ô 123BhGỉai:Cũng áp dụng công thức trêna. địa chỉ ô = địa chỉ tuyệt đối - địa chỉ đoạn * 16 = 4A37Bh - 40FFh * 16 = 938Bhb. địa chỉ đoạn = (địa chỉ tuyệt đối - địa chỉ ô) / 16 = (4A37Bh - 123Bh) / 16 = 4914h4. Gỉa sử các byte ở địa chỉ từ 0 đến 4 có trị (thập lục) là AB, CD, EF, 01, 23. Hãy cho biết trị của từ ở địa chỉ 2Gỉai: Ta có hình ảnh sau:Như vậy ta kết luận ở địa chỉ 2 ta có nội dung là EF5. 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 4Gỉai: tương tự như câu 4: 05h, 04h, 0Ah, 02h, 01h6. Viết lệnh định nghĩa từ WORDV có trị -1Gỉai:WORDV DB FFd7. 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:a. B = B - A - 1b. A = Bc. A = 10 - Ad. A = B - A * 2e. C = 2 * B - 3 * AGỉai:
a. B = B - A - 1MOV AX,A ; AX <- ADEC AX ; AX <- A - 1SUB B,AX ; B <- B - A - 1
b. A = BMOV AX,B ; AX <- BMOV A,AX ; A <- B
c. A = 10 - ANEG A ; A <- (-A)ADD A,10 ; A <- (-A) + 10
d. A = B - A * 2MOV AX,A ; AX <- ANEG AX ; AX <- (-A)SUB AX,AX ; AX <- (-A) - AADD AX,B ; AX <- (-2A) + BMOV A,AX ; A <- (-2A) + B
e. C = 2 * B - 3 * AMOV AX,B ; AX <- BADD AX,AX ; AX <- B + BMOV C,AX ; C <- 2BMOV AX,A ; AX <- AADD AX,AX ; AX <- A + AADD AX,AX ; AX <- 2A + ANEG AX ; AX <- (-3A)ADD C,AX ; C <- 2B + (-3A)
II. Thực hành1. Viết chương trình hiển thị câu chào sau trên màn hình: Cha`o ba.n!Gỉai:
Code:
;=================================================================================; Noi dung: Viet chuong trinh hien thi cau chao sau len man hinh: Cha`o ba.n!; Ten file: bt01.asm; Ngay tao: 17/03/2009 - 00:15;=================================================================================.model small.stack 100h.data ; Khai bao cac bien tai day CR EQU 13 LF EQU 10 Mess db 'Cha`o ba.n!',CR,LF,'$'.codemain proc ; Dua du lieu vao thanh ghi DS mov ax,@data mov ds,ax ; Hien thi Mess mov ah,9 lea dx,Mess int 21h ; Exit to DOS mov ah,4ch int 21hmain endpend main
2. Viết chương trình hiển thị 3 câu chào sau trên màn hình:Hello, world!Hello, solar system!Hello, universe!Gỉai:
Code:
;=================================================================================; Noi dung: Viết chương trình hiển thị 3 câu chào sau trên màn hình:; Hello, world!; Hello, solar system!; Hello, universe!; Ten file: bt02.asm; Ngay tao: 17/03/2009 - 00:25;=================================================================================.model small.stack 100h.data ; Khai bao cac bien tai day CR EQU 13 LF EQU 10 Mess db CR,LF,'Hello, world!' db CR,LF,'Hello, solar system!' db CR,LF,'Hello, universe!$'.codemain proc ; Dua du lieu vao thanh ghi DS mov ax,@data mov ds,ax ; Hien thi Mess mov ah,9 lea dx,Mess int 21h ; Exit to DOS mov ah,4ch int 21hmain endpend main
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: AKy tu da nhap : A
Code:
;===================================================================================; Noi dung: Viet chuong trinh nhap vao mot ky tu va hien thi lai o dong tiep theo. Ket qua co dang:; Hay nhap mot ky tu: A; Ky tu da nhap : A; Ten file: bt03.asm; Ngay tao: 17/03/2009 - 00:31; Huong dan:; 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; - Nhap mot ky tu; - Dua gia tri vao thanh ghi bl; - Hien thi TBao2; - Hien thi KyTu;===================================================================================.model small.stack 100h.data ; Khai bao cac bien tai day CR EQU 13 LF EQU 10 TBao1 db CR,LF,'Hay nhap mot ky tu: $' TBao2 db CR,LF,'Ky tu da nhap : $'.codemain proc ; Dua du lieu vao thanh ghi DS mov ax,@data mov ds,ax ; Hien thi TBao1 mov ah,9 lea dx,TBao1 int 21h ; Nhap vao mot ky tu mov ah,1 int 21h ; Dua ky tu vao thanh ghi bl mov bl,al ; Hien thi TBao2 mov ah,9 lea dx,TBao2 int 21h ; Hien thi KyTu mov ah,2 mov dl,bl int 21h ; Exit to DOS mov ah,4ch int 21hmain endpend main
4. Viết chương trình nhập một ký tự và hiển thị ký tự đứng trước, đứng sau theo thứ tự mã ASCII. Kết quả có dạng:Hay nhap mot ky tu: BKy tu dung truoc : AKy tu dung sau : CGỉai
Code:
;===================================================================================; Noi dung: Viet chuong trinh nhap vao mot ky tu va hien thi ky tu dung truoc,; dung sau theo thu tu ma ASCII. Ket qua co dang:; Hay nhap mot ky tu: B; Ky tu dung truoc : A; 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;===================================================================================.model small.stack 100h.data ; Khai bao cac bien tai day CR EQU 13 LF EQU 10 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 : $'.codemain proc ; Dua du lieu vao thanh ghi DS mov ax,@data mov ds,ax ; Hien thi TBao1 mov ah,9 lea dx,TBao1 int 21h ; Nhap vao mot ky tu mov ah,1 int 21h ; Dua ky tu vao thanh ghi bl mov bl,al ; Hien thi TBao2 mov ah,9 lea dx,TBao2 int 21h ; Hien ky tu va giam 1 gia tri mov ah,2 mov dl,bl dec dl int 21h ; Hien thi TBao3 mov ah,9 lea dx,TBao3 int 21h ; Hien ky tu va tang 1 gia tri mov ah,2 mov dl,bl inc dl int 21h ; Exit to DOS mov ah,4ch int 21hmain endpend main
5. Viết chương trình nhập hai ký tự và hiển thị ký tự thứ ba có mã ASCII là tổng của mã hai ký tự đã nhập. Kết quả có dạng:Nhap ky tu thu nhat: 2Nhap ky tu thu hai : 3Ky tu tong : e
Phần 2 – Lý Thuyết
Trong phần này các anh chị sẽ nhận biết kiểu định vị của địa chỉ và giới thiệu các thanh ghi cờ
Kiểu định vị hoặc chế độ định vị (addressing mode) là cách thức xác định dữ liệu trong lệnh. Có tất cả 7 chế độ định vị chuẩn, đó là
Thanh ghi (register)
Lấy ngay (immediate)
Trực tiếp (direct)
Gían tiếp thanh ghi (register indirect)
Chỉ số (indexed)
Cơ sở (based)
Chỉ số cơ sở (based indexed)
1. Định vị thanh ghi- Trong chế độ định vị thanh ghi, các tác tố là thanh ghi, tức dữ liệu chứa trong thanh ghi. Khi tác tố là thanh ghi thì lệnh sẽ được thực hiện nhanh hơn vì không mất thời gian truy cập vào bộ nhớ.- Ví dụ:MOV AL,BL ; AL : 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ẩn4. Đị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ách khá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:BXSUB 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ớ
BX
1000
1BAC
DS:1000
SI
2000
20FE
DS:2000
DI
3000
031D
DS:3000
Với các lệnh sau, ta được kết quả sau:MOV BX,[BX] ; BX <- 1BACMOV CX,[SI] ; CX <- 20FEMOV BX,[AX] ; tác tố nguồn không hợp lệADD [SI],[DI] ; lệnh này không hợp lệMOV DL,[DI] ; DL <- 1D5. Định vị chỉ số- Trong chế độ này, dữ liệu chứa trong bộ nhớ, và địa chỉ tác tố là tổng của nội dung thanh ghi chỉ số SI và DI (là một địa chỉ) với một số bù 2 có dấu 8 hoặc 16 bit gọi là độ dời (offset)- Ví dụ:MOV AX,[SI+4]MOV AX,[4+SI]MOV 4[SI],AXMOV [SI]4,AXADD [DI-6],CXADD [-6+DI],CXADD -6[DI],CXADD [DI]-6,CXMOV [SI+ACCOUNT],AXMOV [ACCOUNT+SI],AXMOV ACCOUNT[SI],AXMOV [SI]ACCOUNT,AXMOV ACCOUNT+SI,AX6. Định vị cơ sởCách định vị này tương tự như cách định vị chỉ số, nhưng dùng thanh ghi cơ sở BX hoặc BP thay vì DI hoặc SI. 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ớ
BX
2
1084
DS:0002
SI
4
2BAC
DS:0004
DI
1
- Với khai báo:ALPHA DW 0123h,0456h,0789h,0ABChvà với các lệnh sau, ta có kết quả:MOV AX,[ALPHA+BX] ; AX <- 0456hMOV BX,[BX+2] ; BX <- 2BAChMOV CX,ALPHA[SI] ; CX <- 0789hMOV AX,-2[SI] ; AX <- 1084hMOV BX,[ALPHA+3+DI] ; BX <- 0789hADD BX,[ALPHA+AX] ; thanh ghi nguồn không hợp lệ7. Định vị chỉ số cơ sở- 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- Ví dụ:MOV AX,[BX+DI]MOV [BX+SI+2],AXMOV AX,[BX+SI+2]MOV AX,[SI+BX+2]MOV AX,[SI][BX+2]MOV AX,[BX][SI+2]MOV AX,2[BX][SI]MOV AX,W[BX][SI]ADD AL,[BP+DI-50]MOV ES:[BX+DI+4],AX
Thanh ghi cờ- Thanh ghi cờ là một trong các thanh ghi của CPU dài 16 hoặc 32 bit (từ CPU 80386 về sau) ghi nhận các thông tin điều khiển, trạng thái của CPU và kết quả thực hiện lệnh sau cùng.- Mỗi bit gọi là một cờ, cờ có thể có trị 1 (gọi là đặt - set) hoặc 0 (gọi là xoá - clear), 16 bit phần cao dùng cho chế độ bảo vệ, 16 bit phần thấp gồm 2 nhóm: cờ điều khiển và cờ trạng thái. Có 2 dạng cờ:
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:
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
NT
IOPL
OF
DF
IF
TF
SF
ZF
AF
PF
CF
- Sau đây là phần diễn giải một số cờ thông dụng.
Cờ
Đặt
Xoá
Ý nghĩa
OF
OV
NV
Tràn/Không tràn (Overflow/Not overflow)
DF
DN
UP
Xuống/Lên (Down/Up)
IF
EI
DI
Cho ngắt/Cấm ngắt (Enable/Disable)
SF
NG
PL
Âm/Dương (Negative/Plus)
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ụ:CLCMOV BL,0FEh ; BL <- 0FEh , CF = 0ADD BL,1 ; BL <- FFh , CF = 0ADD BL,1 ; BL <- 00h , CF = 0
b. Cờ chẵn lẻ (PF)- Có trị 1 khi byte thấp của kết quả là chẵn, có trị 0 khi byte thấp là lẻ. Một từ gọi là chẵn lẽ khi số bit 1 của từ đó là chẵn/lẽ.- Ví dụ sau khi thực hiện một lệnh cho kết quả chứa trong AL là 11010010b (bốn bit 1) thì PF = 1c. Cờ gởi phụ (AF)- 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- Ví dụ:MOV BL,0FEh ; BL <- 0FEhADD BL,1 ; BL <- FFh , AF = 0ADD BL,1 ; BL <- 00h , AF = 1d. Cờ không (ZF)- Có trị 1 khi kết quả là 0, trị 0 khi kết quả khác 0- Ví dụ:MOV AL,1 ; AL <- 1SUB AL,1 ; AL <- 0 , ZF = 1ADD AL,1 ; AL <- 1 , ZF = 0e. Cờ dấu (SF)- Có trị 1 khi kết quả là âm, trị 0 khi kết quả là dương (MSB là 0)- Ví dụ:MOV AL,0 ; AL = 0SUB AL,1 ; AL = -1 ; SF = 1ADD AL,1 ; AL = 0 ; SF = 0f. Cờ tràn (OF)- Cờ tràn có trị 1 khi xảy ra trạng thái tràn tức thì (có dấu) của kết quả vượt quá phạm vi giá trị cho phép. Ví dụ một từ 2 bytes có thể chứa trị từ khoảng từ -32768 đến 32767 (có dấu), nếu vượt quá phạm vi này sẽ xảy ra tràn, lúc đó cờ OF = 1- Ví dụ:MOV AL,1 ; AL <- 1SUB AL,1 ; AL <- 0 , ZF = 1ADD AL,1 ; AL <- 1 , ZF = 0
Bài tập Phần 2
Phầ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ệnh1. 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 ghib. MOV AH,7 ; định vị lấy ngayc. MOV [DI],AL ; định vị gián tiếp thanh ghid. MOV AX,[BP] ; định vị gián tiếp thanh ghie. 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]Gỉai:a. MOV DL,SI ; DL <- 1500hb. MOV DI,[DI] ; DI <- 0200hc. ADD AX,[SI] ; AX <- 0650hd. SUB BX,[DI] ; BX <- 0800he. LEA BX,BETA[BX] ; BX <- 0100hf. ADD [SI],[DI] ; không hợp lệ (vì 2 tác tố đều là vùng nhớ)g. ADD BH,[BL] ; BH <- 10hh. ADD AH,[SI] ; AH <- 0155hi. MOV AX,[BX+DI+BETA] ; AX <- 3100h3. Xác định chế độ địa chỉ và tính địa chỉ vật lý của các câu lệnh sau:CS = DCBAh ; SS = EA98h ; BP = SP = 0957hDS = ES = DDE8h ; BX = 1234h ; SI = DI = 3412ha. MOV [1234h],ALb. MOV BL,[BX+DI]c. MOV [BP+15],BLd. MOV BH,[DI+10]e. MOV AL,[BP+DI] + 110bGiaỉ:a. MOV [1234h],AL ; định vị trực tiếpđịa chỉ tuyết đối = DS * 16 + 1234h = DF0B4hb. MOV BL,[BX+DI] ; định vị chỉ số cơ sởđịa chỉ tuyết đối = DS * 16 + BX + DI = E24C6hc. MOV [BP+15],BL ; định vị cơ sởđịa chỉ tuyết đối = DS * 16 + BP + Fh = DE7F6hd. MOV BH,[DI+10] ; định vị chỉ sốđịa chỉ tuyết đối = DS * 16 + DI + Ah = E129Che. 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ệnh sau:a. ADD AX,BX ; với AX = 7FFFh và BX = 1b. SUB AL,BL ; với AL = 1 và BL = FFhc. DEC AL ; với AL = 0d. NEG AL ; với AL = 7Fhe. XCHG AX,BX ; với AX = 1ABCh và BX = 712Ahf. ADD AL,BL ; với AL = 80h và BL = FFhg. SUB AX,BX ; với AX = 0 và BX = 8000hh. NEG AX ; với AX = 1Gỉai:a. ADD AX,BX ; với AX = 7FFFh và BX = 1AX = 0111 1111 1111 1111bBX = 0000 0000 0000 0001b- Cờ CF (cờ gởi, = 1 khi có tràn ngược lại = 0 khi không tràn, đối với số nguyên không dấu)Đối với lệnh ADD AX,BX thì CF = 0 vì không có tràn- Cờ SF (cờ dấu, = 1 khi kết quả âm (bit MSB là 1) ngược lại = 0 khi kết quả dương (bit MSB là 0))Đố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ấuCá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ông dấu) có xảy ra không với:a. AX = 512h và BX = 4185hb. AX = FE12h và BX = 1ACBhc. AX = E1E4h và BX = DAB3hd. AX = 7132h và BX = 7000he. AX = 6389h và BX = 1176hGỉai:a. ADD AX,BX ; AX = 512h và BX = 4185hĐố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 = 1986hb. AX = 81FEh và BX = 1986hc. AX = 19BCh và BX = 81FEhd. AX = 0002h và BX = FE0Fhe. AX = 8BCDh và BX = 71ABhGỉai:SUB AX,BX ; AX = 2143h và BX = 1986hĐố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.
Phần 3 – Lý Thuyết
Trong phần này xin nói về:
Các cấu trúc NHẢY và LẶP
Giới thiệu một số lệnh nâng cao
Lập trình hợp ngữ
I. Các cấu trúc NHẢY và LẶP1. Cấu trúc IF THEN CV1- Cú pháp:CMP , ; điều kiện so sánh đúngJ ; nhảy tới nhãn sai; thực hiện CV1........:; thực hiện công việc sai.......Với J ta cần nhớ 1 vài từ ký hiệu như sau:
J : Jump (nhảy)
N : Not (không ...)
Z : cờ ZF; C : cờ CF; O : cờ OF; S : cờ SF; P : cờ PF
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
Lệnh nhảy theo kết quả không dấu
JB/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ấu
JL/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ác
JE/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
JS
Nhảy nếu có dấu
SF = 1
JNS
Nhảy nếu không dấu
SF = 0
JO
Nhảy nếu tràn
OF = 1
JNO
Nhảy nếu không tràn
OF = 0
JC
Nhảy nếu có nhớ
CF = 1
JNC
Nhảy nếu không nhớ
CF = 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 AL,5Ah ; so sánh ký tự 5Ah thì nhảy đến Stop ; hiển thị ký tự đó MOV AH,2 MOV DL,AL INT 21hStop:
2. Cấu trúc IF THEN CV1 ELSE CV2- Cú pháp:CMP , ; điều kiện so sánh đúngJ ; nhảy tới nhãn CV2; thực hiện CV1........JMP :; thực hiện công việc CV2.......:..........- Ví dụ: một số x Bytes dạng HEX (0 -> 15). Hiển thị giá trị x lên màn hình (Nghĩa trong dạng HEX sử dụng 0 -> 9 và từ 10 -> 15 thì hiển thị A -> F)- Thuật toán: Nếu x <= 9 thì x = x + 30h (hiển thị số) ngược lại x = x + 37h (hiển thị ký tự)
Code:
MOV DL,x ; chuyển vào thanh ghi DLCMP DL,9 ; x <=9 ?JA ChangeChar ; hiển thị số ADD DL,30h ; chuyển thành số JMP DisplayChangeChar: ADD DL,37h ; đổi ra ký tựDisplay: ; hiển thị ký tự đó MOV AH,2 INT 21h
3. Cấu trúc FOR TO DO CV- Cú pháp: Có 2 cách:a. Cách 1:MOV , ; tác tố nguồn là số lần lặp:; thực hiện CV lần đầu tiên........DEC ; giảm giá trị của tác tố đích 1 đơn vịJNZ ; nhảy đến nếu khác 0b. Cách 2:MOV , ; tác tố nguồn là số lần lặp:; thực hiện CV lần đầu tiên........LOOP - Ví dụ: in ra 1 dòng gồm có 26 chữ cái hoa- Thuật giải: + 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ị
Code:
MOV DL,'A' ; khởi tạo DL = 'A'; hiển thị ký tựMOV AH,2; chuẩn bị lặpMOV CX,26 ; lặp 26 lầnLoop26: INT 21h ; hiển thị ký tự đó INC DL ; tăng giá trị lên 1 đơn vị để hiển thị ký tự kế tiếpLOOP Loop26MOV
4. Cấu trúc REPEAT- Cú pháp: :; thực hiện công việc lần đầu tiên.........CMP , ; điều kiện đúngJđksai - Ví dụ:Mảng byte (80 phần tử) vào dữ liệu từ bàn phím, mỗi phần tử = 1 ký tự, kết thúc bằng bằng Enter- Thuật toán:+ Thông báo 'Hay vao 1 ky tu, ket thuc bang Enter, xuống dòng về đầu dòng, pt đầu mảng'+ Vào 1 ký tự+ Lặp lại thao tác: cất ký tự vào mảng, tăng chỉ số mảng, vào 1 ký tự. Cho tới khi ký tự = Enter- Lưu ý: có 2 cách xác định phần tử đầu tiên của mảngLEA BX,M1XOR SI,SI
Code:
.MODEL small.STACK 100.DATA TB db 10,13,'Hay vao 1 ky tu, ket thuc bang Enter: ',10,13,'$' M1 db 80 DUP(?).CODE ; lấy dữ liệu vào thanh ghi DS MOV AX,$DATA MOV DS,AX ; Xuất chuỗi ra màn hình MOV AH,9 LEA DX,TB INT 21h XOR SI,SI ; chọn M1[SI] làm phần tử đầu dãy ; nhập ký tự MOV AH,1 INT 21h LoopRepeat: MOV M1[SI],AL ; cất ký tự vào mảng INC SI ; tăng chỉ số mảng INT 21h CMP AL,13 JNE LoopRepeat ; nhảy nếu ký tự không phải là Enter
5. Cấu trúc WHILE...DO:CMP , ; điều kiện đúngJđksai ; điều kiện sai thì dừng; thực hiện công việc trong vòn lặp......JMP :; thực hiện công việc của nhãn sai.........
II. Giới thiệu một số lệnh nâng cao1. Lệnh luận lý- Các lệnh luận lý AND, OR, XOR, NOT thực hiện các phép tính luận lý trên dữ liệu nhị phân theo định nghĩa sau:
A
B
NOT A
A AND B
A OR B
A XOR B
0011
0101
1100
0001
0111
0110
a. Lệnh NOT- Cú pháp: NOT - Ý nghĩa: Lệnh này đổi tác tố đích (thanh ghi/vùng nhớ) thành số bù. Không có cờ nào bị ảnh hưởng- Ví dụ:MOV AL,3Eh ; AL = 00111110b = 3EhNOT AL ; AL = 11000001b = C1hb. Lệnh AND- Cú pháp: AND ,- Ý nghĩa: Lệnh này thực hiện phép AND giữa 2 tác tố, kết quả cuối cùng chứa trong tác tố đích. Các cờ SF, ZF, PF đều bị ảnh hưởng, CF = OF = 0, AF không xác định.- Ví dụ:; xoá bit dấu của ALMOV AL,-5 ; AL = 11111011bAND AL,01111111b ; AL = 01111011b; đổi mã ASCII của số thành số tương ứngMOV AL,'5' ; AL = 35hAND AL,0Fh ; AL = 05h; đổi chữ thường thành hoaMOV DL,'a' ; DL = 'a'AND DL,0DFh ; DL = 'A'c. Lệnh OR- Cú pháp: OR ,- Ý nghĩa: Lệnh này tương đương như AND nhưng thực hiện phép OR. Lệnh OR dùng để bật lên 1 một số bit và giữ nguyên các bit khác.- Ví dụ:; bật 1 MSB và LSB của ALMOV AL,2 ; AL = 00000010bOR AL,10000001b ; AL = 10000011b; đổi 0..9 thành ký số '0'..'9'MOV AL,5 ; AL = 05hOR AL,30h ; AL = 35h; đổi chữ hoa thành thườngMOV DL,'A' ; DL = 'A'OR DL,20h ; DL = 'a'; kiểm tra CX có bằng 0?OR CX,CXJZ Is0Not0: ..... ; CX 0.....Is0: ..... ; CX = 0d. Lệnh XOR- Cú pháp: XOR ,- Ý nghĩa: Lệnh này tương đương như AND
Các file đính kèm theo tài liệu này:
- on_tap_vi_xu_ly_7428.doc