作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 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]
是正确的。查看x86为链接标记 wiki。
关于c - 堆栈寻址和 esp 使用的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579073/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!