從今天起開始學習intel彙編 四 整數算術指令

2021-06-22 13:43:50 字數 2916 閱讀 3539

一 移位和迴圈移位指令

1.邏輯移位和算術移位

邏輯移位是以0填充移出的位

算術移位是以符號位填充移出的位

2.shl指令

對目的運算元做邏輯左移操作,最低位以0填充,並將最後移出的位放入cf標誌中

mov al, 10001111b

shl al, 2        ;cf = 0    

3.shr指令

對目的運算元做邏輯右移運算,移出的資料位以0代替, 最後移出的位被放進cf標誌中

mov al, 00000010b

shr al, 2       ;cf = 1

4.sal和sar指令

sal與shl等價, sar執行算術右移

mov al, 11110000b

sar al, 1    ; al = 11111000, cf = 0

5.rol指令

rol指令在想左移移位後,把移出的位同時複製到進製標誌和最低位中。

mov al, 01000000b

rol al, 1    ;al = 10000000b, cf = 0

rol al, 1    ;al = 00000001b, cf = 1

6.ror指令

向右移位, 把移出的位複製到進製標誌和最高位中。

mov al, 00000001b

ror al, 1    ;al = 10000000b, cf = 1

7.rcl和rcr指令

rcl指令在每位左移後, 把進製標誌複製到最低有效位中,把最高有效位複製到進製標誌

這個指令可以用來從進製標誌中恢復乙個位:

.data

testval byte 01101010b

.code

shr testval, 1     ;右移移位

jc exit            ;如果最低位是1, 跳轉

rcl testval, 1     ;否則恢復該位

rcr指令把每位右移, 把進製標誌複製到最高有效位中,並把最低有效位複製到進製標誌中

8.shld/shrd指令

shld把目的運算元左移指定位數,左移空出來的位用源運算元的高位填充,指令對源運算元沒影響

暫存器標誌位受影響

shld 目的運算元,源運算元,移位位數

shrd把目的運算元向右移動指定位數,空出來的位由源運算元的低位填充。

shrd 目的運算元, 源運算元, 移位位數

二 乘法和除法指令

1.mul指令

無符號mul有三種格式  

將8位運算元和al相乘 mul r/m8  結果存放到 ax中

將16位運算元和ax相乘 mul r/m16 結果存放到 dx:ax中

將32位運算元和eax相乘 nul r/m32 結果存放到 edx:eax中

如果積的高半部分不為0, 就設定進製和溢位標誌。由於是無符號,只關心進製標誌

mov al, 5h

mov bl, 10h

mul bl     ;ax = 50h, cf = 0

mov ax, 2000h

mov bx, 0100h

mul bx        ; dx:ax= 00200000h, cf=1

2.imul指令

imul執行有符號整數的乘法, 保留乘積的符號位,imul指令由三種格式,單運算元, 雙運算元,三運算元。

單運算元把乘積儲存在累加器中

imul r/m8   存放到ax

imul, r/m16 存放到dx:ax中

imul, r/m32 存放到esx:eax中

如果乘積的高半部分不是低半部分的符號擴充套件, 進製標誌和溢位標誌置位

雙運算元格式把乘積儲存在第乙個運算元中,第乙個運算元必須是暫存器,第二個運算元可以是暫存器,記憶體或者立即數:

imul r16, r/m16

imul r16, imm8

imul r16, imm16

imul r32, r/m32

imul r32, imm8

imul r32, imm32

雙運算元格式會根據運算元的大小進行裁剪, 如果有效位丟失, 則溢位標誌和進製標誌置位。

三運算元格式吧乘積儲存在第乙個運算元中, 乙個16位的暫存器可被乙個8位或16位的立即數乘

imul r16, r/m16, imm8

imul r16, r/m16, imm16

乙個32位暫存器可被乙個8位或者32位的立即數相乘:

imul r32, r/m32, imm8

imul r32, r/m32, imm32

如果有效位丟失,則進製和溢位標誌置位。

3.div指令無符號整數除法

執行8位, 16位, 32位無符號整數除法運算指令中唯一的乙個暫存器或者記憶體運算元是除數

div r/m8  被除數ax 商 al 餘數ah

div r/m16 被除數dx:ax 商ax 餘數dx

div r/m32 被除數edx:eax 商eax 餘數edx

4. idiv 有符號整數除法

在進行除法之前,隱含的被除數必須進行符號擴充套件

符號擴充套件指令cbw 擴充套件al的符號位到ah中。

cwd指令擴充套件ax符號至dx中

cdq擴充套件eax的符號位至edx中

下面是-48除以5

mov al, -48

cbwmov bl, 5

idiv bl

三 擴充套件加法

1.adc指令

把源運算元,目的運算元以及進製標誌相加, 指令格式與mov指令是一樣的

mov dl, 0

mov al, 0ffh

add al, 0ffh

adc dl, 0     ;dl = 1

2.sbb指令

從目的運算元中減去源運算元和進製標誌的值,指令允許運算元與adc指令相同

從今天起,堅持寫部落格!!!

讀書的時候有一些感觸,那就是寫部落格對乙個開發者的重要性。所以為了成為乙個一流的開發者,我也要踏上寫部落格的萬里長征中去。以下引自徐老師的 android群英傳 神兵利器 也是我開始寫部落格的緣由,畢竟我現在才大三,比徐老師開始寫部落格的時候還早一年哩!寫作究竟能帶給開發者哪些好處?在寫作的過程中,...

從今天起 早睡早起

身體器官工作表一覽,睡覺別太晚了 任何試圖更改生物鐘的行為,都將給身體留下莫名其妙的疾病,20 30年之後再後悔,已經來不及了。一 晚上9 11點為免疫系統 淋巴 排毒時間,此段時間應安靜或聽 二 晚間11 凌晨1點,肝的排毒,需在熟睡中進行。三 凌晨1 3點,膽的排毒,亦同。四 凌晨3 5點,肺的...

從今天起不無聊了

對於知識來說,只學不用,時間長了,就和沒學過差不多。今天終於有事情做了,要寫乙個bho或者activex控制項實現簡單的兩個功能吧,對於只能用各種語言寫個hello world的我來說還是蠻有挑戰性的,因為我對windows系統程式設計不怎麼了解 linux的也不怎麼了解 所以應該不會太容易,我感覺...