Intel汇编程序设计-整数算术指令(上)
第七章?整數算術指令
7.1 簡介
? ? 每種匯編語言都有進行操作數移位的指令,移位和循環移位指令在控制硬件設備、加密數據,以及實現高速的圖形操作時特別有用。本章講述如何進行移位和循環移位操作以及如何使用移位操作進行高效的乘法和出發運算。
? ? 接下來,我們將探究IA-32指令集中的乘法和出發指令,Intel根據運算是有符號還是無符號的對乘法和出發進行分類。本章還講述如何把C++中的數學表達式翻譯成匯編語言。編譯器把符合表達式分解翻譯成一系列機器指令,模擬編譯器有助于理解其工作機制,同時也有助于更好地對匯編語言代碼進行手工優化。通過本章的學習,讀者對操作符優先級以及寄存器的優化(在機器層)的機制將有更深入的理解。
? ? 是否思考過計算機是如何加減多字整數?本章中講述的ADC(帶進位加)指令和SBB(帶進位減)指令是的處理任意大小的整數更容易一些。在本章最后,將講述Intel的一些專門處理壓縮十進制整數數字字符串的算術指令。
7.2 ?移位和循環移位指令
? ? 和第6章介紹的位操作指令一樣,移位指令也是最具匯編語言特性的指令。移位的含義是在操作數內向左或者向右移動數據位,Intel提供了多種移位指令,表中所有的移位指令都影響溢出標志和進位標志。
7.2.1 ?邏輯移位和算術移位
? ? 對于一個數字來說有兩種最進本的移位操作。第一種為邏輯移位,即以0填充最后移出的位。在下圖中,一個邏輯右移移位,請注意位7被賦值0。
?
? ? 假設二進制值11001111向右移動一位,那么得到0110111,最低位數據移入進位標志。
? ?
? ? 另一種移位類型成為算術移位,最后移出去的位用數字原來的符號位填充。
??
? ? 例如,二進制11001111的符號位是1,當算術右移一位的時候,就變成了11100111。
?
7.2.2 ?SHL指令
? ? SHL指令對目標的操作數進行邏輯左移操作,最低位以0填充,溢出的最高位放在進位標志(CF),原來進位標志中的值將丟失。
?
? ? 二進制11001111左移移位就變成了10011110。
?
SHL指令的第一個操作數是目的操作數,第二個操作數是移位的位數:
SHL 目的操作數,移位位數
SHL指令允許使用下面的操作數類型:
SHL reg ,imm8
SHL mem ,imm8
SHL reg ,CL
SHL mem ,CL
Intel8086/8088處理器要求imm8必須等于1,從80286及以上的處理器開始,
imm8可以是0~255之間的整數。在任何Intel處理器上,都可以使用CL存放移位位數。這里列出的格式也適用于SHR SAL SAR ROR ROL ROC和RCL指令。
例子:在下面的指令中,BL被左移一位。最高位被復制到進位標志中,最低位被清零。
mov bl ,8fh
shl bl ,1 ?CF,BL = 1,00011110b
多次移位:一個值多次左移試時,進位標志中的值是最后移出最高有效位(MSB)的數據位。在下面的例子中,進位標志的值是位6(0)而非位7的值:
mov al ,10000000b
shl ?al ,2 ;CF = 0
右移也遵循同樣規則。
快速乘法:使用SHL指令可以進行2的次冪的高速乘法操作。任何操作數左移n位就相當于乘以2的n次方。
7.2.3 ?SHR指令
? ? SHR指令是邏輯右移,和邏輯左移格式什么完全一樣。這里不再介紹。
7.2.4 ?SAL和SAR指令
? ? SAL指令與SHL指令等價(這句話我糾結了好久,上面明明說算術移位是符號位填充,所以我會認為11110000算術左移之后是11100001結果卻是11100000果真和SAL一樣)。SAR指令對目的操作數執行算是右移操作:
?
SAR,SHR指令的格式與SHL,SHR指令的格式相同,移位動作可以根據第二個操作數中的計數進行重復:
SAR 目的操作數,移位位數
下面的例子顯示了SAR復制符號位的情況,AL中的值在右移操作的前后都是負數:
mov ?al ,0f0h ??;al = 11110000b (-16)
sar ??al ,1 ?????;al = 11111000b(-8) CF = 0
有符號數的除法:使用SAR指令可以對有符號數進行除以我的次冪的快速操作。
mov ?dl ,-128 ??;dl = 10000000b ???-128
sar ??dl ,3 ?????;dl = 11110000b ???-16
符號擴展AX至EAX: 先左移EAX16位,然后再算術右移EAX16位;
mov ax ,-128 ???;EAX = ????FF80h
shl eax ,16 ?????;EAX = FF800000h
sar eax ,16 ?????;EAX = FFFFFF80h
7.2.5 ?ROL指令
? ? ROL指令在向左一位后,把最高位同時復制到進位標志和最低位中,其指令格式與SHL指令相同:
? ??
7.2.6 ?ROR指令
? ? 循環右移,不解釋了。
7.2.7 ?RCL和RCR指令
? ? RCL指令在每位左移一位后,把進位標志復制到最低有效位中,把最低有效位復制到進位標志中。
? ? ?
? ? 如果把進位標志想象成一個填充到數字末尾的額外位的話,RCL指令就變成了一條簡單的循環左移指令。在下例中,CLC指令清楚了進位標志,第一條RCL指令把BL的最高位送至進位標志,然后把其他位左移一位,第二條RCL指令把進位標志移入最低位,并把其他所有位左移:
clc ???????????;CF = 0
mov ?bl ,88h ??;CF,BL = 0 ,10001000b
rcl ??bl ,1 ?????;CF,BL =1,00010000b
rcl ??bl,1 ?????;CF,BL =0,00100001b
從進位標志中恢復一個位:RCL指令可以回復以前送入進位標志中的數據位。下面的例子把testval的最低位送入進位標志已進行檢查,如果testval最低位是1,則發生跳轉,如果最低位是0,RCL指令把數字回復成原值:
.data
testval ?BYTE 01101010b
.code
shr ?testval ,1
jc ??exit
rcl ?testval ,1
RCR一樣,只不過是右移 就不說了。
?
7.2.8 ?符號溢出
? ? 在使用移位和循環移位指令對一個有符號整數移位一位后得到的值如果超出了該操作數表示的有符號的范圍,那么溢出標志就會置位。換句話說,在進行移位操作后數字的符號位變反時,溢出標志置位。
mov al ,+127 ??;AL = 01111111b
rol ?al ,1 ?????;OF = 1 ,AL = 11111110b
如果移位或循環移位的移位位數大于1,溢出標志值無定義。
7.2.9 ?SHLD/SHRD指令
? ? SHLD和SHRD指令是從Intel386處理器開始引入的。SHLD指令把目的操作數左移指定的位數,左移出來的位用源操作數的高位來填充。指定對源操作數沒有任何影響,但是符號標志、零標志、輔助進位標志。奇偶標志和進位標志都受影響。
? ? SHLD 目的才作數,源操作數,移位位數
總結
以上是生活随笔為你收集整理的Intel汇编程序设计-整数算术指令(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows核心编程 第四章 进程(下
- 下一篇: Windows核心编程 第五章 作业(上