當程序從文件中讀取時,這在GDB中看起來如何。我知道該文件中具有TØ打開等如何在gdb中讀取文件
而且這樣的事情:
call fopen
...
call fread
...
call fclose
,但你可以給我解釋一下「複製字節從文件到程序存儲器」行動?也許以組裝爲例。 其中寄存器是存儲文件內容的文件/程序存儲器的地址。 fopen返回一個句柄。我如何跟蹤?
當程序從文件中讀取時,這在GDB中看起來如何。我知道該文件中具有TØ打開等如何在gdb中讀取文件
而且這樣的事情:
call fopen
...
call fread
...
call fclose
,但你可以給我解釋一下「複製字節從文件到程序存儲器」行動?也許以組裝爲例。 其中寄存器是存儲文件內容的文件/程序存儲器的地址。 fopen返回一個句柄。我如何跟蹤?
您可以輕鬆地通過自己直接寫一個小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
被調用,將結果複製回你的變量。您可以使用您的編譯器和您感興趣的輸入法輕鬆地檢查平臺上生成的代碼。
請注意,如果使用其他庫進行輸入,可能會有更多可能的裝配變體。
如果程序編譯時使用了優化器,程序集甚至可能看起來更奇怪。
嗯,好像你正在學習裝配。 Fopen返回文件的句柄。當你打電話給Fopen時,以及基本上很多其他功能,返回值將被放置在EAX寄存器中,但它也取決於硬件。所以如果你想跟蹤一個文件的句柄,在ASM中調用fopen之後,你應該從EAX寄存器中獲取它。如果你有更多的細節,你應該查找一些教程或裝配書籍。例如Assembly Programming tutorial