bits 32
main:
mov ah, 09h
mov bh, 0
mov cx, 80
mov bl, 01110000b
mov al, ' '
int 10h
jmp $
times 512-($-$$) db 0
2 に答える
実際、これが機能しないのbits 32
はこのためです。ndisasmを使用すると、何が起こっているかを確認できます。そのまま組み立て、ndisasmで分解します。ndisasmのデフォルトは16ビットですが-b16
、わかりやすくするために指定できます。これは、CPUが16ビットモードの場合に「見る」ものです...それはそうです。32ビットモードに切り替えるには、さらにコードが必要です。すぐにそれに到達しますが、CPUは16ビットモードで起動します(64ビットCPUでも)。CPUが32ビットモードの場合に「見る」ものを確認するには、を使用して再度アセンブルし-b32
ます。違いを見ます?あなたmov bl, 01110000b
は姿を消しましたmov cx, 80
!次に、を使用せずに再試行しbits 32
ます。あなたは言うことができますbits 16
が、とにかくそれはNasmのデフォルトです。
bits 32
アセンブラに通知することと、実際にCPUを32ビットモードにすることには微妙な違いがあります。通常、これはそれほど問題にはなりませんが(他の誰か(OS)がCPUモードを決定します)、ブートセクターでは問題が発生します。
実際にCPUを32ビットプロテクトモードに切り替えるときは、その時点で(正確には)、Nasmに通知する必要がありますbits 32
。
http://www.osdev.orgでこれに関する多くの情報-私はそれをお勧めします!また、昔のニュースグループにAlexeyが投稿した例もあります(実際には「Alexei」ですが、そうではありませんか?)。
ハッピーブートイン、
フランク
まだ 32 ビット モードではないので、 を使用しますbits 16
。
また、プロテクト モードでは、BIOS 機能は使用できません。保護モードのときにそれらを呼び出さないことを知っておいてください。