汇编反汇编

Linuxwindows汇编的区别

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。

基本操作指令

操作数类型:

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    

 

(未完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值