汇编语言(1)——寄存器
文章目录
- 1.通用寄存器
- 2.字在寄存器中存储
- 3.确定物理地址的方法
- 4.内存分段表示法
- 5.CS、IP寄存器及代码段
- 6.jmp指令
1.通用寄存器
8086中的所有寄存器都是16位的,可以存放两个字节,AX、BX、CX、DX这四个寄存器用来存放一般性的数据,统称为通用寄存器。
由于8086的上一代cpu其寄存器是8位的,因此也可以将寄存器分为两个独立的8位寄存器来使用,如下所示。
2.字在寄存器中存储
cpu可以对两种尺寸的数据进行一次性处理:
- 字节:byte,由8个bit组成,存放在8位寄存器中;
- 字:word,由两个字节组成。
3.确定物理地址的方法
所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,这个地址称为物理地址。cpu通过地址总线送入存储器的必须是一个内存单元的物理地址,因此首先在cpu内部形成物理地址。
8086被称为16位机,那是因为在8086内部,一次性处理、传输、暂存的信息的最大长度为16位,因此,能一次性处理、传输、暂存16位的地址。但是8086有20位地址总线,其寻址能力达到了1MB,因此需要采用两个16位地址合成的方法来形成一个20的物理地址。
如上图所示,cpu想要读写内存的步骤如下:
- cpu中部件提供两个地址:段地址和偏移地址;
- 段地址和偏移地址通过内部总线送入地址加法器;
- 地址加法器将两个16位地址合成一个20位地址;
- 地址加法器通过内部总线将20位地址送入输入输出控制电路;
- 输入输出控制电路将物理地址送到地址总线;
- 物理地址被地址总线送到存储器中。
地址加法器的工作流程如下:
4.内存分段表示法
如下图所示,cpu将内存进行段的划分,即将若干地址连续的内存单元看作一个段,将段地址左移4位就是定位段的起始地址,用偏移地址确定具体的内存单元。
如上图左边所示,段的起始地址为10000,而结束地址为100FF,其大小为100;右边将该段分为更小的两端,大小都为80。段地址一定是16的倍数,这是因为物理地址是由段地址*16+偏移地址得到的,而偏移地址是16位的,因此一个段的最大长度为16KB。
5.CS、IP寄存器及代码段
CS和IP寄存器是8086CPU中最关键的两个寄存器:CS为代码段寄存器,IP为指针指令寄存器。在任意时刻,CPU将地址为CS:IP指向的内容当做指令执行。如下图所示,即为CPU读取、执行指令的工作原理。
初始状态,CPU中CS寄存器为2000,IP寄存器为0。
CS、IP中的内容送入地址加法器。
地址加法器将物理地址送入输入输出电路。
控制电路将物理地址送上地址总线。
内存20000单元处的内容被从数据总线传送到CPU中。
控制电脑将指令B8 23 01传送到指令缓冲器。
读取一条指令后,IP的值自动增加。
指令B8 23 01被执行。
指令执行后AX寄存器中内容被改变。
6.jmp指令
在CPU中,程序员能够用指令读写的部件只有寄存器,通过改变寄存器中的内容来控制CPU,CPU执行的指令位置是由CS、IP寄存器中的内容决定的,通过改变这两个寄存器的内容就可以控制CPU执行目标指令。可以通过jmp指令来修改CS:IP的内容。
如果想同时修改CS:IP的内容,可用“jmp段地址:偏移地址”的指令完成:
jmp 2AE:3,执行后CS的值为2A3E,IP的值为0003,CPU会从2AE33处读取指令。
如果仅仅修改IP中的内容,可以用“jmp 一个合法寄存器”的指令完成:
jmp ax,如果ax=1000,那么IP中的内容也会变为1000。
(本文中的内容改编与王爽老师《汇编语言》)