x86 Intel Assembly Linux sys_write + sys_read

时间:2013-07-16 10:19:06

标签: linux assembly nasm

以下代码:

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!

1 个答案:

答案 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是否为负),但此处不太可能出现错误。