当程序从文件中读取时,这在GDB中是怎样的。我知道该文件已被打开等。
也是这样的:
call fopen
...
call fread
...
call fclose
但你能解释一下“从文件到程序存储器的复制字节”动作吗?也许有一个装配的例子。 其中寄存器是存储文件内容的文件/文件存储器的地址。 fopen返回一个句柄。我该如何追踪?
答案 0 :(得分:2)
好吧,看起来你正在寻求学习装配。 Fopen返回文件的句柄。当您调用Fopen时,基本上许多其他函数的返回值将放在EAX寄存器中,但它也取决于硬件。因此,如果要跟踪文件的句柄,在ASM中调用fopen之后,应该从EAX寄存器中获取它。如果您对更多细节感兴趣,您应该查找一些教程或汇编书籍。例如Assembly Programming tutorial
答案 1 :(得分:2)
只需编写一个小C
程序,您就可以轻松地自行检查:
#include <stdio.h>
int main() {
char c;
FILE *f = fopen("hello.txt", "r");
c=fgetc(f);
fclose(f);
return 0;
}
然后使用切换到输出程序集来编译它,对于gcc:gcc -S -O0 hello.c
(-S
告诉gcc输出程序集,-O0
禁用优化程序)。
然后查看hello.s
,您将看到为此代码生成的程序集:
...
subq $16, %rsp
movl $.LC0, %esi
movl $.LC1, %edi
call fopen
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movq %rax, %rdi
call fgetc
movb %al, -9(%rbp) <--- here a byte gets moved from a register to variable c
movq -8(%rbp), %rax
movq %rax, %rdi
call fclose
...
基本上调用函数fgets
或fgetc
并将结果复制回变量。您可以使用编译器和您感兴趣的输入法轻松检查平台上生成的代码。
请注意,如果使用其他库进行输入,可能会有更多可能的程序集变体。
如果在编译程序时使用了优化器,那么程序集可能看起来更奇怪。