Я изучил сборку x86-16 и хочу научиться сборке x86-32. Я сделал простую 32-битную программу, но этот код не работает Когда программа совершает дальний прыжок, консоль отображает «Недопустимый дескриптор JMP 0». Я использую fasm и DOS. Пожалуйста, покажите мне, что я делаю плохо.
Вот мой код
format MZ
push cs
pop ds
mov eax,cs
shl eax,4
mov [AdresSegmentuProgramu_32],eax ;Calculating real mode segment
add eax,gdt_table
mov [gdtr+2],eax
use32
lgdt [gdtr]
mov eax,[AdresSegmentuProgramu_32]
add eax,pmode_entry
mov [AdresSegmentu_PMODE_entry],eax
mov eax,cr0
or eax,1 ;Switch to PMODE
mov cr0,eax
mov eax,[AdresSegmentu_PMODE_entry] ;Far jump to reset CS and jump to simple code
mov [far_jump],eax
jmp far [ds:far_jump]
far_jump:
dd 0
dw 08h ; Selector 0x08
gdtr: dw 128
dd 0
AdresSegmentuProgramu_32 dd 0
AdresSegmentu_PMODE_entry dd 0
use32
gdt_table:
dq 0
code_descriptor:
dw 0ffffh
dw 0
db 0
db 09ah
db 11001111b
db 0
data_descriptor:
dw 0ffffh
dw 0
db 0
db 092h
db 11001111b
db 0
dq 0
dq 0
pmode_entry:
mov esi,0b8000h
mov byte [esi],'a'
fword
, а не сdb 66h
. - person Michael Petch   schedule 14.02.2019use32
делает то же самое, что.code32
в ассемблере GNU. В этом случае расположение первойuse32
неверно: ЦП будет выполнять весь код в режимеuse16
до инструкцииjmp far
. Он начнет выполнение кода в режимеuse32
ПОСЛЕ инструкцииjmp far
. При использованииuse32
перед инструкцией, которая выполняется в режимеuse16
, ассемблер сгенерирует неверный код. - person Martin Rosenau   schedule 14.02.2019use32
для 16-битной кодировки и модификатор FWORD. также примечательным былjmp $
в защищенном режиме, поэтому процессор не продолжает работать без кода. Наконец, селектор DS ни разу не был установлен в защищенном режиме перед доступом к памяти с неявным DS. - person Michael Petch   schedule 14.02.2019