X86从stdin读取并写入stdout,无需参考标准库
我是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表示)。有谁能帮我把它转换成普通汇编代码(请不要“调用读取
#包括
#包括
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)