gpt4 book ai didi

c - 堆栈寻址和 esp 使用的行为

转载 作者:行者123 更新时间:2023-12-01 13:46:34 25 4
gpt4 key购买 nike

我有这个 C 代码部分:

#include <stdio.h>
void main()
{
int n, array[1000], c, d, t, e;
char step;

puts("Enter a number\n");
scanf("%d", &n);

puts("any help? [y/n]");
scanf(" %c",&step);

puts("Enter integers\n");
}

我对应的汇编代码:

push prompt1
call _printf
add esp, 4 ;print and add 4 bytes to esp
push num
push sc1
call _scanf
add esp, 8 ;scan and add 8 bytes to esp

section .data
prompt1 db "Enter a number",13,10,0
sc2 db " %c",0 ;other constants

以及在命令提示符下将C文件转换为NASM格式后得到的汇编代码。

mov dword [esp], ?_001       ;?_001 is prompt1                    
call _puts
lea eax, [esp+0FBCH]
mov dword [esp+4H], eax
mov dword [esp], ?_002 ;?_002 is sc1
call _scanf
mov dword [esp], ?_003
call _puts

完整的汇编代码:http://pastebin.com/R6UHRw8x但是,我不理解转换后的汇编代码,因为 mov dword [esp+4H], eax 使用 [esp + 4] 而下一行只使用 [esp]。不应该先 [esp] 然后 [esp + 4] 吗?我不明白,我在文件中看到了很多次。除了 push 和 mov,关于 esp 生成的代码与我的代码有何不同?

最佳答案

编译器输出将 scanf 指针传递给堆栈空间,而不是静态存储。

它让 args 在堆栈上建立而不是在每次调用后弹出(因此它可以使用 mov)。两种方式都无法避免 inserting stack-engine synchronization uops ,不幸的是。

根据 ABI/调用约定,第一个 arg(按 C 顺序)位于最低地址,就在返回地址之上。所以将esp+0FBCH放入[esp+0x4],并将格式字符串指针放入[esp]是正确的。查看为链接标记 wiki。

关于c - 堆栈寻址和 esp 使用的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579073/

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