gpt4 book ai didi

c - 汇编代码 : logic behind calculating offset into stack

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:06 25 4
gpt4 key购买 nike

我是汇编编程的新手,我正在尝试解码由 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.c 中栈指针减去 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 吗?

谢谢。

最佳答案

  1. 一般来说,您只能猜测编译器为什么会这样做。在这种情况下,显然没有启用优化,因此编译器大概只是分配了一个最坏情况的堆栈帧,它不会被优化下来。您可能想尝试启用优化。
  2. rbp指向入栈的rbprbp+8为返回地址,rbp+16 是第一个参数,rbp+24 是第二个参数。请注意,在 64 位模式下,堆栈以 8 字节 block 的形式使用。
  3. 推测调用约定要求 16 字节对齐。

要点 [2][3] 请参阅相应的 abi 文档。

关于c - 汇编代码 : logic behind calculating offset into stack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com