【发布时间】:2014-06-28 10:52:28
【问题描述】:
我是汇编编程的新手,我正在尝试解码由 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] fun中栈指针减16的逻辑是什么,只涉及一个局部变量。不应该是8吗?
谢谢。
【问题讨论】:
-
无论我尝试什么选项和 gcc 版本,我都无法重现您的程序集:pastebin.com/Fa6TLqWC 使用的编译器:gcc.godbolt.org