编写汇编程序的第一个环节,需要掌握进入、退出保护模式的方法,在写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.执行结果
