1

NASM を使用してアセンブラ コードをアセンブルしています。組み立てたコードは次のようになります。

[BITS 32]
[ORG 0]
  jmp 07c0h:start

  testvar db 0, 0, 0, 0, 0, 0, 4, 8, 15, 16, 23, 42

start:
  mov byte [testvar], 47

  hang:
    jmp hang

  times 510-($-$$) db 0
  dw 0AA55h

別のコードに問題があり、メモリを変更できないことに気付いたので、実際にそうであるかどうかをテストするためにこのコードを書きました。そうだった!アセンブルしたマシン コードをフロッピーの最初のセクタにコピーすると、プログラムが実行されました (MS VirtualPC を使用しました)。Virtual PC に割り当てられた RAM メモリを確認し、4 8 15 16 23 42 という数字を検索して、バイナリ コードがコピーされた場所を見つけました。データの最初のバイトは変更されていません。なぜそうなのですか?

4

4 に答える 4

4

The simple answer is that the same code assembled as 32 bit is different than that assembled as 16 bit. Boot sector code (and all loaded code) is run in 16 bit real mode until the CPU mode is switched.

The happy answer is a listing shows the difference.

                                                [BITS 16]
0000000C: C6 06 00 00 2F                          mov BYTE [testvar], 47

The same code as 32 bit

                                                [BITS 32]
0000000C: C6 05 00 00 00 00 2F                    mov BYTE [testvar], 47

The equivalent code when run as 16 bit

                                                [BITS 16]
0000000C: C6 05 00                                mov BYTE [di], 0
0000000F: 00 00                                   add [bx+si], al
00000011: 00 2F                                   add [bx], ch
于 2010-09-08T08:45:59.393 に答える
2

ソース ファイルで "BITS 32" を設定すると、アセンブラーが吐き出すオペコードにのみ影響します。

32 ビット コードを実行するには、プロセッサ モードをサプライズ サプライズ、32 ビット プロテクト モードに変更する必要があります。通常、最初のおもちゃのブートセクタを少し超えると、複数のステップでカーネルのロードを行います。まず、16 ビットのブートセクタで、サイズの制約がすべてあります。これにより、16 ビットのブートローダーが読み込まれ、保護モードを設定できます。一部の設計では、この 16 ビット部分を最小限に抑え、さらに 32 ビット ブートローダーを使用してカーネルをロードします。他の設計では、カーネルを 16 ビット ブートローダーから直接ロードします。

http://wiki.osdev.org/Main_Pagehttp://www.asmcommunity.net/http://board.flatassemblyr.net/をご覧になることをお勧めします:)

于 2010-09-08T19:52:18.310 に答える
0

私の理解では、PC互換機はすべて16ビットモードで起動します(互換性の理由から)。したがって、最初の命令が32ビットモードへのジャンプであり、直後に[BITS 32]が続く場合でも、[BITS16]から始める必要があるように思われます。NASM:16ビットコードと32ビットコードの混合を参照してください。

フロッピーの起動プロセスが少し曖昧です。コードが実際に実行される場所にあることを確認しますか?そのコードをシングルステップで実行することは可能ですか?

于 2010-09-08T04:50:15.787 に答える