有实模式、保护模式、长模式
实模式16(实地址模式)
真实分为两个方面:
- 运行真实指令。不区分指令动作,只是直接执行指令的真实功能
- 发往内存的地址是真实、不加限制的。
总结来说就是,这个模式下直接往物理层写,而不是我们上一章说过的硬件抽象层
实模式寄存器
X86CPU在实模式下的每个寄存器都是16位。
其中:
- AX:累加器,主要用于存放数据,算数、逻辑运算中的操作数或者结果。也可用来存放临时的地址。
- BX:基地址寄存器,存放访问存储器时的地址。
- CX:计数寄存器,保存计算值,如在移位、循环等指令中作为隐含计数使用。
- DX:数据寄存器:用于数据传递。在间接寻址时IO指令存放IO端口地址。
- IP:程序指针,指向下一条指令地址
- SP:栈指针,指向当前栈顶
- S结尾:段寄存器存放内存段基地址
实模式下如何访问内存
数据和指令都是放在内存中,如何寻址将数据装入寄存器?
所有内存地址得来的方式都是:段寄存器左移4位,再加上一个通用寄存器中的值形成地址。由这个地址去访问内存,着就是分段内存管理模型
注意:
代码段:由CS(段寄存器)和IP(程序指针)确定
栈段:由SS(段寄存器)和SP(栈针)确定
由此我们知道,不同程序执行,只需要分配不同的四个寄存器CS IP SS SP,就可以分配不同运行地址。
汇编Hello world
要点:
- 数据段和代码段开头和结尾分别以 SEGMENT 和 ENDS标识
- 字符串单引号括住,以$结束
- ASSUME CS:CODE,DS:DATA ;告诉汇编程序,DS指向数据段,CS指向代码段
- 数据段data经由AX转赋给DS
- LEA是取地址指令
- INT指令发出:软中断,具体见下一节详解。
data SEGMENT ;定义一个数据段存放Hello World!
hello DB 'Hello World!$' ;注意要以$结束
data ENDS
code SEGMENT ;定义一个代码段存放程序指令
ASSUME CS:CODE,DS:DATA ;告诉汇编程序,DS指向数据段,CS指向代码段
start:
MOV AX,data ;将data段首地址赋值给AX
MOV DS,AX ;将AX赋值给DS,使DS指向data段
LEA DX,hello ;使DX指向hello首地址
MOV AH,09h ;给AH设置参数09H,AH是AX高8位,AL是AX低8位,其它类似
INT 21h ;执行DOS中断输出DS指向的DX指向的字符串hello
MOV AX,4C00h ;给AX设置参数4C00h
INT 21h ;调用4C00h号功能,结束程序
code ENDS
END start
实模式中断
中断是中止当前程序,立即跳转到另一个特定的地址上,以运行特定代码。
实模式下,它的实现过程:先保存CS和IP寄存器,然后装载新的CS和IP
注:IP只和CS一起使用,只能由处理器才能直接改变其值。开始一段代码的时候,CS指向代码段起始地址,IP段指向段内偏移。这样CS+IP就能形成逻辑地址,由总线接口变换成物理地址从而取得指令。处理器也会自动根据当前指令长度改变IP值,从而执行下一条指令。
中断如何产生