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