对于8086的cpu来说
- 段地址必须为16的倍数
- 偏移地址是16位的(最大是16位,因为数据总线只有十六跟最大支持16位,再多就传不了了)最大的寻址能力是64K所以一个段的最大长度是64K
段寄存器
- 8086特有的 存放段地址和偏移地址的
- 要想告诉cpu 一个地址是一个段的段地址要这样做:
mov 段寄存器, FFCAH 告诉cpu FFCAH是一个段的段地址 - 8086cup在访问内存的时候由段寄存器提供内存单元的段地址和偏移地址,送入地址加法器,合成物理地址
- 8086有四个段寄存器:CS,DS,SS, ES。当CPU需要访问内存的时候由这四个寄存器提供内存单元的段地址
CS: 代码段寄存器
DS:数据段寄存器
SS:堆栈段寄存器
ES:附加段寄存器 - CPU区分传过来的是什么:放地址付给cs段就是代码指令,付给ds段就是数据
段寄存器提供段地址那么偏移地址是谁提供的呢?
CS: <small>CS 和 ip</small>
- cs为代码段寄存器 ip为指令指针寄存器 他们指示了当前要读取的指令的地址
- 定位具体地址写法: cs : ip 例如 0x1222: 0x0001
- 任意时刻,CPU都会将cs : ip 指向的指令作为下一条需要取出执行的指令
- 大端 高高低低 小段 高低高低 由CPU决定
jmp指令
<small>8086cup是不允许cpu直接给cs和ip赋值的,像这样 mov cs, ac23H mov ip, 000H。但是,提供了指令来给他们赋值就是jmp指令</small>
jmp 段地址: 偏移地址
- 举例
jmp 3: 0bl6----结果 cs:0003H , ip: 0bl6H z最终得到的地址 00b46H,cpu将会从此处读取指令 - 如果不想改变cs 只想改变ip的值 jmp还提供了另一只写法
mov ax, 1000H
jmp ax
- 结果
区别 | ax | cs | ip |
---|---|---|---|
执行前 | 1000H | 0234H | 0023H |
执行后 | 1000H | 0234H | 1000H |
- 修改ip的操作包括
- 读指令
- jmp 指令
练习: 下面三条指令执行后,cpu修改了几次ip,都在什么时候,最后ip为多少?
mov ax, bx
sub ax,bx
jmp ax
答:一共修改了四次ip 前三次是执行指令最后一次是执行jup ax指令最后ip为 0000Hcs指令的执行过程详见hank老师的汇编(三)