gpt4 book ai didi

assembly - subl在这里做什么?

转载 作者:行者123 更新时间:2023-12-02 22:02:12 24 4
gpt4 key购买 nike

所以...我正在用gcc -S -O2 -m32编译成汇编器:

void h(int y){int x; x=y+1; f(y); f(2); }


它给了我以下几点:

.file   "sample.c"
.text
.p2align 4,,15
.globl h
.type h, @function
h:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call f
movl $2, 8(%ebp)
leave
jmp f
.size h, .-h
.ident "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section .note.GNU-stack,"",@progbits


现在,我知道什么是pushl和movel:它们将当前帧指针存储到堆栈上,然后将帧指针寄存器的值设置为堆栈指针的值。


但是我不知道subes $ 24,%esp是什么。我知道它会将堆栈指针向下移动24个字节。正确?
顺带一提是什么?
为什么movl 8(%ebp),%eax使用8?是8个字节吗?这是否适合返回值+参数y到h?还是我完全不在这里。因此,这意味着从堆栈指针回溯8个字节吗?
mov $ 2,8(%ebp)有什么作用?它将内容2复制到帧指针之前8个字节的位置。当我们调用f时,帧指针是否发生了变化?如果是,则8(%ebp)指向f的参数位置。
请假做什么?如何“删除”堆栈框架?我的意思是你不能只删除一块内存。在文档中说它执行mov(esp,ebp),pop ebp。


谢谢!

最佳答案

编译器在堆栈上为本地人及其任何其他需求保留空间。我不知道为什么要保留24个字节(它似乎不需要或全部使用)。

调用函数f()时,它不使用推指令将参数放在堆栈上,而是使用简单的movl到保留的最后一个位置:

movl    8(%ebp), %eax    ; get the value of `y` passed in to `h()`
movl %eax, (%esp) ; put that value on the stack for call to `f()`


在我看来,更有趣的事情是编译器如何处理对 f(2)的调用:

movl    $2, 8(%ebp)      ; store 2 in the `y` argument passed to `h()`
; since `h()` won't be using `y` anymore
leave ; get rid of the stackframe for `h()`
jmp f ; jump to `f()` instead of calling it - it'll return
; directly to whatever called `h()`




要回答您的问题,“顺便说一下?” -指令引用用来指示该值是在指令操作码中编码的,而不是到达寄存器或存储器位置之类的其他地方。

关于assembly - subl在这里做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465232/

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