我想知道如何从汇编代码中调用fgets函数。我读了这些问题,它们与此问题完全相同:如何在x86汇编中调用fgets函数?以及如何在汇编语言中使用C库函数fgets?但两者都不令人满意,因为:
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
,那么它是从哪里来的,这样我就可以使用它了吗?
谢谢
gcc -S -masm = intel fgets.c
获取更好的反汇编。 - Michael Burr