1

以下代码:

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

我打算制作一个简单的 I/O 程序,它可以打印Hello!、要求一个字符并打印%c!

输入为|,输出为:,我得到以下信息:

:Hello!

:!

|4

:4

:!

我如何使它返回以下内容

:Hello!

|4

:4!
4

1 回答 1

2

正如 Damien_The_Unbeliever 所说,您equ的 s 想紧跟在他们应该测量的字符串之后。在您的sys_read,之后eax将是读取的字符数,包括结束读取的换行符。您可能不想打印换行符(在这种情况下 - 有时您会这样做)。所以:

mov edx, eax
dec edx

或者,如果您想在一条指令中执行此操作:

lea edx, [eax - 1]

就目前而言,edx仍然有 50 个,所以你的下一个sys_write将打印 50 个字符。它不会停在零或任何其他字符串终止符处。ecx仍将包含name,但为了清楚起见,我会重新加载它。

eax按照权利,您应该在每次之后检查错误返回(将是负数),int 0x80但这里不太可能出现错误。

于 2013-07-16T12:06:13.480 回答