8086汇编--1--通用寄存器和简单汇编指令
By:wangyz
1,通用寄存器
8086CPU所有的寄存器都是16位
数据寄存器:ax bx cx dx
指针及变址寄存器:bp sp di si
段寄存器:CS DS SS ES
控制寄存器:IP
数据寄存器
也称为通用寄存器,均为16位,包括AX,BX,CX和DX
16位寄存器的逻辑结构
![](http://images0.cnblogs.com/i/622330/201404/230947168264487.jpg)
4个16位寄存器又可分割成8个独立的8位寄存器
![](http://images0.cnblogs.com/i/622330/201404/230948162792258.jpg)
AX 累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作;
BX称为基地址寄存器(Base Register),可作通用寄存器用,在计算存储器地址时,常用作基址存储器;
CX称为计数寄存器(Count Register),常用作循环计数器;在位操作中,要用CL来指明移位的位数;
DX称为数据寄存器(Data Register)。在进行双字的乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
字在存储器中的存储
字:word,一个字由2个字节组成
一个字节可以存放在8位寄存器中
一个字可以存放在一个16位寄存器中,高位字节放于高8位寄存器中,低位字节放于低8位寄存器中。
如十进制数字20000存放到AX中,二进制表示为0100-1110-0010-0000,十六进制表示为4E20h
AX的高8位AH中为4Eh,AX的低8位AL中为20h
简单汇编指令
mov指令:数据传送指令, 2地址指令
add指令:算术指令,2地址指令
注意:在进行数据传送或算术运算时,指令的两个操作对象的位数应当一致!
mov ax,18
将18送入寄存器AX中,AX=18
mov ah,78
将78送入寄存器AH中,AH=78
add ax,8
将寄存器AX中的数值加8,AX=AX+8
mov ax,bx
将寄存器BX中的数据送入AX,AX=BX
add ax,bx
将AX和BX中的数值相加,存入AX中,AX=AX+BX
示例:
AX和BX的初始值都为0000H
![](http://images0.cnblogs.com/i/622330/201404/231000014206833.jpg)
mov ax,001AH ax=001AH bx=0000H
mov bx,0026H ax=001AH bx=0026H
add al,bl al=al+bl=1AH+26H=40H ax=0040H bx=0026H
add ah,bl ah=ah+bl=00H+26H=26H ax=2640H bx=0026H
add bh,al bh=bh+al=00H+40H=40H ax=2640H bx=4026H
mov ah,0 ax=0040H bx=4026H
add al,85H al=al+85H=40H+85H=C5H ax=00C5H bx=4026H
add al,93H al=al+93H=C5H+93H=158H (al为8位寄存器,最高位1丢失)
ax=0058H bx=4026H
物理地址(了解即可)
8086CPU有20位的地址总线,可以传送20位的地址,达到1M的寻址能力。
8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位。
从8086内部结构来看,表现的寻址能力只有64KB
8086采用一种在内部用两个16位地址合成的方法来形成20位的物理地址。
![](http://images0.cnblogs.com/i/622330/201404/231004452639451.jpg)
1.cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
2.段地址和偏移地址通过内部总线送入一个叫做地址加法器的部件。
3.地址加法器将两个16位地址合并为一个20位的物理地址。
4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路
5.输入输出控制电路将20位物理地址送上地址总线。
6.20位物理地址被地址总线送入存储器
地址加法器采用 物理地址=段地址*16+偏移地址 的方法将段地址和偏移地址合成物理地址
例如:cpu要访问地址为123C8H的内存单元
![](http://images0.cnblogs.com/i/622330/201404/231006300298443.jpg)
段的概念
段地址名称中的段的概念,可能会让人误以为内存被划分成了一个一个的段,每个段又一个段地址。
内存并没有分段,段的划分来自于CPU。由于8086CPU用段地址*16+偏移地址=物理地址的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存,
![](http://images0.cnblogs.com/i/622330/201404/231009567634820.jpg)
地址10000H-100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。
也可以认为地址10000H-1007FH,10080H-100FFH的内存单元组成两个段,他们的原始地址基础地址为:10000H和10080H,段地址为:1000H和1008H,大小都为80H
偏移地址16位,变化范围0000H-FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元
比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为10000H-1FFFFH,也是64KB,段有16个即16*64=1024KB=1M
段寄存器(了解,后面有详细的解释)
8086CPU有4个段寄存器:CS,DS,SS,ES
CS:代码段code
DS:数据段data
IP:指令指针寄存器,指向下一条要执行的命令
CS和IP
CS和IP指示了CPU当前要读取的指令的地址,
CS是代码段寄存器,IP是指令指针寄存器
在8086机器中,任意时刻,设CS中的内容为M,IP为N,CPU将从内存M*16+N单元开始读取一条指令并执行
也可以这样表述,任意时刻,CPU将CS:IP指向的内容当作指令执行。
修改CS:IP指令
在CPU中。能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令由CS:IP决定的,程序员可以通过修改CS,IP的值来控制CPU执行目标指令。
jmp指令:
同时修改CS:IP的值,可用"jmp 段地址:偏移地址"的指令完成
jmp 2AE3:3 执行后:CS=2AE3H IP=00003H,CPU 将从2AE33H处读取指令
jmp 3:0B16 执行后:CS=0003H IP=0B16H,CPU将从00B46H处读取指令
若仅想修改IP的值,"jmp 某一个合法寄存器"
jmp ax,指令执行前:ax=1000H cs=2000H ip=0003H
指令执行后 ax=1000H cs=2000H ip=1000H
jmp ax 在含义上近似 mov ip,ax
修改cs,mov cs,ax