@earthen94

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

x86 32ビットモードから16ビットモードに戻れない

32ビットモードから16ビットモードに戻りたいのですが失敗してしまいます。
jmp 0x0000:real_mode周りが怪しいと思うのですが詳しい方がおられたらご教示下されますと幸いです。

16ビット:A表示
↓ 切り替え
32ビット:B表示
↓ 切り替え
16ビット:C表示 ←ここが表示されない

截图 2026-08-13 23-17-10.png

test.asm
; nasm -f bin test.asm -o test.bin
; qemu-system-i386 test.bin
; qemu-system-i386 -drive format=raw,file=test.bin -d int,cpu_reset -D qemu.log
; ndisasm -b 32 test.bin

bits 16
org 0x7C00

start:
    cli

    xor ax, ax
    mov ss, ax
    mov sp, 0x7C00
    
    ; VGAテキストモード設定(mode3)
    mov ax, 0x0003
    int 0x10 
    
    ; 到達確認
    mov ah, 0x0E
    mov al, 'A'
    mov bh, 0
    mov bl, 0x07
    int 0x10

    ; GDT
    lgdt [gdt_descriptor]

    ; protected mode
    mov eax, cr0
    or eax, 1
    mov cr0, eax

    ; 16:32 far jump
    jmp 0x08:protected_mode
    
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop


; ==================================================
; Protected Mode
; ==================================================

bits 32

protected_mode:

    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    mov esp, 0x9FC00

    ; 到達確認
    mov word [0xB8000 + 2], 0x0742    ; "B"

    cli
    ; PE = 0
    mov eax, cr0
    and eax, 0xFFFFFFFE
    mov cr0, eax

    ;jmp 0x0000:real_mode
    ;db 0x66
    ;db 0xEA
    ;dw real_mode
    ;dw 0x0000
    o16 jmp 0x0000:real_mode


; ==================================================
; Real Mode
; ==================================================

bits 16

real_mode:

    ;cli

    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov fs, ax
    mov gs, ax
    mov sp, 0x7C00
    
    sti

    ; 到達確認
    ;mov ah, 0x0E
    ;mov al, 'C'
    ;mov bh, 0
    ;mov bl, 0x07
    ;int 0x10
    mov ax, 0xB800
    mov es, ax
    mov word [es:4], 0x0743

stop:
    cli
    hlt
    jmp stop


; ==================================================
; GDT
; ==================================================

align 8

gdt_start:

    ; null
    dq 0

    ; code 0x08
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 10011010b
    db 11001111b
    db 0x00

    ; data 0x10
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 10010010b
    db 11001111b
    db 0x00

gdt_end:

gdt_descriptor:
    dw gdt_end - gdt_start - 1
    dd gdt_start


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

逆アセンブル結果

test@test-fujitsu:~/kaihatsu$ ndisasm -b 32 test.bin
00000000  FA                cli
00000001  31C0              xor eax,eax
00000003  8ED0              mov ss,eax
00000005  BC007CB803        mov esp,0x3b87c00
0000000A  00CD              add ch,cl
0000000C  10B40EB041B700    adc [esi+ecx+0xb741b0],dh
00000013  B307              mov bl,0x7
00000015  CD10              int 0x10
00000017  0F0116            lgdt [esi]
0000001A  A07C0F20C0        mov al,[0xc0200f7c]
0000001F  6683C801          or ax,byte +0x1
00000023  0F22C0            mov cr0,eax
00000026  EA347C08009090    jmp 0x9090:0x87c34
0000002D  90                nop
0000002E  90                nop
0000002F  90                nop
00000030  90                nop
00000031  90                nop
00000032  90                nop
00000033  90                nop
00000034  66B81000          mov ax,0x10
00000038  8ED8              mov ds,eax
0000003A  8EC0              mov es,eax
0000003C  8EE0              mov fs,eax
0000003E  8EE8              mov gs,eax
00000040  8ED0              mov ss,eax
00000042  BC00FC0900        mov esp,0x9fc00
00000047  66C70502800B0042  mov word [dword 0xb8002],0x742
         -07
00000050  FA                cli
00000051  0F20C0            mov eax,cr0
00000054  83E0FE            and eax,byte -0x2
00000057  0F22C0            mov cr0,eax
0000005A  66EA627C0000      jmp word 0x0:0x7c62
00000060  0000              add [eax],al
00000062  31C0              xor eax,eax
00000064  8ED8              mov ds,eax
00000066  8EC0              mov es,eax
00000068  8ED0              mov ss,eax
0000006A  8EE0              mov fs,eax
0000006C  8EE8              mov gs,eax
0000006E  BC007CFBB8        mov esp,0xb8fb7c00
00000073  00B88EC026C7      add [eax-0x38d93f72],bh
00000079  06                push es
0000007A  0400              add al,0x0
0000007C  43                inc ebx
0000007D  07                pop es
0000007E  FA                cli
0000007F  F4                hlt
00000080  EBFC              jmp short 0x7e
00000082  90                nop
00000083  90                nop
00000084  90                nop
00000085  90                nop
00000086  90                nop
00000087  90                nop
00000088  0000              add [eax],al
0000008A  0000              add [eax],al
0000008C  0000              add [eax],al
0000008E  0000              add [eax],al
00000090  FF                db 0xff
00000091  FF00              inc dword [eax]
00000093  0000              add [eax],al
00000095  9ACF00FFFF0000    call 0x0:0xffff00cf
0000009C  0092CF001700      add [edx+0x1700cf],dl
000000A2  887C0000          mov [eax+eax+0x0],bh
000000A6  0000              add [eax],al
000000A8  0000              add [eax],al
0 likes

1Answer

16ビットモードに戻れない

と判断されている事が Cの表示であれば、

16ビット:C表示 ←ここが表示されない

Cを表示する部分がコメントになってる様に見えます。

    ; 到達確認
    ;mov ah, 0x0E
    ;mov al, 'C'
    ;mov bh, 0
    ;mov bl, 0x07
    ;int 0x10
0Like

Your answer might help someone💌