基本彙編指令

轉自http://blog.csdn.net/wwv386646959/article/details/9020005



基本操作指令

操作數類型:

1.      立即數操作數,也就是常數值。立即數的書寫方式是“$”後面跟一個整數,比如$0x1F,這個會在後面的具體分析中見到很多。

2.      寄存器操作數,它表示某個寄存器的內容,用符號Ea來表示任意寄存器a,用引用R[Ea]來表示它的值,這是將寄存器集合看成一個數組R,用寄存器表示符作爲索引。

3.      操作數是存儲器引用,它會根據計算出來的地址(通常稱爲有效地址)訪問某個存儲器位置。用符號Mb[Addr]表示對存儲在存儲器中從地址Addr開始的b字節值的引用。通常可以省略下標b

下面表格表示多種不同的尋址模式:

操作數類型

 

格式

操作數值

名稱

立即數

 

$Imm

Imm

立即數尋址

寄存器

 

Ea

R[Ea]

寄存器尋址

寄存器

 

Imm

M[Imm]

絕對尋址

寄存器

 

(Ea)

M[R[Ea]]

間接尋址

寄存器

 

   Imm(Eb)

M[Imm+R[Eb]]

(基址+偏移量)尋址

寄存器

 

   (Eb,Ei)

M[R[Eb]+R[Ei]]

變址尋址

寄存器

 

 

M[Imm+R[Eb]+R[Ei]]

 

寄存器

 

(,Ei, s)

M[R[Ei] * s]

 

伸縮化的變址尋址

寄存器

 

Imm(,Ei, s)

M[Imm+R[Ei] * s]]

伸縮化的變址尋址

寄存器

 

(Eb,Ei, s)

M[R[Eb]+R[Ei] * s]

伸縮化的變址尋址

寄存器

 

Imm(Eb,Ei, s)

M[Imm+R[Eb]+R[Ei] * s]

伸縮化的變址尋址

注:操作數可以是立即數值、寄存器值或是來自存儲器的值,伸縮因子必須是124、或者是8

數據傳送指令

在操作指令中,最頻繁使用的指令是執行數據傳送的指令。傳送指令的兩個操作數不能都指向存儲器位置。將一個值從一個存儲器位置拷到另一個存儲器位置需要兩條指令——第一條指令將源值加載到寄存器中,第二條將該寄存器值寫入到目的位置。

下面爲五種傳送指令:

指令                                                                           意義

movl $0x4050,  %eax               立即數——寄存器

movl  %ebp,  %esp                     寄存器——寄存器

movl  %edi, %ecx,  %eax         存儲器——寄存器

movl  $-17,  (%esp)                       立即數——存儲器

movl  %eax, -12(%ebp)                               寄存器——存儲器

常用指令:

指令

效果

描述

movl   S,   D

D ←S

傳送雙字

 

movl   S,   D

 

D ←S

傳送字

movl   S,   D

 

D ←S

傳送字節

movl   S,   D

 

D ←符號擴展(S

傳送符號擴展的字節

movl   S,   D

 

D ←零擴展(S

傳送零擴展的字節

pushl   S

 

R[%esp] ←  R[%esp] – 4;

M[R[%esp]] ← S

壓棧

popl    D

 

D ← M[R[%esp]];

R[%esp] ←  R[%esp] + 4

出棧

算術和邏輯操作

加載有效地址(Load EffectiveAddress)指令lea實際上是mov指令的變形,因爲mov不能夠直接對兩個存儲器操作數,,指令將有效地址寫入到目的操作數(如寄存器)。

整數算術操作:

指令

效果

描述

leal     S , D

D ← &S

加載有效地址

incl     D

decl     D

negl     D

notl     D

D ←  D + 1

D ←  D-1

D ←  -D

D ←  ~D

 1

 1

取負

取補

 

addl     S , D

subl     S , D

iImull    S , D

xorl     S , D

orl      S , D

and     S , D

D ← D  +  S

D ← D  -  S

D ← D  *  S

D ← D  ^  S

D ← D  |  S

D ← D  &   S

加法

減法

乘法

異或

sall      k , D

shll      k , D

sarl      k , D

shrl     k , D

D ← D  << k

D ← D  << k

D ← D  >> k

D ← D  >> k

算術左移

邏輯左移(等同於sal

算術右移(符號位擴展)

邏輯右移  0擴展)

C函數的彙編例子:

intshiftlr(int x, int n)

{

    x <<= 2;

    x >>= n;

    return x;

}

Linux下反彙編代碼爲:

0x080483c4<shiftlr+0>:   push  %ebp

0x080483c5<shiftlr+1>:   mov  %esp,%ebp

0x080483c7<shiftlr+3>:   shll   $0x2,0x8(%ebp)

0x080483cb<shiftlr+7>:   mov  0xc(%ebp),%ecx

0x080483ce<shiftlr+10>:        sarl   %cl,0x8(%ebp)

0x080483d1<shiftlr+13>: mov  0x8(%ebp),%eax

0x080483d4<shiftlr+16>: pop   %ebp

0x080483d5<shiftlr+17>: ret    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章