16/32 в З/Р(pmode)
Я недавно просил Вас помочь разобраться с неработающей программкой. Вы посоветовали посмотреть команду прехода - far jmp.
Ну так вот.
Вот эта 16-битная программа работает:
main:
JMP REALSTART
GDTR:
GDTLIM DW gdtsize-1
GDTADR DD GDT+70000h
GDT:
NULLGDT:
times 8 DB 0
CODES:
DW codesize-1
ADR1 DW 0
ADR2 DB 7h
DB 9Ah
DB 0
DB 0
gdtsize=$-GDT
REALSTART:
push cs
pop ds
CLI
LGDT [CS:GDTR]
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
DB 0EAh
DW CONTINUE
DW 8
CONTINUE:
CONT2:
JMP CONT2
codesize=$-main
А вот эта 32-битная - нет:
main:
JMP REALSTART
GDTR:
GDTLIM DW gdtsize-1
GDTADR DD GDT+70000h
GDT:
NULLGDT:
times 8 DB 0
CODES:
DW codesize-1
ADR1 DW 0
ADR2 DB 7h
DB 9Ah
DB 01000000b
DB 0
gdtsize=$-GDT
REALSTART:
push cs
pop ds
CLI
LGDT [CS:GDTR]
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
DB 67h
DB 0EAh
DD CONTINUE+70000h
DW 8
CONTINUE:
USE32
CONT2:
JMP DWORD CONT2
codesize=$-main
Причина близка, помогите, пожалуйста! В чем заковыка, не пойму, хотя она проста!?Ах, да, программа для fasm, но это - ничего особенного.
Спасибо!
Цитата:
Originally posted by Mitja Gladkih
CODES:
DW codesize-1
ADR1 DW 0
ADR2 DB 7h
DB 9Ah
DB 01000000b
DB 0
CODES:
DW codesize-1
ADR1 DW 0
ADR2 DB 7h
DB 9Ah
DB 01000000b
DB 0
Хе-хе, у тебя уже в дескрипторе укзана база сегмента 70000h, так что либо замени ее на ноль, либо +70000h убери (там где дальний переход).
Приношу свои извинения.
Цитата:
Originally posted by RelB
Я тут обнаружил, что лоханулся, замени еще 67h на 66h (там где дальний переход).
Приношу свои извинения.
Я тут обнаружил, что лоханулся, замени еще 67h на 66h (там где дальний переход).
Приношу свои извинения.
Попробую, спасибо, друг!