我是x86汇编编程的新手,并且不了解它的复杂性。 假设我在部分.bss
下声明了一个变量name resb 20
我想从用户那里获得一个名字输入:
; gets name
mov eax, 3
mov ebx, 0
mov ecx, name
int 80h
我只是想知道通过stdin输入的长度是否存储在其中一个寄存器中?是否计算包括回车?长度值存储在我想的?还是bl?如果是这样,我可以像这样存储吗?
mov byte[nameLen], al
其中nameLen在.bss部分下声明,如此
nameLen resb 1
我非常希望像这样重新打印字符串输入:
; excludes the carriage return from count
dec byte[nameLen]
mov eax, 4
mov ebx, 1
mov ecx, name
mov edx, nameLen
int 80h
请帮忙!谢谢!
我正在使用x86 Ubuntu。
答案 0 :(得分:2)
以下两个示例很容易理解如何在汇编中使用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
这个简单的程序继续读取标准输入并将结果打印在标准输出上。