汇编语言 第2章 寄存器

隐藏

前言

一个典型的CPU由运算器控制器寄存器等器件构成, 它们通过内部总线相连。

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各器件工作
  • 内部总线联通各个器件

对于汇编程序员而言,可以操作的只有寄存器。

不同CPU型号,寄存器有所不同, 对于8086而言,有14个寄存器,所有寄存器都是一个字长(word),8086字长为16位。 《汇编语言》都是对8086进行描述和实验。

8086是16位结构的CPU意味着:

  • 寄存器最大宽度16位
  • 运算一次最多处理16位
  • 寄存器与运算器之间通路16位

通用寄存器

即AX/BX/CX/DX 通用寄存器、存放一般性数据。 当然后文可知BX可用于[BX]这样的数据段偏移量。 而CX可用于LOOP循环。其记录循环次数,为0则跳出循环。

它们是一个字长,两个字节,也可对其每个字节操作, 名词为 *L 代表低位字节,例如AL 名词为 *H 代表高位字节,例如CH

物理地址以及段地址:偏移地址

8086 物理地址20位而寄存器是16位。

问题来了,8086如何做到寄存器16位而地址总线20位?

答:因为其寻址方式是 段地址:偏移地址(通过地址加法器合成20位地址)

例如CS:IP (CS*16 + IP)指向指令或者DS:[0]指向数据等,是CS寄存器左移4位作为段地址,在加上IP偏移量。

需要说明的是,虽然名为“段地址”,但并未分段,应该理解为基址。

段寄存器有CS/DS/SS/ES

CS(Code Segment)以及IP(Instruction Pointer)

用于指向指令,每执行一条指令后,IP++,指向内存连续的下一条指令。

具体动态过程可以参见《汇编语言》图2.10-图2.26

修改CS和IP的值

8086并未设计直接用mov修改CS、IP的功能,而是用jmp指令

例如: jmp 2AE3:3执行后则CS=2AE3H, IP = 0003H jmp ax执行后,IP的值将会是ax

无论指令还是数据,都是二进制,看不出区别。 只有通过CS:IP指向内存中某块二进制,才将这块二进制赋予指令的意义。 所以要让指令执行,就将CS:IP指向其首地址。

-----EOF-----

Categories: 汇编 Tags: 汇编 底层