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

Hello!を出力し、char を要求して出力する単純な I/O プログラムを作成するつもりでした%c!

入力は|、出力は:、次のようになります。

:Hello!

:!

|4

:4

:!

以下を返すようにするにはどうすればよいですか

:Hello!

|4

:4!
4

1 に答える 1

2

Damien_The_Unbeliever が言うように、あなたequの s は、測定するはずの文字列の直後に来る必要があります。の後にsys_readeax読み上げを終了する改行を含む、読み上げられた文字数が表示されます。おそらく改行を印刷したくないでしょう (この場合 - 印刷することもあります)。そう:

mov edx, eax
dec edx

または、1 つの命令で実行する場合は、次のようにします。

lea edx, [eax - 1]

現状では、edxまだ 50 を保持しているため、次sys_writeは 50 文字を出力します。ゼロやその他の文字列ターミネータで停止することはありません。ecxはまだ含まれていますがname、わかりやすくするためにリロードします。

eax当然のことながら、エラーが返されるたびに(負になる) チェックする必要int 0x80がありますが、ここでエラーが発生する可能性はほとんどありません。

于 2013-07-16T12:06:13.480 に答える