X86从stdin读取并写入stdout而不引用标准库

时间:2014-12-03 01:49:33

标签: x86 stdout stdin att

我是X86汇编语言的初学者。我知道如何从stdin读取并使用内置函数写入stdout,但我不知道如何使用普通汇编代码(即操作寄存器和利用系统调用)来实现它。

#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表示)。任何人都可以帮助我将其转换为普通汇编代码(不是“呼叫读取”和“请求呼叫”)?

语法无关紧要,但是32位AT&amp; T是首选,因为我一直在使用它:)提前感谢!

1 个答案:

答案 0 :(得分:2)

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

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

这将是你的循环的基本结构。如上所述,这是从内存写的,所以它可能需要一些调试,我甚至可能有一些助记符错误。

但这应该是一个开始。