0

出力の一部がさまざまな段階で増加している数値である x86 ASM プログラムに取り組んでいます。出力数値は、私が期待するものとはほとんど異なります...エラーを追跡するのに苦労しています。

次のように初期化されます。

SECTION .data
    ...
    numInc: db 0
    numDec: db 0
    numSum: db 0

次のように増加します。

    inc     dword [numInc]
    inc     dword [numSum]
    push    stringOpt3
    call    printf
    add     esp, 4

次のように印刷されます。

    push    dword [numInc]
    push    dword [sum]
    push    dword [numDec]
    push    dword [sum]
    push    outputString
    call    printf
    add     esp,20

outputString の場所: (もちろん、.data セクションにもあります)

    outputString: db `\nSet{1}: %5d/%d\nSet{2}: %5d/%d\n`,10,0

出力は次のようになります。

Set{1}: 134521233/514
Set{2}: 134521233/131584

だから、私は 0/3 1/3 付近の結果を期待しています ... ! また、printf の right==>left プッシュ パターンを考慮すると、分母は同じになると思います。

私は、nasm を使用してアセンブルし、gcc をリンクする x86 プロセッサを搭載した Linux を使用しています。

4

2 に答える 2

2

変化する

numInc: db 0
numDec: db 0
numSum: db 0

numInc: dd 0
numDec: dd 0
numSum: dd 0

それらをインクリメントする場合:

inc     dword [numInc]

dbddに変更すると、 numIncとその仲間が 1 バイトではなく 4 バイトを使用するようになります。後でデータをdword (4 バイト) としてincまたはpushする場合、操作のサイズとデータのサイズが一致する必要があります。

それ以外の場合、dwordとして 1 バイトのみを使用するnumIncをインクリメントすると、 numIncが 255 の場合、それに続くバイトが上書きされます。1 バイトのnumIncdwordとしてプッシュすると、実際にはそれに続く 3 バイトがプッシュされます。同じように。

結果を出力するとき、C コード:

printf(outputString, numDec, sum, numInc, sum);

次のように翻訳する必要があります。

push    dword [sum]
push    dword [numInc]
push    dword [sum]
push    dword [numDec]
push    outputString
call    printf
add     esp,20

2つの「3」はsumからのものであるため、出力として0/3、1/3を取得することを期待していたと思います。

于 2013-05-13T20:50:26.483 に答える
1

一部の変数 (例: numInc) はバイト ( db) ですが、dword のように使用しています。

のようなことをするときpush dword [numInc]、実際に押しているのは の値とnumIncそれに続く 3 バイト ( numDecnumSum、およびその他) です。

変数を dword として宣言するか、変数に対してバイト操作を実行します。

于 2013-05-13T20:50:38.187 に答える