实模式
在实模式下,80386相当于一个可进行32位处理的快速8086。为80386编写的程序可利用32位的通用寄存器,可使用新增的指令,可采用扩展的寻址方式。段的最大长度是64K,但不象真正的8086,当所存取的存储单元的地址偏移超过0FFFFH时,不会引起模64K的地址反绕而导致段越界异常。所以在实模式下运行的程序访问的存储单元的地址偏移不能超过0FFFFH,转移的目的地址偏移也不能超过0FFFFH。
80386在上电或复位时,便进入实模式。实模式主要是为80386进行初始化的。在实模式下,常为80386工作于保护模式所需要的数据结构做好各种配置和准备。实模式下采用类似于8086的体系结构,有如下特点。
1)寻址机构、存储器管理、中断处理机构均和8086一样。
2)操作数默认长度是16位,但允许使用80386的32位寄存器组。
3)不用虚拟地址的概念,存储器容量最大为1MB。采用分段方式,每段大小固定为64KB,存储段彼此可以覆盖。实模式不允许分页,其线性地址和物理地址相同,为段寄存器内容左移4位再加上有效地址。
4)实模式下存储器中保留两个固定区域,一个是初始化程序区,另一个是中断向量区。前者为FFFF0H~FFFFFH,后者为00000H~003FFH。
5)80386有4个特权级,实模式下,程序在最高级(0级)上运行,80386指令系统中除少数几条指令外,绝大多数指令在实模式下都有效。
下面举一例子,介绍如何编写在80386实模式下运行的程序,侧重于指令的应用。
例5.3 写一个程序,以十进制数和十六进制数形式显示双字存储单元F000:1234H的内容。
.386 ;支持对80386非特权指令汇编
CSEG SEGMENT USE16 ;16位段
ASSUME CS:CSEG
BEGIN:MOV AX,0F000H
MOV FS,AX
MOV EAX,FS:[1234H]
CALL TODEC ;以十进制数形式显示
CALL NEWLINE
CALL TOHEX ;以十六进制数形式显示
MOV AL,‘H’
CALL ECHO
CALL NEWLINE
MOV AH,4CH ;结束
INT 21H
;子程序名:TODEC
;功 能:以十进制数形式显示32位二进制数
;入口参数:EAX=要显示的值
;出口参数:无
TODEC PROC NEAR
PUSHAD ;所有通用寄存器进栈
MOV EBX,10
XOR CX,CX
DECI: XOR EDX,EDX
DIV EBX
PUSH DX
INC CX
OR EAX,EAX
JNZ DECI
DEC2: POP AX
CALL TOASC
CALL ECHO
LOOP DEC2
POPAD
RET
TODEC ENDP
;子程序名:TOHEX
;功 能:以十六进制数形式显示32位值
;入口参数:EAX=要显示的值
;出口参数:无
TOHEX PROC NEAR
COUNTB = 8
ENTER COUNTB,0 ;设置堆栈
MOVZX EBP,BP
MOV ECX,COUNTB
MOV EDX,EAX
HEXI: MOV AL,DL
AND AL,0FH
MOV [EBP-COUNTB ECX-1],AL
ROR EDX,4
LOOP HEX1
MOV CX,COUNTB
XOR EBX,EBX
HEX2: MOV AL,[EBP-COUNTB EBX]
INC EBX
CALL TOASC
CALL ECHO
LOOP HEX3
LEAVE
RET
TOHEX ENDP
;子程序名:TOASC
;功 能:把一位十六进制数转换为对应的ASCII码
;入口参数:AL=要显示的值
;出口参数:AL=ASCII码
TOASC PROC NEAR
AND AL,0FH
ADD AL,’0’
CMP AL,’9’
SETA DL ;CF=0,且ZF=0时,DL置1
MOVZX DX,DL
IMUL DX,7
ADD AL,DL
TOASC1:RET
TOASC ENDP
;回车换行子程序
;入口参数:AL=无
;出口参数:AL=无
NEWLINE PROC NEAR
;内容略
NEWLINE ENDP
;显示字符子程序
;入口参数:AL=要显示的ASCII码
;出口参数:AL=无
ECHO PROC NEAR
;内容略
ECHO ENDP
CSEG ENDS
END BEGIN