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