寄存器
CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
8086所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX被称为通用寄存器,存放一般数据。
字与字节
字节:记为byte,一个字节由8个bit组成
字: 记为word,由两个字节组成,高位字节和低位字节
几条汇编指令
物理地址
CPU访问内存单元时候,需要给出内存单元的地址。所有内存单元构成的存储空间是一个唯一的,所以每个内存单元都有唯一地址。
16位结构的CPU
- 运算一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器与运算器之间的通路为16位
20位物理地址给出方法
地址加法器采用物理地址 = 段地址*16+偏移地址的方法(左移四位)
获取20位物理地址的本质
CPU访问内存时候,是一个基地址(段地址*16)+ 偏移地址的寻址模式,段地址像是楼层,偏移地址像是房间号码,需要将两部分相加
段的概念
内存本身是没有段的概念,是一段连续的地址,是因为CPU16位的段地址方式才人为的认为是分成一段一段的存储单元。注意:
- 段地址*16必然是16的倍数,所以一个段的起始地址一定是16的倍数
- 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的最大长度是64KB
段寄存器
段地址在8086的段寄存器中存放,8086有四个段地址:CS 、DS、SS、ES
CS和IP
CS:代码段寄存器
IP:指针指令寄存器
- CS是2000H,IP是0000H
- 内存20000H~20009H单元存放着可执行的机器码
- 对应右边指令:
- mov ax, 0123H(3 byte):
- mov bx,0003H
- mov ax,bx(2 byte)
- add ax,bx
初始地址20000H通过输入输出电路送上地址总线,机器指令B8 23 01(mov ax, 0123H)通过数据总线被送入指令缓冲器,IP自动增加,读了三个字节所以+3
初始 CS为FFFFH、 IP为0000H、第一条指令是FFFF0H
修改CS 、 IP的指令
mov指令被称为传送指令,可以修改寄存器的值,但是mov不能用于设置CS:IP的值。
jmp指令:jmp 段地址:偏移地址
例如:
修改IP:“ jump 某一合法寄存器”
例如:
代码段
mov ax,0000 (B8 00 00)
add ax, 0123H(05 23 01)
mov bx,ax(8B D8)
jmp bx (FF E3)
这是存放在123B0H-123B9H的一组内存单元中,如果想要代码被执行,CS必须要是123BH、IP=0000H