我想知道如何從彙編代碼調用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
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'得到更好的拆卸。 – 2011-04-01 00:09:28
@Burr:哈哈哈,這有點不舒服。謝謝你的提示!!!救了我。 – Khan2011 2011-04-01 00:46:14