【问题标题】:X86 read from stdin and write to stdout without referring the standard libraryX86 从标准输入读取并写入标准输出而不参考标准库
【发布时间】:2015-01-31 11:05:01
【问题描述】:

我是 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 表示)。谁能帮我把它转换成普通的汇编代码(请不要“调用读取”和“调用写入”)?

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

【问题讨论】:

    标签: x86 stdout stdin system-calls att


    【解决方案1】:

    对于您使用的任何操作系统,系统调用都应该有详细的记录。例如,查看 Linux 的 here

    因此,在您的情况下,要从标准输入读取,您将使用 3 加载 eax,使用描述符 0 加载 ebx,使用缓冲区地址加载 ecx,使用长度加载 edx

    然后根据您的平台使用int 0x80(32 位Linux)或syscall(64 位模式)调用系统调用接口。或者您可以使用 sysenter 优化 32 位系统调用,但需要其他设置,不建议直接使用。详情请参阅The Definitive Guide to Linux System Calls

    然后eax 寄存器将(从read 系统调用返回时)包含成功读取的字节数,否则将包含错误指示。

    我手边没有 Linux 机器,但它会是这样的:

    section .bss
       buf      resb 1                  ; 1-byte buffer
    
    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              ; _exit(0)
    

    这将是循环的基本结构。如前所述,这是从内存中编写的,因此可能需要一些调试,我什至可能有一些助记符错误。但这应该是一个开始。

    【讨论】:

    • 感谢您的回复!我不是在读取或写入文件。我已经阅读了使用“man”命令的解释,但我仍然不确定如何将所有内容放在一起。如果你熟悉X86,你能根据我的c代码给我一个例子吗?它工作得很好。再次感谢您的帮助@paxdiablo!
    • @Meteorite,我现在的位置没有 Linux 机器,所以我要从内存(以及遭受数十年混乱困扰的内存)中获取。但希望我添加的内容会有所帮助。
    • @paxdiablo 这已经足够了!我现在看到了一切作为一个整体是如何运作的。很有帮助!
    • 链接已失效并指向诈骗网站 :(
    最近更新 更多