X86从标准输入读取并写入标准输出而不用参考标准库

问题描述:

我是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是首选,因为我一直在使用它:)先谢谢了!

对于您使用的任何操作系统,系统调用都应该有详细记录。

例如,请参阅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