汇编学习-寄存器

寄存器

8086CPU的所有寄存器都是16位的

通用寄存器

AX,BX,CX,DX
这四个寄存器通常用来存放一般性的数据,称为通用寄存器
这四个寄存器均可分成两个独立使用的8位寄存器

  • AX可分为AHAL
  • BX可分为BHBL
  • CX可分为CHCL
  • DX可分为DHDL

物理地址

8086CPU给出物理地址的方式为:
物理地址 = 段地址 ∗ 16 + 偏移地址 物理地址=段地址*16 + 偏移地址物理地址=段地址16+偏移地址
记作:[段地址:偏移地址]

段寄存器

CS,DS,SS,ES

可用一个段存放数据,定义为“数据段”,将其段地址存放于DS中,用mov,add,sub等访问内存的指令时,这样CPU将定义的数据段中的内容当作数据访问。

可用一个段存放代码,定义为“代码段”,将其段地址存放于CS中,将段中第一条指令的偏移地址存放于IP中,这样CPU将执行定义的代码段中的指令。

可用一个段当作栈,定义为“栈段”,将其段地址存放于SS中,将栈顶元素的偏移地址存在SP中,这样CPU在需要进行栈操作时,将定义的栈段当作栈空间来使用。

CS

CSIP是8086CPU中两个最关键的寄存器,他们指示了CPU当前要读取指令的地址。
CS: 代码段寄存器
IP: 指令指针寄存器

8086机中,任意时刻,CPU将 CS: IP指向的内容当作指令执行

mov指令不能用来设置CSIP的值
修改CS``````IP的值的命令为:jmp
可用jmp <段地址>:<偏移地址>形式的命令同时修改CSIP的值,修改后CS=<段地址>IP=<偏移地址>

也可用jmp <某一合法寄存器>的形式来单独修改IP中的值,修改后IP=
<某一合法寄存器>中的值。

jmp命令详见文章:占位

[address]

可用[···]表示一个内存单元
[···]中的数字表示内存单元的偏移地址,段地址会取用ds中的数据作为内存单元的段地址

DS

DS:用来存放要访问的数据的段地址
下例为将[1000:0]中的数据读到ax

mov bx,1000H
mov ds,bx
mov ax,[0]

8086CPU不支持将数据直接送入段寄存器的操作,需用一个通用寄存器进行中转

SS

SS为段寄存器,存放栈顶的段地址
SP存放偏移地址
在任意时刻,SS:SP指向栈顶元素
8086CPU提供push入栈操作和pop出栈操作,每次操作都是以字为单位进行的,也就是SP的移动量为+或者-2。

pop ax表示从栈顶[SS:SP]取出数据送入ax,后SP+2, 此时[SS:SP]指向新栈顶。

push ax先将SP-2,表示将ax中的数据送入[SS:SP],此时[SS:SP]指向新栈顶。


版权声明:本文为sykongdl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。