第 7 第 : 第第第第
Jan 02, 2016
第 7 章 : 整數算術
Web site Examples 2
章節概要
• 移位與迴旋指令 • 移位與迴旋指令的應用 • 乘法與除法指令 • 延伸加法與減法 • ASCII 與未緊縮十進制的算術運算
Web site Examples 3
移位與迴旋指令 • 邏輯對算術位移• SHL 指令• SHR 指令• SAL and SAR 指令• ROL 指令• ROR 指令• RCL and RCR 指令• SHLD/SHRD 指令
Web site Examples 4
邏輯對算術位移
• 這種方式會將移位過程中新建立的位元位置填入 0
• 這種方式會將新建立的位元位置,填入 該數值原本的正負號位元 :
CF
0
CF
Web site Examples 5
SHL 指令
• 指令用於對目標運算元執行向左邏輯移位,並 且將最低位元填入 0 。
CF
0
• 運算元類型 :SHL reg,imm8SHL mem,imm8SHL reg,CLSHL mem,CL
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
Web site Examples 7
SHR 指令
• SHR 指令用於對目標運算元執行向右邏輯移位,並 將最高位元填入 0 。 .
CF
0
mov dl,80shr dl,1 ; DL = 40shr dl,2 ; DL = 10
將任何無號的整數向右邏輯移位 n 位元,相當於將其除以 2n
Web site Examples 8
SAL 和 SAR 指令
• SAL ( 向左算術移位 ) 與 SHL 指令是完全一樣的。• SAR ( 向右算術移位 ) 指令則對其目標運算元,執行
算術右移的運算:
CF
算術位移保持數字的符號。
mov dl,-80sar dl,1 ; DL = -40sar dl,2 ; DL = -10
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
Web site Examples 10
ROL 指令• ROL ( 迴旋 ) 指令用於將每個位元向左移位。• 最高位 元將複製到進位旗標以及最低位元位置• 沒有位元遺失
CF
mov al,11110000brol al,1 ; AL = 11100001b
mov dl,3Fhrol dl,4 ; DL = F3h
Web site Examples 11
ROR 指令
• ROR ( 向右迴旋 ) 指令用於將每個位元向右移位• 最低 位元會同時複製到進位旗標與最高位元位置中• 沒有位元遺失
CF
mov al,11110000bror al,1 ; AL = 01111000b
mov dl,3Fhror dl,4 ; DL = F3h
Web site Examples 12
習題 . . .
mov al,6Bhror al,1 a.rol al,3 b.
指出每次迴旋後的 AL 的十六進位值 :
B5hADh
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
Web site Examples 14
RCR 指令
• RCR ( 包含進位旗標的向右迴旋 ) 指令用於將 每個位元向右移位
• 進位旗標會複製到最大有效位元• 最小有效位 元會複製到進位旗標
stc ; CF = 1mov ah,10h ; CF,AH = 00010000 1rcr ah,1 ; CF,AH = 10001000 0
CF
Web site Examples 15
習題 . . .
stcmov al,6Bhrcr al,1 a.rcl al,3 b.
指出每次迴旋後的 AL 的十六進位值:
B5hAEh
Web site Examples 16
SHLD 指令
• 指令用於將目的運算元向左移位指定的位元數• 移位過程中所產生的未定位元,填入來源運算元最大
有效位元的位元值• 來源運算元的值並不會受影響• 語法:
SHLD destination, source, count
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:
Web site Examples 18
SHRD 指令
• 指令用於將目的運算元向右移位指定的位元數• 移位過程中所產生的未定位元位置,則填入來源運算
元最小有效位元的位元值• 來源運算元的值並不會受影響• 語法:
SHRD destination, source, count
Web site Examples 19
SHRD 例題
mov ax,234Bhmov dx,7654hshrd ax,dx,4
在下列例子中, AX 會右移四個位元,而且 DX 的最低四個位元將移位到 AX 的 最高四個位元內:
Before:
After:
7654 234B
7654 4234
DX AX
Web site Examples 20
習題 . . .
mov ax,7C36hmov dx,9FA6hshld dx,ax,4 ; DX =shrd dx,ax,8 ; DX =
指出每個運算元的十六進位值 :
FA67h36FAh
Web site Examples 21
移位與迴旋指令的應用
• 移位多個雙字組• 二進位的乘法• 顯示二進位位元 • 分隔位元串
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
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
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.
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
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
分隔月份的數值 :
Web site Examples 27
乘法和除法指令
• MUL 指令• IMUL 指令• DIV 指令• 有號整數除法• 實行算術語言
Web site Examples 28
MUL 指令• MUL ( 無號數相乘 ) 指令乘一個 8-, 16-, 或 32-bit 被任一運算
元 AL, AX, 或 EAX.
• 指令格式 :MUL r/m8MUL r/m16MUL r/m32
MUL 運算元 :
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 位元的乘積 :
Web site Examples 30
習題 . . .
mov ax,1234hmov bx,100hmul bx
什麼將會是 DX , AX 的十六進位值,和進位標旗在下列的指令執行之後 ?
DX = 0012h, AX = 3400h, CF = 1
Web site Examples 31
習題 . . .
mov eax,00128765hmov ecx,10000hmul ecx
什麼將會是 EDX , EAX 的十六進位值,和進位標旗在下列的指令執行之後 ?
EDX = 00000012h, EAX = 87650000h, CF = 1
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.
Web site Examples 33
IMUL 例題
乘法 4,823,424 * -423:
mov eax,4823424mov ebx,-423imul ebx ; EDX:EAX = FFFFFFFF86635D80h, OF=0
OF=0 因為 EDX 是一個有號延伸 EAX.
Web site Examples 34
習題 . . .
mov ax,8760hmov bx,100himul bx
什麼將是 DX , AX 的十六進位值,和進位標旗在下列的指令執行之後 ?
DX = FF87h, AX = 6000h, OF = 1
Web site Examples 35
DIV 指令
• DIV ( 無號的除法運算 ) 指令用於執行 8 位元、 16 位元和 32 位元的無號整數除法運算
• 一個運算元被供應 (暫存器或者記憶運算元) , 這被假定是除數
• 指令表格 :DIV r/m8DIV r/m16DIV r/m32
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
Web site Examples 37
習題 . . .
mov dx,0087hmov ax,6000hmov bx,100hdiv bx
什麼將是 DX 和 AX 的十六進位值在下列的指令行之後?? 或,如果除法溢位發生,你能指出那當做你的答案 :
DX = 0000h, AX = 8760h
Web site Examples 38
習題 . . .
mov dx,0087hmov ax,6002hmov bx,10hdiv bx
什麼將是 DX 和 AX 的十六進位值在下列的指令行之後?? 或,如果除法溢位發生,你能指出那當做你的答案 :
Divide Overflow
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
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
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
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
Web site Examples 43
習題 . . .
mov ax,0FDFFh ; -513cwdmov bx,100hidiv bx
什麼將是 DX 和 AX 的十六進位值在下列的指令執行之後?或,如果除法溢位發生,寫出你的答案 :
DX = FFFFh (-1), AX = FFFEh (-2)
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
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
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
有時首先計算語法用右手術語是最容易的。
Web site Examples 47
習題 . . .
mov eax,20mul ebxdiv ecx
實作下列語法使用有號 32 位元整數 eax = (ebx * 20) / ecx
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
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)
Web site Examples 50
延伸 ASCII 加法與減法
• ADC 指令• 延伸加法例題• SBB 指令
Web site Examples 51
ADC 指令
• ADC (帶著進位的加法 ) 指令會將來源運算元和進位旗標加 到目的運算元
• 例題 :兩個 32 位元的整數予以相加 (FFFFFFFFh + FFFFFFFFh), 將所 得 64 位元的和 :
mov edx,0mov eax,0FFFFFFFFhadd eax,0FFFFFFFFhadc edx,0 ;EDX:EAX = 00000001FFFFFFFEh
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
顯示完全的原始碼 .
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
Web site Examples 54
ASCII 與緊縮十進制的算術運算
• 未緊縮 BCD• ASCII 十進位• AAA 指令• AAS 指令• AAM 指令• AAD 指令• 緊縮十進制的算術運算• DAA 指令• DAS 指令
Web site Examples 55
未緊縮 BCD
• 二進位編碼把十進位的 ( BCD )數字使用 4 二進位位元代表每個十進位的數字
• 一個數字使用未緊縮 BCD 表示儲存在十進位較低的各自四位元• 舉例來說, 5,678 被儲存當做十六進位位元組的下列序
列 :
05 06 07 08
Web site Examples 56
ASCII 十進位
• 一個數字使用 ASCII 十進位的表示儲存單獨 ASCII 數字在每個位元組
• 範例 , 5,678 被儲存當做十六進位位元組的下列序列 :
35 36 37 38
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'
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
Web site Examples 59
AAM 指令
• AAM ( 在乘法運算之後實行 ASCII 調整 ) 指令用於,將由 MUL 所產生的二進制乘積,轉換成未緊縮十進位 .
mov bl,05h ; first operandmov al,06h ; second operandmul bl ; AX = 001Ehaam ; AX = 0300h
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
Web site Examples 61
緊縮十進制的算術運算
• 緊縮 BCD 儲存二個十進位的每位元組數字• 舉例來說, 12,345,678 能被儲存當做十六進位位元組
的下列序列:
12 34 56 78
沒有在你能使用儲存一個 BCD 數字的位元組的數字上的限制 ,財務的價值時常以 BCD 的格式被儲存,允許高的精密當表演計算的時候
Web site Examples 62
DAA 指令
• DAA ( 在執行加法運算之後實行十進制調整 ) 從 ADD 或 ADC 在 AL 中所產生的二進制總和,轉換為緊縮十進制格式。
• 被調整的值一定要在 AL• 例題 :計算 BCD 35+48
mov al,35hadd al,48h ; AL = 7Dhdaa ; AL = 83h (adjusted)
Web site Examples 63
DAS 指令
• DAS ( 在執行減法運算之後實行十進制調整 ) 指令用於,將被 SUB 或 SBB 指令在 AL 中所產生的二進制結果,轉換為緊縮十進制。
• 值一定要在 AL• 例題 : BCD 48 減去 85
mov al,85hsub al,48h ; AL = 3Dhdas ; AL = 37h (adjusted)
Web site Examples 64
The End