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

寄存器简介

寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制

不同的CPU,寄存器的个数、结构是不相同的。

8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,其所有寄存器都是16位的,可存放两个字节。

通用寄存器

通用寄存器有:AX、BX、CX、DX
这四个寄存器都可分为两个可独立使用的8位寄存器来使用,例如:

AX可分为AH和AL。
AX占高位(15-8),AL占低位(7-0)

汇编指令

  • 在编写汇编指令或一个寄存器名称时不区分大小写。
  • 当指令的两个操作对象位数不一致时会发生错误。
汇编指令CPU完成的操作高级语言描述
mov ax,18将18送入寄存器AXAX=18
add ax,8将寄存器AX中的值加上8AX=AX+8
add ax,bx将AX和BX中的数值相加,结果存在AX中AX=AX+BX

8086CPU如何给出物理地址

8086采用用两个16位地址合成的方法来形成一个20位的物理地址。

物理地址 = 段地址 * 16 + 偏移地址

段地址*16 :
- 相当于对二进制位数左移4位(2的n次方位)
- 也相当于十六进制位数左移1位

段的认识

  • 段的划分来自于CPU,内存并没有分段。
  • 用段地址*16来定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
  • 一个段的起始地址是16的倍数;
  • 偏移地址位16位,寻址功能64K,所以一个段的长度最大为64K;
  • CPU可以用不同的段地址和偏移地址形成同一个物理地址:
    段地址      偏移地址
    2000H       1F60H
    2100H       0F60H
    21F0H       0060H
    
    以上段地址与偏移地址通过公式:物理地址 = 段地址 * 16 + 偏移地址
    得到的物理地址都为:21F60H
    

段寄存器

段地址在段寄存器中存放,8086有四个段寄存器:CS、DS、SS、ES

CS和IP

  • CS是代码段寄存器,IP是指令指针寄存器。
  • 任意时刻,设CS中内容为M,IP中内容为N,CPU将会从内存M*16+N单元开始,读取一条指令并执行。
    也可表示为,CPU将CS:IP指向的内容当作指令执行。
  • 读取一条指令后,IP的值自动增加,增加的值等于读入指令的字节数。

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

疑问:
在内存中指令和数据都已二进制的形式存在,没有区别,CPU根据什么将内存中的指令与数据区分开来?

解答:
在任何时候,CPU将CS:IP指向的内存单元的内容看作指令。
也就是说,内存中的一段信息曾被CPU执行过的话,那么他所在的内存单元必然被CS:IP指向过。

修改CS、IP的指令

8086CPU的大部分寄存器的值,都可以用mov指令(传送指令)来改变,但CS、IP不能。

最简单的可以修改CS、IP的指令:jmp指令(转移指令)

若想同时修改段地址和偏移地址,可用形如“jmp 段地址:偏移地址”的指令完成
如:
    jmp 2AE3:3 
    执行后:CS=2AE3H,IP=0003H,CPU将会从2AE33H处读取指令。

若想仅修改IP的内容,可用形如“jmp 某一合法寄存器”的指令完成
其含义为:用寄存器中的值修改IP
如:
    jmp ax
    指令执行前: ax=1000H CS=2000H IP=0003H
    指令执行后: ax=1000H CS=2000H IP=1000H