0

FASM で 32 ビットの符号なし整数を STDOUT に出力する単純なサブルーチンを作成しています。これは私が思いついたものです:

format elf
public uprint

section ".text" executable
uprint:
    push ebx
    push ecx
    push edx
    push esi
    mov  ebx, 10
    mov  ecx, buf + 11
    xor  esi, esi
do:
    dec ecx
    xor edx, edx
    div ebx
    add dl, 0x30
    mov [ecx], dl
    inc esi
    test eax, 0
    jnz do
    mov eax, 4
    mov ebx, 1
    mov edx, esi
    int 0x80
    pop esi
    pop edx
    pop ecx
    pop ebx
    ret

section ".data" writeable
    buf rb 11

次に、上記のサブルーチンが適切に機能するかどうかをテストする別のプログラムを作成しました。

format elf
extrn uprint
public _start

section ".text" executable
_start:
    mov eax, 1337
    call uprint
    mov eax, 4
    mov ebx, 1
    mov ecx, newline
    mov edx, 1
    int 0x80
    mov eax, 1
    xor ebx, ebx
    int 0x80

section ".data"
    newline db 0x0A

これらの両方のプログラムを対応するオブジェクト ファイルにコンパイルし、それらをリンクして実行可能ファイルを作成しました。

ただし、プログラムを実行すると、の7代わりに表示されるだけでし1337た。結局のところ、数字自体に関係なく、数字の最後の桁のみが表示されます。

uprint私のサブルーチンが正しいので、これは奇妙です。実際、これらの両方のプログラムを 1 つのプログラムに結合すると、1337正しく表示されます。

私は何を間違っていますか?

4

2 に答える 2

0

あなたの LINK 操作は のuprint前にを構築して_startおり、実際には に入っているという明確な印象を受けますが、期待どおりUPRINTではありません_start

于 2013-04-21T07:31:56.870 に答える
0

私は自分の間違いに気づきました。私はtest eax, 0常にゼロフラグを設定するものを使用しています。したがって、最初の桁のみが処理されます。またはのいずれtest eax, eaxかを使用する必要がありますcmp eax, 0

于 2013-04-21T16:11:51.230 に答える