gpt4 book ai didi

从汇编代码中调用 fgets

转载 作者:行者123 更新时间:2023-12-01 21:49:09 27 4
gpt4 key购买 nike

我想知道如何从汇编代码中调用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,那么它来自哪里以便我可以使用它?

谢谢

最佳答案

是的,名称位于 esp+17。你最好初始化它。 cdecl 调用约定中的参数从右到左传递,最右边的参数位于堆栈的最深处。 __imp___iob 是从 CRT 导出的,您可以在 stdio.h 头文件中找到它。搜索标准输入。 __imp 前缀是 Microsoft 的约定,旨在加快 DLL 的导出速度。正确地做到这一点显然是编译器的工作。

关于从汇编代码中调用 fgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507692/

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