0

次のような単純な 16 ビット アセンブリがあります。

push bx

StrVar db "My string!",0

push ax

.. other code..

NASM でコンパイルしようとしていますが、質問があります。末尾のゼロを含む文字列が 16 ビットの倍数でない場合 (たとえば、19 バイトのゼロが含まれているとします)、文字列に続く asm の位置合わせが正しくありません。めちゃくちゃになります(逆アセンブラで見ました)。

どうしてこんなことに?オペコードが常に 16 ビットであるとは限らないことに気付きました。逆アセンブラーは、オペコードが従うべき境界をどのように決定するのでしょうか?

その上..どうすればこれを防ぐことができますか?各文字ごとに文字列をカウントする必要がありますか?

4

2 に答える 2

3

あなたの問題は、現状では、コードがあまり意味をなさないことです。を実行push bxした後、文字列の最初の数バイトをフェッチし、それらを命令として実行しようとします。それは一般的にあまりうまくいきません。

通常、コードとは別のセグメントでデータを定義します。MASM 構文では、次のようなものを使用できます。

.data

StrVar db "My String!", 0

.code
; ...
    push bx
    push ax
    mov si, offset StrVar                        
; ...

コード セグメントでデータを定義する必要がかなりある場合がありますが、その場合、通常はフロー制御命令を使用して実行されないようにする必要があります (たとえば、関数の直後にジャンプ テーブルを挿入するなどret)。

于 2012-06-01T20:20:55.257 に答える
1

このように命令とデータを混在させているため、逆アセンブラーが混乱している可能性があります。

于 2012-06-01T20:12:47.300 に答える