汇编笔记

更新于20190929

1. Intel和AT&T汇编

参数是反的,AT&T寄存器前加%,常量前加$
Intel

mov     rax, rcx	;rcx -> rax
mov     cl, 2

对应AT&T

movq    %rcx, %rax	;rcx -> rax
mov    	$2, %cl

后文中如无特殊说明,都是Intel格式

2. 寄存器

64位系统下能用的通用寄存器如下图:
汇编笔记_第1张图片
区别有:

  1. 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
  2. 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
  3. 64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
  4. 64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。

3. 指令

3.1 SHL/SHR 移位指令

移动1位,使用立即数

48 D1 E9          shr     rcx, 1

但是没有shr rcx, 2这种指令。
如果移动位数大于1时,必须将移动位数放在cl中,向下面这么写:

B1 02             mov     cl, 2
D2 E8             shr     al, cl

2.2 LAHF/SAHL 传送指令

LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括:符号标志位SF、零标志位ZF、辅助进位标志位AF、奇偶标志位PF和进位标志位CF。
SAHF(保存 AH 内容到状态标志位)指令将 AH 内容复制到 EFLAGS(或 RFLAGS)寄存器低字节。
一般在函数头使用LAHF指令保存EFLAGS,在函数尾使用SAHF恢复EFLAGS

引用:

64位和32位的寄存器和汇编的比较

你可能感兴趣的:(逆向分析,汇编)