这是两个易于理解的示例,说明如何使用stdin
和stdout
组装:
STDIN
你是对的,输入长度存储在寄存器之一中:
; read a byte from stdin
mov eax, 3 ; 3 is recognized by the system as meaning "read"
mov ebx, 0 ; read from standard input
mov ecx, name ; address to pass to
mov edx, 1 ; input length (one byte)
int 0x80 ; call the kernel
如果我没记错的话,stdin
不计回车。但是您应该对其进行测试以确定。
STDOUT
你的实现是正确的,但我给你我的评论:
; print a byte to stdout
mov eax, 4 ; the system interprets 4 as "write"
mov ebx, 1 ; standard output (print to terminal)
mov ecx, name ; pointer to the value being passed
mov edx, 1 ; length of output (in bytes)
int 0x80 ; call the kernel
我建议你尽可能多地评论你在汇编中所做的事情,因为很难回到你几个月前做的代码......
编辑:
您可以检索使用 eax 寄存器读取的字符数。
在 EAX 寄存器中返回整数值和内存地址。
函数返回读取的sys_read
字符数,这个数字是在eax
函数调用之后。
这是一个使用的程序示例eax
:
section .data
nameLen: db 20
section .bss
name: resb 20
section .text
global _start
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
_start:
mov eax, 3 ; 3 is recognized by the system as meaning "read"
mov ebx, 0 ; read from the standard input
mov ecx, name ; address to pass to
mov edx, nameLen ; input length
int 80h
cmp eax, 0 ; compare the returned value of the function with 0
je _exit ; jump to _exit if equal
mov edx, eax ; save the number of bytes read
; it will be passed to the write function
mov eax, 4 ; the system interprets 4 as "write"
mov ebx, 1 ; standard output (print to terminal)
mov ecx, name ; pointer to the value being passed
int 80h
jmp _start ; Infinite loop to continue reading on the standard input
这个简单的程序继续读取标准输入并在标准输出上打印结果。