在Linux环境下,常用的反汇编命令是objdump -Sd file
。该命令采用的是AT&T格式,与Intel格式有一些不同之处, 主要的区别是源操作数和目标操作数的顺序是相反的。
测试环境: GCC4.8.5 -O3
基础知识
常见的汇编子程序实现方式是利用栈帧的概念。SP指向栈顶,入栈操作会使SP减少,而出栈操作则会使SP增加。
int/float 传参
根据System V AMD64 ABI,前六个整数或指针参数是通过寄存器RDI、RSI、RDX、RCX、R8和R9传递,浮点参数是通过XMM0、XMM1、XMM2、XMM3、XMM4、XMM5和XMM6来传递的。
结构体参数
如果结构体不大于16个字节, 则通过寄存器传值, 否则通过堆栈传值或返回.
小结构体参数
in参数通过%rsi、%rdx传入, 返回值通过%rax和%rdx传出
大结构体参数
在主调函数中,in变量的地址是0x20(%rsp),out变量的地址是0x40(%rsp),
将out变量作为第一个参数,将函数声明的第一个参数int i作为第二个参数,将函数声明的第二个参数struct large in放入堆栈
本文链接, 未经许可,禁止转载