繁体   English   中英

汇编代码:计算偏移量到堆栈中的逻辑

[英]Assembly code: logic behind calculating offset into stack

我是汇编编程的新手,我正在尝试对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,movl%edx,20(%rbp)#b,b

[3]当只涉及一个局部变量时,从堆栈指针中减去16的逻辑是什么? 不应该是8吗?

谢谢。

  1. 通常,您只能猜测编译器为什么会执行它的操作。 在这种情况下,显然不会启用优化,因此编译器可能只是分配了一个最坏情况的堆栈帧,而该堆栈帧并未得到优化。 您可能要尝试启用优化。
  2. rbp指向堆栈中压入的rbprbp+8是返回地址, rbp+16是第一个参数, rbp+24是第二个参数。 请注意,在64位模式下,堆栈使用8个字节块。
  3. 大概调用约定要求16字节对齐。

对于点[2][3]请参见相应的abi文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM