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
与描述符0
,ecx
与缓冲区地址和edx
与长度。
然后调用系统调用接口int 80
或sysenter
或syscall
,根据您的平台。
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
这将是你的循环的基本结构。如前所述,这是从内存写出来的,所以可能需要一些调试,我甚至可能会有一些助记符错误。
但是,这应该是一个开始。
感谢您的回复!我没有阅读或写入文件。我已经阅读了使用'man'命令的解释,但我仍然不确定如何将所有内容放在一起。如果你熟悉X86,你能给我一个基于我的c代码的例子吗?它工作得很好。再次感谢您的帮助@paxdiablo! – Meteorite 2014-12-03 02:09:18
@Meteorite,我目前所在的位置没有Linux系统,所以我要从记忆中回忆(以及遭受数十年混乱的记忆)。但希望我已经添加的一点会有所帮助。 – paxdiablo 2014-12-03 02:30:27
@ paxdiablo这已经够好了!我现在看到一切如何运作。很有帮助! – Meteorite 2014-12-03 02:48:29