gpt4 book ai didi

c - 从 C 代码理解 x86 汇编代码

转载 作者:行者123 更新时间:2023-12-02 15:51:20 25 4
gpt4 key购买 nike

C 代码:

#include <stdio.h>

main() {
int i;
for (i = 0; i < 10; i++) {
printf("%s\n", "hello");
}
}

ASM:

    .file   "simple_loop.c"
.section .rodata
.LC0:
.string "hello"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp # push ebp onto stack
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp # setup base pointer or stack ?
.cfi_def_cfa_register 5
andl $-16, %esp # ?
subl $32, %esp # ?
movl $0, 28(%esp) # i = 0
jmp .L2
.L3:
movl $.LC0, (%esp) # point stack pointer to "hello" ?
call puts # print "hello"
addl $1, 28(%esp) # i++
.L2:
cmpl $9, 28(%esp) # if i < 9
jle .L3 # goto l3
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret

所以我正在努力提高对 x86 汇编代码的理解。对于上面的代码,我划出了我认为我理解的内容。至于问号内容,有人可以分享一下吗?另外,如果我的评论有任何错误,请告诉我。

最佳答案

andl    $-16, %esp # ? 
subl $32, %esp # ?

这会在堆栈上保留一些空间。首先,andl 指令将 %esp 寄存器向下舍入到 16 字节的下一个最低倍数(练习:找出 -16 的二进制值是多少) code> 是为了看看为什么)。然后,subl 指令将堆栈指针向下移动一点(32 字节),保留更多空间(接下来将使用该空间)。我怀疑进行这种舍入是为了通过 %esp 寄存器进行访问稍微更有效(但您必须检查处理器数据表以找出原因)。

movl    $.LC0, (%esp) # point stack pointer to "hello" ?

这会将字符串 "hello"地址放入堆栈中(该指令不会更改 %esp 的值自行注册)。显然,您的编译器认为直接将数据移动到堆栈上比使用 push 指令更有效。

关于c - 从 C 代码理解 x86 汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651266/

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