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
            
         
        
    





 
                    