彙編基礎知識3之移位和乘除

2022-07-23 08:21:18 字數 4044 閱讀 8583

彙編真的挺有意思的,整理出了以前的學習的基本知識,為了圖快都拿的書的截圖測試**,但是我親測有效,放心學習之,學彙編,除了這些,上看雪 搜尋玩命,看他的**唄

2018.5.7

shl 指令(邏輯左移)把目的運算元內的每位左移,以0填充最低位。shl 指令的乙個最重要的應用就是用於實現與2 的次冪的快速乘法,把任何運算元左移n 位就相當於乘以了2"

shr 指令(邏輯右移)把運算元的每位右移,並以0填充最高位,把任何運算元右移n位就相當於除以了2」.

sal( 算術左移)和sar( 算術右移)指令是為有符號數的移位特別設計的。他們的高位或者低位填充是根據原來數字的符號位決定的

rol (迴圈左移)指令把每位左移並把最高位同時複製到進製標誌和最低位中。

ror (迴圈右移)指令把每位右移並把最低位同時複製到最高位和進製標誌中。

rcl (帶進製迴圈左移)指令把運算元的每位左移並把最高位複製到進製標誌中,原進製標誌複製到結果的低位。

rcr( 帶進製迴圈右移)指令把每位右移,並把最低位複製到進製標誌中.原進製標誌值複製到結果的最高位。

shld (雙精度左移)和shrd (雙精度右移)指令在1a-32 系列處理器上才能使用,對於大整數的移位是非常有效的。

mul 和imul 指令分別進行有符號整數和無符號整數的乘法操作。div 指令進行無符號整數的除法操作,idiv進行有符號整數的除法操作。

mul(無符號乘法,肯定不會溢位):

mul (無符號乘法)指令有三種格式:

第一種將8 位的運算元與al 相乘;

第二種將16 位的運算元與ax 相乘;

第三種將32 位的運算元與eax 相乘。

乘數和被乘數大小必須相同,乘積的尺寸是乘數/被乘數大小的兩倍。三種格式都既接受暫存器運算元,也接受記憶體運算元,但是不接受立即數運算元。

mul r/m8

mul r/m16

mul r/m32

指令中唯一的乙個運算元是乘數。表7.2 根據乘數大小的不同列出了被乘數和乘積, 由於目的運算元(乘積)是乘數/被乘數大小的兩倍,因此不會發生溢位。如果積的高半部分不為0,就設定進製和溢位標誌。由於進製標誌通常用於無符號算術運算,因此我們主要關注該標誌。例如當ax 與16 位運算元相乘的時候,積儲存在dx:ax 中。如果dx 不為0,則進製標誌置位。

imul指令:

imul指令有三種模式

單運算元模式:

單運算元格式:

單運算元格式把乘積儲存在累加器(ax,dx:ax,edx:eax )中:

imul r/m8 ax = al * r/m byte

imul r/m16 dx:ax = ax * r/m word

imul r/m32 edx: eax= eax * r/m doubleword

和mul 指令一樣,imul 指令的單運算元格式中乘積的尺寸大小使得濫出不可能發生。如果乘積的高半部分不是低半部分的符號擴充套件,進製標誌和溢位標誌置位,可使用該特點確定乘積的高半部分是否可以忽略。

雙運算元格式(值放到第乙個運算元中):

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

imul r16,r/m16

imul r16,imm8

imul r16,imm16

下面是32位運算元的格式,乘數必須是乙個32 位的暫存器、32 位的記憶體運算元或立即數( 8位或32 位) :

imul r32,r/m32

imul r32,imm8

imul r32,imm32

雙運算元格式會根據目的運算元的大小剪裁乘積。如果有效位丟失,則溢位標誌和進製標誌置位。使用雙運算元格式時,務必在執行完imul操作後檢查這些標誌的值。

三運算元格式; 三運算元格式把乘積儲存在第乙個運算元中,乙個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

如果有效位丟失,則溢位標誌和進製標誌置位。使用三運算元格式時,務必在執行完imul操作後檢查這些標誌的值。

div指令:

div( 無符號除法)指令執行8位、16位和32位無符號整數的除法運算。指令中唯一的乙個

暫存器或記憶體運算元是除數,div的指令格式是:

div r/m8

div r/m16

div r/m32

下表顯示了被除數、除數、商及餘數之間的關係。

有符號整數除法:

有符號除法和無符號除法幾乎是完全相同的,唯一的不同在於: 在進行除法操作之前

,隱含的被除數必須進行符號擴充套件。下面首先介紹符號擴充套件指令,然後再介紹有符號除法指令idiv。

符號擴充套件指令:

cbw,cwd cdq 例子如下

cbw指令

cdq指令

idiv指令:

idiv指令和div指令操作一樣,但是每次被除數(也就是al,ax eax)必須要符號擴充套件

想到也知道麼2倍關係 例子:

擴充套件加法減法(任意尺寸的數字加減法)adc(帶進製加)和sbb(帶進製減)

adc(帶進製加):

adc (addwithcarry )指令把源運算元、目的運算元以及進製標誌相加。指令格式與mov指令是一樣的:

sbb指令

stc clc指令

stc設定進製指令為1 clc清0

ascii和未壓縮的十進位制數字加減乘除操作

到現在為止,本書講述的整數算術指令都是處理二進位制數值的,儘管cpu 是以二進位制數方式

進行運算的,但是也能處理asci 十進位制數串的算術運算。後者可以方便地由使用者輸人並在控制

臺視窗中顯示,無須轉換成二進位制數值。假設程式需要使用者輸人兩個數字並把它們相加,下面是

個輸出樣例,其中使用者輸人了3402 和1256:

enter first number : 3402

enter second number :; 1256

the sum is : 4658

在計算和顯示數字的時候有兩種選擇:

1.把兩個運算元轉換成二進位制數值並相加,然後把和從二進位制數轉換成ascii碼數字串的格式後再顯示

2 連續地把每對ascii碼數字直接相加(2+6.0+5.4+2.3+ 1),這樣和就是ascii 數字串,可以直接在螢幕上顯示。

第二種選擇要求在每對ascii數字相加後使用特殊指令來調整其和,指令集中有4 條指令可

以處理這一類的asci 加法、減法、乘法和除法:

壓縮的十進位制數字加減(壓縮十進位制只有加減)

daa 和das

壓縮的十進位制數字和未壓縮的十進位制數字的概念

位測試指令

彙編基礎知識

最近感覺自己學的到了乙個瓶頸,學的不知道有多少是記住的,總是感覺自己要學的東西有那麼多,時間又太少。專業課也越來越多,花在程式設計上的時間就少了,但是這畢竟是我的興趣愛好,所以我不想放棄。昨晚突然有個想法,以後寫部落格的頻率加快,儘管這樣部落格的質量也就下降了很多,但是我還是覺得部落格就是來記錄我成...

彙編 基礎知識

一 進製數的表示 十進位制後加d,二進位制後加b,八進位制加o,十六進製制加h 二 十進位制數轉換為二進位制數或十六進製制數 使用除2取餘法或使用除16取餘法,結果向上讀,如4,得餘數0 0 1,則相應二進位制為100,十六進製制數類似 三 二進位制數或十六進製制數轉換為十進位制數 使用權的展開式 ...

彙編基礎知識

1.si和di 功能和bx相似,只是不能分成2個8暫存器使用。2inc ax指令 將暫存器的內容加1 mov ax,0 inc ax 執行完畢ax 1 3.bx,si,di,bp暫存器 cpu的核心是暫存器,學習彙編這麼一段時間,我也深刻體會到對暫存器理解的重要性 1 在8086cpu中,只有這4個...