我是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是首选,因为我一直在使用它:)提前感谢!
答案 0 :(得分:2)
对于您正在使用的操作系统,系统调用应该有详细记录。
例如,请参阅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
这将是你的循环的基本结构。如上所述,这是从内存写的,所以它可能需要一些调试,我甚至可能有一些助记符错误。
但这应该是一个开始。