我是汇编编程的新手,我正在尝试解码由64但是GNC编译器(GCC)发出的汇编。
void fun(int a, int b)
{
int h=0;
}
int main()
{
int d = 0;
fun(d,10);
}
这个程序集是
.globl fun
.def fun; .scl 2; .type 32; .endef
fun:
pushq %rbp #
movq %rsp, %rbp #,
subq $16, %rsp #,
movl %ecx, 16(%rbp) # a, a
movl %edx, 24(%rbp) # b, b
movl $0, -4(%rbp) #, h
leave
ret
.def __main; .scl 2; .type 32; .endef
.globl main
.def main; .scl 2; .type 32; .endef
main:
pushq %rbp #
movq %rsp, %rbp #,
subq $48, %rsp #,
call __main #
movl $0, -4(%rbp) #, d
movl -4(%rbp), %eax # d, tmp59
movl $10, %edx #,
movl %eax, %ecx # tmp59,
call fun #
leave
ret
我对这次集会有些怀疑。
[1]从main中的堆栈指针中减去48的精确算法是什么。 [2]有趣的是,我相信从基本指针到访问函数参数的偏移量从16开始(返回地址和基本指针是两个内存位置到堆栈中(堆栈帧是8个字节),但为什么下一个偏移量是24而不是16。
movl %ecx, 16(%rbp) # a, a
movl %edx, 24(%rbp) # b, b
为什么不是: movl%ecx,16(%rbp)#a,a movl%edx,20(%rbp)#b,b
[3]当只涉及一个局部变量时,有趣的是从堆栈指针中减去16的逻辑是什么。不应该是8?
感谢。
答案 0 :(得分:0)
rbp
指向堆栈上的推送rbp
,rbp+8
是返回地址,rbp+16
是第一个参数,rbp+24
是第二个参数。请注意,在64位模式下,堆栈以8字节块的形式使用。对于分数[2]
和[3]
,请参阅相应的abi文档。