2014-12-03 185 views
0

我是X86彙編語言的初學者。我知道如何從標準輸入讀取並使用內置函數寫入標準輸出,但我不知道如何用普通的彙編代碼(即操作寄存器和利用系統調用)來完成這項工作。X86從標準輸入讀取並寫入標準輸出而不用參考標準庫

#include <stdio.h> 
#include <unistd.h> 

int main(){ /* copy input to output */ 
    char buf[BUFSIZ]; 
    int n; 

    while ((n = read(0, buf, BUFSIZ)) > 0) 
     write(1, buf, n); 

    return 0; 
} 

這是C代碼我寫首先從標準輸入(由數字0表示)讀然後寫到標準輸出(由數字1表示)。任何人都可以幫我把它轉換成普通的彙編代碼(NO「call read」&「call write」please)?

語法並不重要,但32位AT & T是首選,因爲我一直在使用它:)先謝謝了!

回答

1

對於您使用的任何操作系統,系統調用都應該有詳細記錄。

例如,請參閱Linux的here

所以,你的情況,從標準輸入讀取,您將加載eax 3,ebx與描述符0ecx與緩衝區地址和edx與長度。

然後調用系統調用接口int 80sysentersyscall,根據您的平臺。

eax寄存器將包含錯誤指示。

我沒有一臺Linux機器方便,但它會是這樣的:

section .bss 
    buf  resb 1     ; 1000-byte buffer (in data section) 

section .text 
    global _start 
_start: 

loop1: mov edx, 1    ; max length 
     mov ecx, buf   ; buffer 
     mov ebx, 0    ; stdin 
     mov eax, 3    ; sys_read 
     int 80h 

     cmp eax, 0    ; end loop if read <= 0 
     jle lpend1 

     mov edx, eax   ; length 
     mov ecx, buf   ; buffer 
     mov ebx, 1    ; stdout 
     mov eax, 4    ; sys_write 
     int 80h 

     jmp loop1    ; go back for more 
lpend1: 
     mov eax, 1 
     mov ebx, 0 
     int 80h 

這將是你的循環的基本結構。如前所述,這是從內存寫出來的,所以可能需要一些調試,我甚至可能會有一些助記符錯誤。

但是,這應該是一個開始。

+0

感謝您的回覆!我沒有閱讀或寫入文件。我已經閱讀了使用'man'命令的解釋,但我仍然不確定如何將所有內容放在一起。如果你熟悉X86,你能給我一個基於我的c代碼的例子嗎?它工作得很好。再次感謝您的幫助@paxdiablo! – Meteorite 2014-12-03 02:09:18

+0

@Meteorite,我目前所在的位置沒有Linux系統,所以我要從記憶中回憶(以及遭受數十年混亂的記憶)。但希望我已經添加的一點會有所幫助。 – paxdiablo 2014-12-03 02:30:27

+0

@ paxdiablo這已經夠好了!我現在看到一切如何運作。很有幫助! – Meteorite 2014-12-03 02:48:29