Kiến trúc máy tính phần ii hợp ngữ - chương 6 nhóm lệnh tính toán số học và luận lý
Nhóm lệnh tính toán số học ADD SUB INC DEC NEG MUL , IMUL DIV , IDIV + -++ ---a * /
Bạn đang xem trước 20 trang tài liệu Kiến trúc máy tính phần ii hợp ngữ - chương 6 nhóm lệnh tính toán số học và luận lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 6
NHÓM LỆNH TÍNH TOÁN SỐ
HỌC VÀ LuẬN LÝ
Nhóm lệnh tính toán số học
ADD
SUB
INC
DEC
NEG
MUL , IMUL
DIV , IDIV
+
-
++
--
-a
*
/
Lệnh ADD
• Dạng lệnh :
ADD reg,reg ADD reg,immed
ADD mem,reg ADD mem,immed
ADD reg,mem ADD accum,immed
• Giải thích : thđ ← thđ + thn
Cộng toán hạng nguồn vào toán hạng đích. Kết quả cất vào
toán hạng đích.
• Tác động cờ :
à Xem thêm lệnh ADC
Ví dụ
ADD CX,SI ; CX ← CX + SI
ADD DH,BL ; DH ← DH + BL
ADD [1000h],BX ;[1001h,1000h] ← [1001h,1000h] + BX
ADD [2000h],CL ; [2000h] ← [2000h] + CL
ADD AL,[0000h] ; AL ← AL + [0000h]
ADD BYTE PTR [SI+8],5 ; [SI+8] ← [SI+8] + 05h
ADD WORD PTR [SI+8],5
Lệnh SUB
• Dạng lệnh :
SUB reg,reg SUB reg,immed
SUB mem,reg SUB mem,immed
SUB reg,mem SUB accum,immed
• Giải thích : thđ ← thđ - thn
Trừ toán hạng đích cho toán hạng nguồn. Kết
quả cất vào toán hạng đích.
• Tác động cờ :
à Xem thêm SBB
Ví dụ
SUB DL,AL ; DL ← DL - AL
SUB CX,[DI] ; CX ← CX - [DI+1,DI]
SUB BP,4 ; BP ← BP - 4
Lệnh INC
• Dạng lệnh :
INC reg INC mem
• Giải thích : thđ ← thđ + 1
cộng 1 vào toán hạng đích nhưng không ảnh hưởng
cờ nhớ.
• Tác động cờ :
• Ví dụ :
INC CH
INC WORD PTR [1000h]
Lệnh DEC
• Dạng lệnh :
DEC reg DEC mem
• Giải thích : thđ ← thđ - 1
trừ 1 vào toán hạng đích nhưng không ảnh hưởng cờ
nhớ.
• Tác động cờ :
• Ví dụ :
DEC AX
DEC Byte PTR ES:[1000h]
Lệnh NEG
• Dạng lệnh :
NEG reg NEG mem
• Giải thích : thđ ← bù 2 ( thđ)
• Tác động cờ :
• Ví dụ :
NEG AX
NEG Byte PTR ES:[SI]
Lệnh MUL
• Dạng lệnh :
MUL reg MUL mem
• Giải thích : nhân số không dấu
– Trường hợp toán hạng nguồn là 8 bit thì :
AX ← AL * thn8
– Trường hợp toán hạng nguồn là 16 bit thì :
{DX AX} ← AX * thn16
• Tác động cờ :
Ví dụ
• Nếu AL=5, CH=4, sau khi thực hiện lệnh
MUL CH
ta có AX = AL*CH = 0014h.
• Nếu AX=500h, [1001h,1000h]=0401h, sau khi
thực hiện lệnh
MUL WORD PTR [1000h]
ta có {DXAX} = AX * [1001h,1000h]
= 500h * 401h = 00140500h
Nghĩa là DX=0014h và AX=0500h.
Lệnh IMUL
• Tương tự lệnh MUL, nhưng xử lý trên số có
dấu
Lệnh DIV
• Dạng lệnh :
DIV reg DIV mem
• Giải thích : chia hai số không dấu
– Nếu toán hạng nguồn là 8 bit thì :
AL ← (AX / thn8)
AH ← số dư của (AX / thn8)
– Toán hạng nguồn 16 bit thì :
AX ← (DXAX / thn16)
DX ← số dư của (DXAX / thn16)
• Tác động cờ :
Lệnh IDIV
• Tương tự lệnh DIV nhưng làm việc trên số có
dấu
Nhóm lệnh xử lý logic
AND
OR
XOR
NOT
ROL
ROR
RCL
RCR
SHL
SHR
SAL
SAR
Lệnh AND
• Dạng lệnh :
AND reg,reg AND reg,immed
AND mem,reg AND mem,immed
AND reg,mem AND accum,immed
• Giải thích : thđ ← thđ AND thn.
• Tác động cờ:
Ví dụ:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')
01100001
11011111
--------
01000001
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0
Lệnh OR
• Dạng lệnh :
OR reg,reg OR reg,immed
OR mem,reg OR mem,immed
OR reg,mem OR accum,immed
• Giải thích : thđ ← thđ OR thn.
• Tác động cờ :
Ví dụ:
MOV AL, 'A' ; AL = 01000001b
OR AL, 00100000b ; AL = 01100001b ('a')
01000001
00100000
--------
01100001
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
Lệnh XOR
• Dạng lệnh :
XOR reg,reg XOR reg,immed
XOR mem,reg XOR mem,immed
XOR reg,mem XOR accum,immed
• Giải thích : thđ ← thđ XOR thn.
• Tác động cờ:
Ví dụ:
MOV AL, 00000111b
XOR AL, 00000010b ; AL = 00000101b
00000111
00000010
--------
00000101
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
Lệnh NOT
• Dạng lệnh :
NOT reg NOT mem
• Giải thích : thđ ← đảo từng bit ( thđ )
• Tác động cờ : (không thay đổi)
• Ví dụ:
MOV AL, 00011011b
NOT AL ; AL = 11100100b
Lệnh SHL/SAL
• Dạng lệnh :
SHL reg,1 SHL mem,1
SHL reg,CL SHL mem,CL
• Giải thích : Dịch trái. Dạng SHL reg,1 dùng
để dịch trái 1 bit. Dạng SHL reg,CL dùng
để dịch trái nhiều bit. Lúc đó thanh ghi
CL chứa số bit cần dịch.
• Tác động cờ :
Ví dụ
MOV AL, 11100000b
SHL AL, 1 ; AL=11000000b
; CF=1
Bài tập
1. Viết đoạn chương trình hợp ngữ tính tổng:
s = 1 + 2+ 3+ … + n
trong đó, giá trị n chứa sẳn trong thanh ghi AX
kết quả tính được cất vào thanh ghi DX
(giả sử n đủ nhỏ để tổng tính được không tràn)
BTVN2: Viết chương trình tính s=1+3+5+…+
n nếu n lẻ
n -1 nếu n chẳn
Bài tập (t.t.)
2 .Cho a,b, kq là các số có dấu, khai báo như sau:
a db ?
b db ?
kq dw ?
Viết đoạn chương trình tính:
kq = (a+2)*(b-5) +3
Bài tập (t.t.)
BTVN: Viết chương trình tính an , với a chứa trong AL,
n chứa trong AH, kết quả chứa vào DX
Bài tập (t.t.)
Viết chương trình con:
3. Đếm số bit 1 của giá trị 16bit nằm trong thanh
ghi AX, kết quả chứa vào DL
4. Tính tổng các chữ số (ở hệ 10) của 1 số 16 bit
chứa trong thanh ghi AX, kết quả chứa vào DL
Các chương trình con hỗ trợ
• Chương trình con 1:
Xuất một giá trị số nguyên 16 bit ra màn
hình
• Chương trình con 2:
Nhập một giá trị số nguyên 16 bit từ bàn
phím
Chương trình xuất giá trị số
nguyên 16 bit hệ 10
• Input: AX chứa giá trị cần xuất
• Giải thuật:
Chia liên tiếp cho 10 để lấy số dư
In ra màn hình các số dư theo thứ tự ngược
Chia liên tiếp cho 10
1562 chia 10 à 2
156 chia 10 à 6
15 chia 10 à 5
1 chia 10 à 1
Xuất các số dư:
1 + ‘0’ à ‘1’
5 + ‘0’ à ‘5’
6 + ‘0’ à ‘6’
2 + ‘0’ à ‘2’
1
5
6
2
Stack
1
5
6
2
xuatso proc
mov bx,10 ; chia cho 10
mov cx,0 ; tính số lần lặp
chia:
mov dx,0 ; xóa dx đi
div bx ;Chia [DX|AX] cho 10,
;thương trong AX, dư trong DX
push dx ; cất phần dư
inc cx ;tăng lến lần lặp
cmp ax,0
jne chia
xuat:
pop dx
add dl,'0'
mov ah,2
int 21h
loop xuat
ret
xuatso endp
Các thanh ghi nào
thay đổi?
xuatso proc
mov bx,10 ; chia cho 10
mov cx,0 ; tính số lần lặp
chia:
mov dx,0 ; xóa dx đi
div bx ;Chia [DX|AX] cho 10,
;thương trong AX, dư trong DX
push dx ; cất phần dư
inc cx ;tăng đếm
cmp ax,0
jne chia
xuat:
pop dx
add dl,'0'
mov ah,2
int 21h
loop xuat
ret
xuatso endp
Các thanh ghi thay
đổi trong CTC:
AX, BX, CX,DX
è cất giữ nội dung
các thanh ghi này
để phục hồi
push AX
push BX
push CX
push DX
pop DX
pop CX
pop BX
pop AX
Chương trình nhập số
nguyên 16 bit
• Output: AX chứa giá trị nhập
• Giải thuật:
– Nhập chuỗi số từ bàn phím
– Đổi chuỗi số thành số
• Ban đầu AX= 0
• ‘1562’ è AX = AX*10 + 1 = 1
• ‘1562’ è AX = AX*10 + 5 = 15
• ‘1562’ è AX = AX*10 + 6 = 156
• ‘1562’ è AX = AX*10 + 2 = 1562
nhapso proc
; ......
mov ah,0ah
mov dx,offset buffer
push cs ;Cho DS trỏ đến
pop ds ;đoạn code
int 21h
mov cl,[buffer+1] ;lấy số chữ số vừa nhập
mov ch,0
mov si,offset buffer +2 ;vị trí chữ số đầu tiên
mov ax,0 ;xóa ax
mov bx,10
nhan: mul bx
mov dl,[si]
sub dl,'0'
mov dh,0
add ax,dx
inc si
loop nhan
; ......
ret
buffer db 6,?,6 dup('$')
nhapso endp
nhapso proc
mov ah,0ah
mov dx,offset buffer
push cs
pop ds
int 21h
mov cl,[buffer+1]
mov ch,0
mov si,offset buffer +2
mov ax,0
mov bx,10
nhan: mul bx
mov dl,[si]
sub dl,'0'
mov dh,0
add ax,dx
inc si
loop nhan
ret
buffer db 6,?,6 dup('$')
nhapso endp
Các thanh ghi thay đổi
trong CTC:
BX, CX,DX, SI, DS
è cất giữ nội dung
các thanh ghi này để
phục hồi
push bx
push cx
push dx
push si
push ds
pop ds
pop si
pop dx
pop cx
pop bx