示例c++源码:
int main(int argc, char** argv)
{
auto sk = argc;
int a = 11 << sk;
int b = 19 + argc;
volatile int rv = a + b * 8;
rv *= sk;
return rv;
}
GUN x86 64bit AT&T 汇编环境下用 g++ -O1 -Wa,-adhln ./main.cc命令反汇编
反汇编源码:
0000 89F9 movl %edi, %ecx
0002 B80B0000 movl $11, %eax
0007 D3E0 sall %cl, %eax
0009 8D84F898 leal 152(%rax,%rdi,8), %eax
0010 0FAFC7 imull %edi, %eax
0013 C3 ret
一点准备知识:
先通过通用寄存器cx来说明一下寄存器的命名,以便理解。
一般来讲,cx是两个字节(一个字,16bit)的通用寄存器。cx的高8位字节叫做ch大写为CH,低8位字节叫做cl大写为CL,ch和cl可以单独再汇编指令中使用。16位寄存器,8086CPU时代的老物件了。接着到了x86-32位时代。寄存器要存储32bit,这时候cx的名字就变为ecx,大写为ECX。仍然是通用寄存器,ecx由两个cx构成,一个高16位cx另一个是低16位cx。进入如今的64位时代,ecx就升级为rcx大写为RCX。同理,AX,BX,DX,DI,SI等都一样的。相对于16为后续更高位宽的cpu计算系统,相应的增加了其他的寄存器,例如支持SSE和AVX并行计算的相关寄存器。如下图示例: