日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Intel汇编程序设计-整数算术指令(上)

發(fā)布時(shí)間:2025/6/17 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Intel汇编程序设计-整数算术指令(上) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第七章?整數(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 ROCRCL指令。

例子:在下面的指令中,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)志的值是位60)而非位7的值:

mov al ,10000000b

shl ?al ,2 ;CF = 0

右移也遵循同樣規(guī)則。

快速乘法:使用SHL指令可以進(jìn)行2的次冪的高速乘法操作。任何操作數(shù)左移n位就相當(dāng)于乘以2n次方。

7.2.3 ?SHR指令

? ? SHR指令是邏輯右移,和邏輯左移格式什么完全一樣。這里不再介紹。

7.2.4 ?SALSAR指令

? ? SAL指令與SHL指令等價(jià)(這句話我糾結(jié)了好久,上面明明說(shuō)算術(shù)移位是符號(hào)位填充,所以我會(huì)認(rèn)為11110000算術(shù)左移之后是11100001結(jié)果卻是11100000果真和SAL一樣)。SAR指令對(duì)目的操作數(shù)執(zhí)行算是右移操作:

?

SARSHR指令的格式與SHLSHR指令的格式相同,移位動(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ò)展AXEAX: 先左移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 ?RCLRCR指令

? ? 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),如果最低位是0RCL指令把數(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指令

? ? SHLDSHRD指令是從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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。