x86 32ビットモードから16ビットモードに戻れない
32ビットモードから16ビットモードに戻りたいのですが失敗してしまいます。
jmp 0x0000:real_mode周りが怪しいと思うのですが詳しい方がおられたらご教示下されますと幸いです。
16ビット:A表示
↓ 切り替え
32ビット:B表示
↓ 切り替え
16ビット:C表示 ←ここが表示されない
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
