Chương 6 NHÓM LỆNH TÍNH TOÁN SỐHỌC VÀ LuẬN LÝ... Lệnh IMUL• Tương tự lệnh MUL, nhưng xử lý trên số códấu... Lệnh IDIV• Tương tự lệnh DIV nhưng làm việc trên số códấu... Dạng SHL reg,CL d
Trang 1Chương 6 NHÓM LỆNH TÍNH TOÁN SỐ
HỌC VÀ LuẬN LÝ
Trang 2*/
Trang 3Lệnh ADD
• Dạng lệnh :
Trang 4ADD WORD PTR [SI+8],5
Trang 5Lệnh SUB
• Dạng lệnh :
Trang 6Ví dụ
Trang 10Lệnh MUL
• Dạng lệnh :
• 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ờ :
Trang 12Lệnh IMUL
• Tương tự lệnh MUL, nhưng xử lý trên số códấu
Trang 13Lệnh DIV
• Dạng lệnh :
• 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ờ :
Trang 14Lệnh IDIV
• Tương tự lệnh DIV nhưng làm việc trên số códấu
Trang 15SHLSHRSALSAR
Trang 16Lệnh AND
• Dạng lệnh :
• Giải thích : thđ ← thđ AND thn
• Tác động cờ:
Trang 17Ví dụ:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')
Trang 20Lệnh XOR
• Dạng lệnh :
XOR mem,reg XOR mem,immed
XOR reg,mem XOR accum,immed
• Giải thích : thđ ← thđ XOR thn
• Tác động cờ:
Trang 22Lệnh NOT
• Dạng lệnh :
• 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
Trang 23Lệnh SHL/SAL
• Dạng lệnh :
• 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
• Tác động cờ :
Trang 24Ví dụ
MOV AL, 11100000b
SHL AL, 1 ; AL=11000000b
; CF=1
Trang 25Bà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
Trang 27Bài tập (t.t.)
BTVN: Viết chương trình tính a n , với a chứa trong AL,
n chứa trong AH, kết quả chứa vào DX
Trang 28Bà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
Trang 30Chươ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
Trang 31Chia liên tiếp cho 10
Stack
1 5 6 2
Trang 32xuatso 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?
Trang 33xuatso 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:
pop DX pop CX pop BX pop AX
Trang 35• 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
Trang 36nhapso 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
Trang 37nhapso 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('$')
push bx push cx push dx push si push ds
pop ds pop si pop dx pop cx pop bx