Top Banner
第 7 第 : 第第第第
64

第 7 章 : 整數算術

Jan 02, 2016

Download

Documents

Solomon Chapman

第 7 章 : 整數算術. 章節概要. 移位與迴旋指令 移位與迴旋指令的應用 乘法與除法指令 延伸加法與減法 ASCII 與未緊縮十進制的算術運算. 移位與迴旋指令. 邏輯對算術位移 SHL 指令 SHR 指令 SAL and SAR 指令 ROL 指令 ROR 指令 RCL and RCR 指令 SHLD/SHRD 指令. 邏輯對算術位移. 這種方式會將移位過程中新建立的位元位置填入 0. 這種方式會將新建立的位元位置,填入 該數值原本的正負號位元 :. SHL 指令. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第  7  章 : 整數算術

第 7 章 : 整數算術

Page 2: 第  7  章 : 整數算術

Web site Examples 2

章節概要

• 移位與迴旋指令 • 移位與迴旋指令的應用 • 乘法與除法指令 • 延伸加法與減法 • ASCII 與未緊縮十進制的算術運算

Page 3: 第  7  章 : 整數算術

Web site Examples 3

移位與迴旋指令 • 邏輯對算術位移• SHL 指令• SHR 指令• SAL and SAR 指令• ROL 指令• ROR 指令• RCL and RCR 指令• SHLD/SHRD 指令

Page 4: 第  7  章 : 整數算術

Web site Examples 4

邏輯對算術位移

• 這種方式會將移位過程中新建立的位元位置填入 0

• 這種方式會將新建立的位元位置,填入 該數值原本的正負號位元 :

CF

0

CF

Page 5: 第  7  章 : 整數算術

Web site Examples 5

SHL 指令

• 指令用於對目標運算元執行向左邏輯移位,並 且將最低位元填入 0 。

CF

0

• 運算元類型 :SHL reg,imm8SHL mem,imm8SHL reg,CLSHL mem,CL

Page 6: 第  7  章 : 整數算術

Web site Examples 6

快速乘法

mov dl,5shl dl,1

SHL 可以執行 2 的次方數的高速乘法

0 0 0 0 1 0 1 0

0 0 0 0 0 1 0 1 = 5

= 10

Before:

After:

mov dl,5shl dl,2 ; DL = 20

如果將十進位 10 左移 2 位元,則結果相當於將其乘以 4

Page 7: 第  7  章 : 整數算術

Web site Examples 7

SHR 指令

• SHR 指令用於對目標運算元執行向右邏輯移位,並 將最高位元填入 0 。 .

CF

0

mov dl,80shr dl,1 ; DL = 40shr dl,2 ; DL = 10

將任何無號的整數向右邏輯移位 n 位元,相當於將其除以 2n

Page 8: 第  7  章 : 整數算術

Web site Examples 8

SAL 和 SAR 指令

• SAL ( 向左算術移位 ) 與 SHL 指令是完全一樣的。• SAR ( 向右算術移位 ) 指令則對其目標運算元,執行

算術右移的運算:

CF

算術位移保持數字的符號。

mov dl,-80sar dl,1 ; DL = -40sar dl,2 ; DL = -10

Page 9: 第  7  章 : 整數算術

Web site Examples 9

習題 . . .

mov al,6Bhshr al,1 a.shl al,3 b.mov al,8Chsar al,1 c.sar al,3 d.

指出每位移後的 AL 的十六進位值 :

35hA8h

C6hF8h

Page 10: 第  7  章 : 整數算術

Web site Examples 10

ROL 指令• ROL ( 迴旋 ) 指令用於將每個位元向左移位。• 最高位 元將複製到進位旗標以及最低位元位置• 沒有位元遺失

CF

mov al,11110000brol al,1 ; AL = 11100001b

mov dl,3Fhrol dl,4 ; DL = F3h

Page 11: 第  7  章 : 整數算術

Web site Examples 11

ROR 指令

• ROR ( 向右迴旋 ) 指令用於將每個位元向右移位• 最低 位元會同時複製到進位旗標與最高位元位置中• 沒有位元遺失

CF

mov al,11110000bror al,1 ; AL = 01111000b

mov dl,3Fhror dl,4 ; DL = F3h

Page 12: 第  7  章 : 整數算術

Web site Examples 12

習題 . . .

mov al,6Bhror al,1 a.rol al,3 b.

指出每次迴旋後的 AL 的十六進位值 :

B5hADh

Page 13: 第  7  章 : 整數算術

Web site Examples 13

RCL 指令

• RCL ( 包含進位旗標的向左迴旋 ) 指令用於將每個位元向 左移位

• 進位旗標會複製到最小有效位元 • 最大有效位元複 製到進位旗標中

CF

clc ; CF = 0mov bl,88h ; CF,BL = 0 10001000brcl bl,1 ; CF,BL = 1 00010000brcl bl,1 ; CF,BL = 0 00100001b

Page 14: 第  7  章 : 整數算術

Web site Examples 14

RCR 指令

• RCR ( 包含進位旗標的向右迴旋 ) 指令用於將 每個位元向右移位

• 進位旗標會複製到最大有效位元• 最小有效位 元會複製到進位旗標

stc ; CF = 1mov ah,10h ; CF,AH = 00010000 1rcr ah,1 ; CF,AH = 10001000 0

CF

Page 15: 第  7  章 : 整數算術

Web site Examples 15

習題 . . .

stcmov al,6Bhrcr al,1 a.rcl al,3 b.

指出每次迴旋後的 AL 的十六進位值:

B5hAEh

Page 16: 第  7  章 : 整數算術

Web site Examples 16

SHLD 指令

• 指令用於將目的運算元向左移位指定的位元數• 移位過程中所產生的未定位元,填入來源運算元最大

有效位元的位元值• 來源運算元的值並不會受影響• 語法:

SHLD destination, source, count

Page 17: 第  7  章 : 整數算術

Web site Examples 17

SHLD 例題

.datawval WORD 9BA6h.codemov ax,0AC36hshld wval,ax,4

9BA6 AC36

BA6A AC36

wval AX

下列敘述會將 wval 左移 4 位元,並且將 AX 的最高四個位元,插入 wval 的最低 四個位元:

Before:

After:

Page 18: 第  7  章 : 整數算術

Web site Examples 18

SHRD 指令

• 指令用於將目的運算元向右移位指定的位元數• 移位過程中所產生的未定位元位置,則填入來源運算

元最小有效位元的位元值• 來源運算元的值並不會受影響• 語法:

SHRD destination, source, count

Page 19: 第  7  章 : 整數算術

Web site Examples 19

SHRD 例題

mov ax,234Bhmov dx,7654hshrd ax,dx,4

在下列例子中, AX 會右移四個位元,而且 DX 的最低四個位元將移位到 AX 的 最高四個位元內:

Before:

After:

7654 234B

7654 4234

DX AX

Page 20: 第  7  章 : 整數算術

Web site Examples 20

習題 . . .

mov ax,7C36hmov dx,9FA6hshld dx,ax,4 ; DX =shrd dx,ax,8 ; DX =

指出每個運算元的十六進位值 :

FA67h36FAh

Page 21: 第  7  章 : 整數算術

Web site Examples 21

移位與迴旋指令的應用

• 移位多個雙字組• 二進位的乘法• 顯示二進位位元 • 分隔位元串

Page 22: 第  7  章 : 整數算術

Web site Examples 22

移位多個雙字組

• 程式有時需要在排列裡面位移所有的位元,可能當移動一個點陣圖的圖解從一個螢幕點到另外一的影像的時候

• 下列各項改變對右邊的 1 位元 3 雙字組 的排列 : (視野完全的原始碼)

.dataArraySize = 3array DWORD ArraySize DUP(99999999h) ; 1001 1001....codemov esi,0shr array[esi + 8],1 ; high dwordrcr array[esi + 4],1 ; middle dword, include Carryrcr array[esi],1 ; low dword, include Carry

Page 23: 第  7  章 : 整數算術

Web site Examples 23

二進位乘法

• 當乘數為 2 的次方數時, SHL 指令可以有 效率地執行無號數的乘法運算。

• 將一個無號整數向左移位 n 位元,相當於對它乘以 2n. • 例如,如果想要將無號的 EAX 乘以 36 ,我們可

以將 36 分解成 25 + 22 ,並且使用乘法的分配律完成運算

EAX * 36 = EAX * (32 + 4)= (EAX * 32)+(EAX * 4)

mov eax,123mov ebx,eaxshl eax,5 ; mult by 25

shl ebx,2 ; mult by 22

add eax,ebx

Page 24: 第  7  章 : 整數算術

Web site Examples 24

習題 . . .

mov ax,2 ; test value

mov dx,axshl dx,4 ; AX * 16push dx ; save for latermov dx,axshl dx,3 ; AX * 8shl ax,1 ; AX * 2add ax,dx ; AX * 10pop dx ; recall AX * 16add ax,dx ; AX * 26

無號整數相乘 26, 使用位移和加法指令 .

Hint: 26 = 16 + 8 + 2.

Page 25: 第  7  章 : 整數算術

Web site Examples 25

顯示二進位位元

運算法則:位移 MSB 進入旗標中;如果 CF = 1, 對字串加一個 "1" 字元;否則,加一個 "0" 字元。在一個迴路, 32 次重複。

mov ecx,32mov esi,offset buffer

L1: shl eax,1mov BYTE PTR [esi],'0'jnc L2mov BYTE PTR [esi],'1'

L2: inc esiloop L1

Page 26: 第  7  章 : 整數算術

Web site Examples 26

分隔位元串

• MS-DOS 檔案日期領域包含年,月和日進入 16 位元 :

DH DL

Year Month Day

9-15 5-8 0-4Field:

Bit numbers:

01 000 10 1 10 1 010 10

mov ax,dx ; make a copy of DXshr ax,5 ; shift right 5 bitsand al,00001111b ; clear bits 4-7mov month,al ; save in month variable

分隔月份的數值 :

Page 27: 第  7  章 : 整數算術

Web site Examples 27

乘法和除法指令

• MUL 指令• IMUL 指令• DIV 指令• 有號整數除法• 實行算術語言

Page 28: 第  7  章 : 整數算術

Web site Examples 28

MUL 指令• MUL ( 無號數相乘 ) 指令乘一個 8-, 16-, 或 32-bit 被任一運算

元 AL, AX, 或 EAX.

• 指令格式 :MUL r/m8MUL r/m16MUL r/m32

MUL 運算元 :

Page 29: 第  7  章 : 整數算術

Web site Examples 29

MUL 例題

將 16 位元的數值 2000h ,乘以 100h :

.dataval1 WORD 2000hval2 WORD 100h.codemov ax,val1mul val2 ; DX:AX = 00200000h, CF=1

檢查進位旗標可以知道乘積的上半部是否能無虞地予以忽略

mov eax,12345hmov ebx,1000hmul ebx ; EDX:EAX = 0000000012345000h, CF=0

將 12345h 乘以 1000h ,結果產生了 32 位元的乘積 :

Page 30: 第  7  章 : 整數算術

Web site Examples 30

習題 . . .

mov ax,1234hmov bx,100hmul bx

什麼將會是 DX , AX 的十六進位值,和進位標旗在下列的指令執行之後 ?

DX = 0012h, AX = 3400h, CF = 1

Page 31: 第  7  章 : 整數算術

Web site Examples 31

習題 . . .

mov eax,00128765hmov ecx,10000hmul ecx

什麼將會是 EDX , EAX 的十六進位值,和進位標旗在下列的指令執行之後 ?

EDX = 00000012h, EAX = 87650000h, CF = 1

Page 32: 第  7  章 : 整數算術

Web site Examples 32

IMUL 指令• IMUL ( 有號數相乘 ) 增加一個 8,16, 或 32 位元有符

號運算任一 AL , AX ,或 EAX• 指令會保存乘積的正負號,藉以執行 有號整數的乘法

運算

例題 : 乘法 48 * 4, 使用 8-bit 運算 :

mov al,48mov bl,4imul bl ; AX = 00C0h, OF=1

OF=1 因為 AH 不是一個有號延伸 AL.

Page 33: 第  7  章 : 整數算術

Web site Examples 33

IMUL 例題

乘法 4,823,424 * -423:

mov eax,4823424mov ebx,-423imul ebx ; EDX:EAX = FFFFFFFF86635D80h, OF=0

OF=0 因為 EDX 是一個有號延伸 EAX.

Page 34: 第  7  章 : 整數算術

Web site Examples 34

習題 . . .

mov ax,8760hmov bx,100himul bx

什麼將是 DX , AX 的十六進位值,和進位標旗在下列的指令執行之後 ?

DX = FF87h, AX = 6000h, OF = 1

Page 35: 第  7  章 : 整數算術

Web site Examples 35

DIV 指令

• DIV ( 無號的除法運算 ) 指令用於執行 8 位元、 16 位元和 32 位元的無號整數除法運算

• 一個運算元被供應 (暫存器或者記憶運算元) , 這被假定是除數

• 指令表格 :DIV r/m8DIV r/m16DIV r/m32

Page 36: 第  7  章 : 整數算術

Web site Examples 36

DIV 例題

指令執行 16 位元無號數除法運算 (8003h / 100h):

mov dx,0 ; clear dividend, highmov ax,8003h ; dividend, lowmov cx,100h ; divisordiv cx ; AX = 0080h, DX = 3

指令執行的是 32 位元無號數除法運算 :

mov edx,0 ; clear dividend, highmov eax,8003h ; dividend, lowmov ecx,100h ; divisordiv ecx ; EAX = 00000080h, DX = 3

Page 37: 第  7  章 : 整數算術

Web site Examples 37

習題 . . .

mov dx,0087hmov ax,6000hmov bx,100hdiv bx

什麼將是 DX 和 AX 的十六進位值在下列的指令行之後?? 或,如果除法溢位發生,你能指出那當做你的答案 :

DX = 0000h, AX = 8760h

Page 38: 第  7  章 : 整數算術

Web site Examples 38

習題 . . .

mov dx,0087hmov ax,6002hmov bx,10hdiv bx

什麼將是 DX 和 AX 的十六進位值在下列的指令行之後?? 或,如果除法溢位發生,你能指出那當做你的答案 :

Divide Overflow

Page 39: 第  7  章 : 整數算術

Web site Examples 39

有號整數除法• 有號整數一定是符號延伸在除法發生之前

• 高的位元組/字/雙字組複製符號教低位元組/字/雙字組

• 舉例來說,高的位元組包含符號的複製從低的位元組 :

1 0 0 0 1 1 1 1

1 0 0 0 1 1 1 11 1 1 1 1 1 1 1

Page 40: 第  7  章 : 整數算術

Web site Examples 40

CBW, CWD, CDQ 指令

• CBW, CWD, 和 CDQ 指令提供• 重要的有號延長的運算 :

• CBW ( 將位元組轉換成字組 ) 將 AL 的符號 位元,延伸到 AH • CWD ( 將字組轉換成雙字組 ) 將 AX 的符號位元,延伸進 DX• CDQ ( 將雙字組轉換成四字組 ) 將 EAX 的符號位元,延伸進

EDX • 舉例 :

mov eax,0FFFFFF9Bhcdq ; EDX:EAX = FFFFFFFFFFFFFF9Bh

Page 41: 第  7  章 : 整數算術

Web site Examples 41

IDIV 指令

• IDIV ( 有號除法 ) 有號整數除法運算• 使用的運算元與 DIV 一樣

例題 : 8-bit 指令會將 -48 除以 5 。mov al,-48cbw ; extend AL into AHmov bl,5idiv bl ; AL = -9, AH = -3

Page 42: 第  7  章 : 整數算術

Web site Examples 42

IDIV 例題

Example: 32-bit -48 除以 5

mov eax,-48cdq ; extend EAX into EDXmov ebx,5idiv ebx ; EAX = -9, EDX = -3

Example: 16-bit -48 除以 5

mov ax,-48cwd ; extend AX into DXmov bx,5idiv bx ; AX = -9, DX = -3

Page 43: 第  7  章 : 整數算術

Web site Examples 43

習題 . . .

mov ax,0FDFFh ; -513cwdmov bx,100hidiv bx

什麼將是 DX 和 AX 的十六進位值在下列的指令執行之後?或,如果除法溢位發生,寫出你的答案 :

DX = FFFFh (-1), AX = FFFEh (-2)

Page 44: 第  7  章 : 整數算術

Web site Examples 44

實作算術運算式 (1 of 3)

• 一些好推論學習該如何推做語法 :• 學習如何編輯• 測試你的 MUL , IMUL , DIV 和 IDIV 的理解• 32 位元溢位的檢查

例題 : var4 = (var1 + var2) * var3

mov eax,var1add eax,var2mul var3jo TooBig ; check for overflowmov var4,eax ; save product

Page 45: 第  7  章 : 整數算術

Web site Examples 45

實作算術運算式 (2 of 3)

例題 : eax = (-var1 * var2) + var3

mov eax,var1neg eaxmul var2jo TooBig ; check for overflowadd eax,var3

例題 : var4 = (var1 * 5) / (var2 – 3)

mov eax,var1 ; left sidemov ebx,5mul ebx ; EDX:EAX = productmov ebx,var2 ; right sidesub ebx,3div ebx ; final divisionmov var4,eax

Page 46: 第  7  章 : 整數算術

Web site Examples 46

實作算術運算式 (3 of 3)

例題 : var4 = (var1 * -5) / (-var2 % var3);

mov eax,var2 ; begin right sideneg eaxcdq ; sign-extend dividendidiv var3 ; EDX = remaindermov ebx,edx ; EBX = right sidemov eax,-5 ; begin left sideimul var1 ; EDX:EAX = left sideidiv ebx ; final divisionmov var4,eax ; quotient

有時首先計算語法用右手術語是最容易的。

Page 47: 第  7  章 : 整數算術

Web site Examples 47

習題 . . .

mov eax,20mul ebxdiv ecx

實作下列語法使用有號 32 位元整數 eax = (ebx * 20) / ecx

Page 48: 第  7  章 : 整數算術

Web site Examples 48

習題 . . .

push ecxpush edxpush eax ; EAX needed latermov eax,ecxmul edx ; left side: EDX:EAXpop ecx ; saved value of EAXdiv ecx ; EAX = quotientpop edx ; restore EDX, ECXpop ecx

實作下列語法使用有號 32 位元整數 .貯存而且回復 ECX 和 EDX :

eax = (ecx * edx) / eax

Page 49: 第  7  章 : 整數算術

Web site Examples 49

習題 . . .

mov eax,var1mov edx,var2neg edxmul edx ; left side: edx:eaxmov ecx,var3sub ecx,ebxdiv ecx ; eax = quotientmov var3,eax

實作下列語法使用有號 32 位元整數 . 不要修正任何變數除了 var3 :

var3 = (var1 * -var2) / (var3 – ebx)

Page 50: 第  7  章 : 整數算術

Web site Examples 50

延伸 ASCII 加法與減法

• ADC 指令• 延伸加法例題• SBB 指令

Page 51: 第  7  章 : 整數算術

Web site Examples 51

ADC 指令

• ADC (帶著進位的加法 ) 指令會將來源運算元和進位旗標加 到目的運算元

• 例題 :兩個 32 位元的整數予以相加 (FFFFFFFFh + FFFFFFFFh), 將所 得 64 位元的和 :

mov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFhadc edx,0 ;EDX:EAX = 00000001FFFFFFFEh

Page 52: 第  7  章 : 整數算術

Web site Examples 52

延伸加法運算的範例• 增加任何大小的二個整數• 加法和總數的途徑指標• ECX 指令字的數字

L1: mov eax,[esi] ; get the first integeradc eax,[edi] ; add the second integerpushfd ; save the Carry flagmov [ebx],eax ; store partial sumadd esi,4 ; advance all 3 pointersadd edi,4add ebx,4popfd ; restore the Carry flagloop L1 ; repeat the loopadc word ptr [ebx],0 ; add any leftover carry

顯示完全的原始碼 .

Page 53: 第  7  章 : 整數算術

Web site Examples 53

SBB 指令• SBB (帶著借位的減法 ) 指令用於將目的運算元,減 去進位旗標和

來源運算元。• 在此過程中,程式碼會設定 EDX:EAX 為

0000000100000000h ,並且將其減去 1 • 旗標 : 減去上半部的 32 位元,執行過程中,也會考慮到進位旗

標旗標 :mov edx,1 ; upper halfmov eax,0 ; lower halfsub eax,1 ; subtract 1sbb edx,0 ; subtract upper half

Page 54: 第  7  章 : 整數算術

Web site Examples 54

ASCII 與緊縮十進制的算術運算

• 未緊縮 BCD• ASCII 十進位• AAA 指令• AAS 指令• AAM 指令• AAD 指令• 緊縮十進制的算術運算• DAA 指令• DAS 指令

Page 55: 第  7  章 : 整數算術

Web site Examples 55

未緊縮 BCD

• 二進位編碼把十進位的 ( BCD )數字使用 4 二進位位元代表每個十進位的數字

• 一個數字使用未緊縮 BCD 表示儲存在十進位較低的各自四位元• 舉例來說, 5,678 被儲存當做十六進位位元組的下列序

列 :

05 06 07 08

Page 56: 第  7  章 : 整數算術

Web site Examples 56

ASCII 十進位

• 一個數字使用 ASCII 十進位的表示儲存單獨 ASCII 數字在每個位元組

• 範例 , 5,678 被儲存當做十六進位位元組的下列序列 :

35 36 37 38

Page 57: 第  7  章 : 整數算術

Web site Examples 57

AAA 指令

• AAA ( 加法運算以後實行 ASCII ) 指 令,可以對 ADD 或 ADC 所產生的二進制結果進行調整。• 進位值,如果任何的結束提高在 AH

• 例題 : 8 和 2 正確地相加

mov ah,0mov al,'8' ; AX = 0038hadd al,'2' ; AX = 006Ahaaa ; AX = 0100h (adjust result)or ax,3030h ; AX = 3130h = '10'

Page 58: 第  7  章 : 整數算術

Web site Examples 58

AAS 指令

• AAS ( 減法運算之後實行 ASCII 調整 ) SUB 或 SBB 指令則會將兩個未緊縮的十進 位值予以相減,並且將結果存放在 AL 中

• 表示 .• 它放置進位值,如果任何的 AH

• 例題 : 8 減去 9

mov ah,0mov al,'8' ; AX = 0038hsub al,'9' ; AX = 00FFhaas ; AX = FF09h (adjust result)pushf ; save Carry flagor al,30h ; AX = FF39h (AL = '9')popf ; restore Carry flag

Page 59: 第  7  章 : 整數算術

Web site Examples 59

AAM 指令

• AAM ( 在乘法運算之後實行 ASCII 調整 ) 指令用於,將由 MUL 所產生的二進制乘積,轉換成未緊縮十進位 .

mov bl,05h ; first operandmov al,06h ; second operandmul bl ; AX = 001Ehaam ; AX = 0300h

Page 60: 第  7  章 : 整數算術

Web site Examples 60

AAD 指令

• The AAD ( 在除法運算之前實行 ASCII 調整 ) 指令 用於將存放於 AX 中的未緊縮十進制被除數

.dataquotient BYTE ?remainder BYTE ?.codemov ax,0307h ; dividendaad ; AX = 0025hmov bl,5 ; divisordiv bl ; AX = 0207hmov quotient,almov remainder,ah

Page 61: 第  7  章 : 整數算術

Web site Examples 61

緊縮十進制的算術運算

• 緊縮 BCD 儲存二個十進位的每位元組數字• 舉例來說, 12,345,678 能被儲存當做十六進位位元組

的下列序列:

12 34 56 78

沒有在你能使用儲存一個 BCD 數字的位元組的數字上的限制 ,財務的價值時常以 BCD 的格式被儲存,允許高的精密當表演計算的時候

Page 62: 第  7  章 : 整數算術

Web site Examples 62

DAA 指令

• DAA ( 在執行加法運算之後實行十進制調整 ) 從 ADD 或 ADC 在 AL 中所產生的二進制總和,轉換為緊縮十進制格式。

• 被調整的值一定要在 AL• 例題 :計算 BCD 35+48

mov al,35hadd al,48h ; AL = 7Dhdaa ; AL = 83h (adjusted)

Page 63: 第  7  章 : 整數算術

Web site Examples 63

DAS 指令

• DAS ( 在執行減法運算之後實行十進制調整 ) 指令用於,將被 SUB 或 SBB 指令在 AL 中所產生的二進制結果,轉換為緊縮十進制。

• 值一定要在 AL• 例題 : BCD 48 減去 85

mov al,85hsub al,48h ; AL = 3Dhdas ; AL = 37h (adjusted)