因为学习使用的是王爽的《汇编语言(第3版)》,因此也只能提到8086CPO的寄存器。对于其他而言,原理都是相通的。
对于8086寄存器,有14个寄存器,主要是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
一、通用寄存器
8086的通用寄存器有AX、BX、CX、DX4个,16位,可存放两个字节,可分为高8位和低8位,这里主要是考虑兼容性问题,8086一次可以处理1字节或是1字的数据。例如:
这里需要注意的是,对于AH和BH是两个完全不相干的东西,例如:
mov al,93H
add al,C5H
通过计算的到的结果应该是158H,但是这已经超过了AL所能存储的最大值了,但1并没有进入到AH中去,而是“丢失了”。至于原因自己还没有找到,还在学习中,等找到答案我会回来进行修改。但这足以说明AL和AH是两个不同的东西。
二、几条汇编指令
(1)数据传送指令mov
格式:mov oprd1,oprd2
功能:本指令将一个源操作数送到目的寄存器中,即oprd1<—oprd2。
说明:
<1>oprd1 为目的操作数,可以是寄存器、存储器、累加器。 oprd2为源操作数,可以是寄存器、存储器、累加器和立即数。
<2>mov 指令有四种可能的操作:
- 寄存器与寄存器之间的数据传输指令。如:mov ax,bx;
- 立即数到通用寄存器数据传送指令。如:mov ax,5600H,这里需要注意立即数只能作为源操作数使用;
- 寄存器与存储器之间的数据传送指令。如:mov ax,buffer;
- 立即数到存储器的数据传送。如:mov alfa,24。
- 立即数只能作为源操作数,不允许作目的操作数,立即数也不通送至段寄存 器。
- 通用寄存器可以与段寄存器,存储器互相传送数据,寄存器之间也可以互相传送。但CS段不能作为目的操作数。
- 存储器与存储器之间不能进行数据直接传送。若要实现存储单元间的数据传送,可以借助于通用寄存器作为中介来进行。
opr2为立即数,也可以是任意一个通用寄存器操作数。立即数只能用于源操作数。
<2>opr1和opr2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数。理由是指令代码的寻址方式中规定了两个操作数(除立即 数)至少有一个是寄存器操作数。
<3>加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响。以上标志也称为结果标志。加法指令适用于无符号数或有符号数的加法运算。操作数可以是8位,也可以是 16位。