【发布时间】:2011-03-31 23:41:14
【问题描述】:
我想知道如何从汇编代码中调用 fgets。
我读了这些与这个完全相同的问题:How to call fgets in x86 assembly?
还有这个:How to use c library function fgets in assembly language?
但他们两个都不满意,原因有两个:
1. 我真的很想使用 fgets,因为我希望我的代码可以在 windows 和 linux 上运行(我使用的是 NASM)
2.我查看了 fgets 的反汇编版本,不幸的是它没有提供必要的细节来重现它,命名stdin 在汇编中的表示方式。
这是我使用 gcc -S fgets.c 获得的 C 和汇编代码。
fgets.c
#include <stdio.h>
int main()
{
char name[15];
fgets(name, 16, stdin);
return 0;
}
fgets.s
.file "fgets.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl __imp___iob, %eax
movl %eax, 8(%esp)
movl $16, 4(%esp)
leal 17(%esp), %eax
movl %eax, (%esp)
call _fgets
movl $0, %eax
leave
ret
.def _fgets; .scl 2; .type 32; .endef
首先,我不擅长阅读 AT&T 语法,因此很容易理解上述汇编源代码。
那么谁能帮我弄清楚:(i)我的局部变量name在哪里?在 ESP+17 中? (ii) 如果__imp___iob 代表stdin,我可以使用它从哪里来?
谢谢
【问题讨论】:
-
我也不喜欢 AT&T 的语法。使用
gcc -S -masm=intel fgets.c获得更好的反汇编。 -
@Burr:哈哈哈,有点不舒服。谢谢你的提示!!!救了我。