首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用DPMI从DOS切换到保护模式

不使用DPMI从DOS切换到保护模式
EN

Stack Overflow用户
提问于 2019-02-13 20:54:20
回答 1查看 434关注 0票数 1

我学习了x86-16程序集,我想学习x86-32程序集。我制作了一个简单的32位程序,但是当程序做跳远控制台显示'JMP非法描述符0‘时,这段代码不能工作,我使用fasm和DOS,请告诉我我做了什么不好的事情。

这是我的密码

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 11:12:59

在设置PE (CR0的位0)后,处理器以16位保护模式运行.跳转到32位代码段是导致处理器以32位模式开始执行的步骤。因此,此代码中的跳远指令以16位模式执行,默认情况下使用16位操作数。

按照Michael的建议,将fword属性应用于指令操作数,将使汇编程序在跳远指令上设置操作数大小前缀,将该指令的操作数大小更改为32位。

另一种选择是将far_jump标签处的far_jump更改为dw,并继续使用16位跳远指令,但前提是您知道32位入口点位于内存的前64k内。由于BIOS在7c00加载引导扇区,这通常是正确的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54679254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档