X86从stdin读取并写入stdout,无需参考标准库

X86从stdin读取并写入stdout,无需参考标准库,x86,stdout,stdin,system-calls,att,X86,Stdout,Stdin,System Calls,Att,我是X86汇编语言的初学者。我知道如何使用内置函数从stdin读取和写入stdout,但我不确定如何使用普通的汇编代码(即操作寄存器和利用系统调用) #包括 #包括 int main(){/*将输入复制到输出*/ char buf[BUFSIZ]; int n; 而((n=read(0,buf,BUFSIZ))>0) 写入(1,buf,n); 返回0; } 这是我写的C代码,首先从标准输入读取(用数字0表示),然后写入标准输出(用数字1表示)。有谁能帮我把它转换成普通汇编代码(请不要“调用读取

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

#包括
#包括
int main(){/*将输入复制到输出*/
char buf[BUFSIZ];
int n;
而((n=read(0,buf,BUFSIZ))>0)
写入(1,buf,n);
返回0;
}
这是我写的C代码,首先从标准输入读取(用数字0表示),然后写入标准输出(用数字1表示)。有谁能帮我把它转换成普通汇编代码(请不要“调用读取”和“调用写入”)吗


语法不重要,但32位AT&t是首选,因为我一直在使用它:)提前谢谢

对于您正在使用的任何操作系统,系统调用都应该有详细的文档记录。例如,请参阅Linux

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

然后根据您的平台,使用
int 0x80
(32位Linux)或
syscall
(64位模式)调用syscall接口。或者您可以使用
syscenter
进行优化的32位系统调用,但它需要其他设置,不建议直接使用。有关更多详细信息,请参阅

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

我手边没有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)
section.bss
buf resb 1;1字节缓冲区
第节.案文
全球启动
_开始:
回路1:mov edx,1;最大长度
mov-ecx,buf;缓冲器
mov-ebx,0;标准
mov-eax,3;系统读取
int 80h

cmp-eax,0;结束循环,如果阅读感谢的答复!我不是在读或写文件。我已经阅读了使用“man”命令的解释,但我仍然不知道如何将所有内容组合在一起。如果你熟悉X86,你能给我一个基于我的c代码的例子吗?它工作得很好。再次感谢您的帮助@paxdiablo@Meteorite,我现在的位置没有Linux设备,所以我要从内存(和经历了几十年杂乱的内存)开始。但希望我添加的部分能有所帮助。@paxdiablo这已经足够好了!我现在看到了所有东西作为一个整体是如何工作的。非常有帮助!链接已失效,并导致欺诈网站:(
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)