wxzself经验汇编 DOS 汇编进入/退出保护模式(ASM)

0
(0)

编写汇编程序的第一个环节,需要掌握进入、退出保护模式的方法,在写X86体系中,控制寄存器 CR0 的第一位,控制着CPU是工作在实模式还是保护模式。我们首先演示实现一个进入保护模式,在屏幕上打印 Hello, World,然后返回实模式的例子。下面的例子详细介绍了这个细节。

这个程序首先使用 .486P,表示使用486的保护模式指令。然后在将 CR0 的第一位置1后,处理器已经在保护模式下运行。需要注意的是,在保护模式下,中断表,全局描述表,局部描述表尚未建立,所以我们不能调用或发生任何中断,也不能装载任何的段寄存器。所以我们在实模式已经将DS、ES设置好,ES指向0B800H,这是 DOS 下文本模式的显卡缓冲区,可以向它写入。这样的结果是我们可以避开IDT、GDT等等的复杂性。

本例子是在 DOS7.1 环境,编译程序为 MASM 6.11。

1.程序执行

1)编辑源码保存为 gp.asm,源码见后。

2)使用MASM 编译程序:ml gp.asm。

3)执行:

cls
gp

4)看到的结果见下文。

2.代码

. MODEL small
.486P
.CODE
    message db 'Hello, The Protect World!', 0
start:
    mov ax, @code
    mov ds,ax
    mov ax, 0b800h          ; 文本模式直接写屏
    mov es,ax
    mov eax, cr0
    or al,1                 ; 进入保护模式
    mov cr0,eax
    mov ah, 7               ; 前景白色,背景黑色
    mov si, offset message
    mov di, 0               ; 屏幕的左上角
aloop:
    mov al,[si]             ; 写文字
    cmp al,0
    jz done
    stosw
    inc si
    jmp aloop
done:
    mov eax, cr0            ; 退出保护模式
    and al, 0feh
    mov cr0, eax
    mov ah,4ch
    int 21h   
end start  

3.执行结果

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注