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 * /

pdf37 trang | Chia sẻ: longpd | Lượt xem: 3257 | Lượt tải: 4download
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
Tài liệu liên quan