[汇编语言学习笔记][第二章寄存器]

时间:2021-05-28 01:24:02

第二章 寄存器

8086有14个寄存器,分别为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。

2.1 通用寄存器

8086CPU的所有寄存器都是16位,可以存放两个字节。 AX , BX , CX , DX 这四个寄存器通常用来存放一般性数据,被称为通用寄存器

为了兼容之前的8位通用寄存器,将这4个寄存器拆开为8个8位寄存器分别为

H的含义High,高位,L的含义Low,低位

  • AX=AH+AL
  • BX=BH+BL
  • CX=CH+CL
  • DX=DH+DL

2.2 字在寄存器的存储

因为..x8086架构的原因,未来的字长都指的的是16位(8086机器的一个寄存器大小)

2.3 几条汇编指令

mov ax,18
mov ah,78
add ax,8
mov ax,bx
add ax,bx

寄存器的名称不区分大小写

  • 若AX=00C5H,执行add al,93H 后等于多少呢

    我原来以为可以变成0158H,看答案才知道因为只是al相见,所以进位必须舍去

    答案为0058H

2.5 16位结构CPU

为什么叫16位呢?

  • 运算器一次最多处理16位的数据
  • 寄存器的最大宽度为16位
  • 寄存器和运算器之间的通路为16为

2.6 8086CPU给出物理地址的方法

问题:8086有20位数据总线(1MB寻址能力),但是它是16位CPU内部总线(64K),只能送出16位地址,如何解决?

解决:通过内部用两个16位地址合成的方法来形成一个20位的物理地址

物理地址=段地址*16+偏移地址
本质不过就是扩大了4位而已,变成了20位。
为什么只用20位呢?因为地址总线只有20位。


内存并没有分段,但是CPU给内存分了段。分段方式管理内存
所以实际可能描述内存地址,用这样的方式 2000:1F60单元
代表内存的2000段中的1F60单元
  • (基础地址=段地址*16)
  • (物理地址=基础地址+偏移地址)

2.7 段寄存器

8086有4个段寄存器: CS , DS , SS , ES

2.8 CS和IP

  • 基本定义

    CSIP 是8086CPU中最关键的两个寄存器,他们指示了CPU当前要读取指令的地址

    CS位代码段寄存器,IP为指令指针寄存器,**任意时刻**CPU将CS:IP所指向的内容当做指令执行

  • 执行过程

    1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
    2. IP=IP+所读取指令的长度,从而指向下一条指令
    3. 执行指令,转到步骤(1),重复这个过程

在8086CPU加电启动或复位后 (即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。即在8086PC刚启动,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元的指令是8086PC机开机执行后的第一条指令

2.11 修改CS,IP的指令

  • 不能用mov指令

    jmp 段地址:偏移地址
    jmp 2AE3:3 //执行后 CPU将从2AE33H处读取指令

    jmp 某一合法寄存器(用寄存器给IP复制)
    jmp ax//执行前 ax=1000H,CS=2000H,IP=0003H
    //执行后 ax=1000H, CS=2000H,IP=1000H