1

私はNASMをいじって、この状況が発生したときにasmコードをコンパイルする方法を研究していました。次のコマンドラインを使用してアセンブリコードをコンパイルしました

nasm -f bin crash_test_172.asm -o crash_test -l crash_test_172.lst

内容が次のような非常に単純なasmファイル

bits 16
org 0x7c00

jmp main

Message db "Hello World", 0x0

main:
   cli
   mov ax,cs
   mov ds,ax
   mov es,ax
   mov ss,ax
   sti

リストファイルcrash_test_172.lstを開いたとき、これはかなり興味深い観察結果でした。リストファイルの内容は次のとおりです。

 1                                  bits 16
 2                                  org 0x7c00
 3
 4 00000000 EB0C                    jmp main
 5
 6 00000002 48656C6C6F20576F72-     Message db "Hello World", 0x0
 7 0000000B 6C6400
 8
 9                                  main:
10 0000000E FA                         cli
11 0000000F 8CC8                       mov ax,cs
12 00000011 8ED8                       mov ds,ax
13 00000013 8EC0                       mov es,ax
14 00000015 8ED0                       mov ss,ax
15 00000017 FB                         sti
16

私がこれを間違って理解していない場合、4行目でjmp命令はバイトを指しています0Cが、リストによると、mainの最初の命令はで始まり0Eます。

私はまた、私がいじっていた他のすべてのasmコードのこの違いに気づきました。驚いたことに、それらのすべてが機能します。

私は何かが足りないのですか?誰かが私にそれがこのような理由を理解するのを手伝ってもらえますか?4行目はEB0E;であってはなりません。0Eメインの下の最初の命令であるバイトを指していますか?

4

2 に答える 2

2

0xEBは短い相対ジャンプであるため、ジャンプ後のIP(0x2)にオフセット(0xC)を加えたもので、0xEになります。

于 2013-03-13T22:59:32.210 に答える
0

EB短い相対ジャンプです...

JMP SHORT immの最大範囲は128バイトです。これは、変位が8ビットのみとして指定されているためですが、使用するコードスペースは少なくなります。

これは、オペランドが絶対アドレスではなく、500-内部サーバーエラー で説明されているように、現在のアドレスからの正または負のオフセットであることを意味します。

于 2013-03-13T23:07:39.207 に答える