以下代码:
section .bss
name: resb 50
section .text
global _start
_start:
PUSH EBP
MOV EBP, ESP
MOV EDX, len
MOV ECX, msg
MOV EBX, 1
MOV EAX, 4
INT 0x80
MOV EDX, 50
MOV ECX, name
MOV EBX, 0
MOV EAX, 3
INT 0x80
MOV EBX, 1
MOV EAX, 4
INT 0x80
MOV EDX, cm
MOV ECX, ex
MOV EBX, 1
MOV EAX, 4
INT 0x80
MOV EBX, 0
MOV EAX, 1
INT 0x80
section .data
msg db 'Hello!',0xa
ex db '!',0xa
len equ $ - msg
cm equ $ - ex
我打算制作一个打印Hello!
的简单I / O程序,要求输入一个字符并打印%c!
。
输入为|
,输出为:
,我得到以下内容:
:Hello!
:!
|4
:4
:!
如何制作以便返回以下内容
:Hello!
|4
:4!
答案 0 :(得分:1)
正如Damien_The_Unbeliever所说,你的equ
想要在他们应该测量的字符串之后立即来。在sys_read
之后,eax
将是读取的字符数,包括结束阅读的换行符。您可能不想打印换行符(在这种情况下 - 有时您会这样做)。所以:
mov edx, eax
dec edx
或者如果您想在一条指令中执行此操作:
lea edx, [eax - 1]
目前,edx
仍为50,因此您的下一个sys_write
将打印50个字符。它不会停在零或任何其他字符串终止符。 ecx
仍然会包含name
,但为了清楚起见,我会重新加载它。
根据权限,您应该在每个eax
之后检查错误返回(int 0x80
是否为负),但此处不太可能出现错误。