概述
Linux与windows汇编的区别
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] | 伸缩化的变址寻址 |
注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是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
(未完)
最后
以上就是和谐橘子为你收集整理的汇编反汇编Linux与windows汇编的区别基本操作指令算术和逻辑操作的全部内容,希望文章能够帮你解决汇编反汇编Linux与windows汇编的区别基本操作指令算术和逻辑操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复