8086汇编:寄存器
一、通用寄存器
通用寄存器是一种计算机硬件组件,用于暂时存储和处理数据。而8086处理器是16位处理器,采用16位寄存器。而32位寄存器的名称,是在16位寄存器名词上加上前缀"E",例如:EAX。然而64位寄存器的名称,是在16位寄存器名词上加上前缀"R",例如:RAX
1.常见通用寄存器
AX 累加寄存器:所有外部设备的输入输出指令只能使用AX做为数据寄存器,存储函数返回值或临时数据,同时参与乘除法的运算。
BX 基址寄存器:可以存放被读写的存储单元的地址,也就是访问局部变量,例如:数组的Head地址。
CX 计数寄存器:在循环操作、移位操作时用作存储计数,以及字符串操作逐位读取。
DX 数据寄存器:在寄存器间接寻址中的I/O指令中存放I/O端口的地址。此外,在做双字长乘除法运算时,用于乘除法的第二个操作数或存储结果。
SI (Source)源寄存器:指向源操作数。
DI (Destination)目的寄存器:指向目的操作数 。
SP 栈顶寄存器:指向栈顶。
BP 栈底寄存器:指向栈底。
2.关于AH和AL的解释
为了兼容8086上一代的8位寄存器,16位寄存器将高八位地址叫作AH,而低八位的叫作AL。同样相对应的BH、BL、CH、CL、DH、DL等。但对于32位寄存器EAX,兼容16位寄存器并不存在指定名称来区分高位低位,而是默认低16位为AX。同理可得,64位RAX的低32位是EAX。
3.字在寄存器中的存储
在计算机组成原理中,一次存取、加工和传送的数据长度叫字,根据处理器的不同而不同。但在编程语言中,一个字占2个字节。而在8086处理器中,一次存取的数据长度为16位。汇编语言中,一个字(WORD)等于2个字节(一个字节8个比特)。而双字(DWORD)即为4个字节,四字为8个字节。
二、段寄存器
1.常见段寄存器
CS(Code Segment )指向存放程序的内存段,也就是代码段。存放的数据是程序的入口,也就是程序要执行的第一条指令的地址,和IP指针寄存器搭配使用。IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令,即是CS:IP 。
SS(Stack segment) 指向用于堆栈(堆栈用于存储临时数据和函数,如函数的局部变量和调用信息。当一个函数被调用时,它的参数和局部变量会被推入栈中,函数执行完毕后,这些信息会被弹出栈)的内存段,与SP和BP搭配使用,即SS:SP。
DS(Date Segment):指向用于数据存储的段地址,配合偏移地址,来获取具体的数据信息。
三、辅助寄存器
R8-R15 辅助寄存器,只存在于64位处理器。
四、控制寄存器
CR0-CR4:控制CPU模式和页表等
IP 指令指针寄存器,指向存放下条待执行的指令在该段的偏移量。
XMM0-XMM15:用于浮点计算
五、标志寄存器
FLAGS:存储处理的状态标记,比如说:溢出、进位等。它是一个16位的寄存器,但只使用到了其中的9位。分别是状态标志位(CF、SF、AF、PF、OF、ZF)和 控制标志位(IF、TF、DF)。
6个状态标志位:
符号 | 解释 |
---|---|
CF | 无符号数运算的溢出标志判断,有溢出则CF=1,反之CF=0。 |
SF | 运算结果为负数时,SF=1,否则SF=0。 |
AF | 运算过程中,AF只看低四位,若低四位有进位或者借位,则AF=1。 |
ZF | 相减运算结果为0时,则ZF=1,否则ZF=0。 |
PF | 运算结果的所有Bit中“1”的个数为偶数时PF=1,为奇数个则PF=0。 |
OF | 有符号数运算的溢出标志判断,有溢出则OF=1,反之OF=0。 |
3个控制标志位:
符号 | 解释 |
---|---|
IF | 中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断。 |
DF | 控制字符串操作指令(如MOVS 、CMPS 、SCAS 等)的地址增减方向。 DF=0:递增模式,字符串操作从低地址向高地址进行(通过 DF=1:递减模式,字符串操作从高地址向低地址进行(通过 |
TF | 启用单步调试模式,若TF=1,启动单步调试,反之则正常运行。 |
总结:
主要对8086汇编的寄存器进行整理,如通用寄存器AX、BX、CX、DX、SI、DI、SP、BP等。对于段寄存器CS:IP用于指向下一条待执行的语句,SS:SP栈指针,还要标志寄存器6个用于跳转语句的条件判断。
参考资料:
汇编中的通用基础寄存器ax,bx,cx,dx等的含意及作用解释_axbxcxdx寄存器有什么区别-CSDN博客
深入理解段寄存器(以8086cpu为例)_段式存储cpu-CSDN博客
x86汇编之——8086寄存器讲解 - 知乎 (zhihu.com)