作者:admin,发布日期:2022-11-25
阅读:121955;评论:8470
8086 CPU寄存器组
数据寄存器
AX、BX、CX、DX四个16位的寄存器
可以将其分为两个独立的8位寄存器使用:AL、AH、BL、BH、CL、CH、DL和DH
四个数据寄存器的特殊用途
AX:累加器,输入输出端口
BX:基址寄存器。
CX:计数器。
DX:双字长高16位数据,I/O的端口地址(AX)
指针及变址寄存器
SP、BP、SI、DI四个16位寄存器
SP:堆栈指针寄存器
BP:基址指针寄存器
SI:源变址寄存器
DI:目的变址寄存器
控制寄存器
IP和PSW(FLAGS)两个16位寄存器。
IP:指令指针寄存器,用来存放将要执行的下一条指令地址的偏移量,与段寄存器CS一起形成代码段中指令的物理地址。控制程序的执行流程就是通过控制IP的值来实现。
段寄存器
4个16位的段寄存器
代码段寄存器CS:存放当前执行的程序的段地址。
数据段寄存器DS:存放当前执行的程序所用操作数的段地址。
堆栈段寄存器SS:存放当前执行的程序所用堆栈的段地址。
附加段寄存器ES:存放当前执行程序中一个辅助数据段的段地址。
物理地址,偏移地址(有效地址),逻辑地址
物理地址:指的是在内存中具体的地址
偏移地址(有效地址):相对于段首地址的偏移量(一般是相对于DS段)
逻辑地址:8086的逻辑地址一般为:段地址:(冒号)有效地址
物理地址的计算
物理地址=段地址*2^4(2进制左移4位,16进制左移一位)
一般段地址为DS段地址
寻址方式
立即数寻址
指令中给出一个8位或16位的常数作为操作数。该操作数被称为立即数,这种寻址方式称为立即寻址。
也就是直接把一个数送入寄存器或者内存中
MOV AL,40H (立即数40送AL) MOV DX,5040H (立即数5040送DX )
立即寻址主要用于给寄存器赋初值,立即数只能作为源操作数。
关键:操作数为常数
寄存器寻址
操作数在指令所指定的寄存器中。这种寻址方式称为寄存器寻址。
主要用于将寄存器中的数据搬入寄存器或者内存中
MOV AX,BX
CPU内部传送数据,速度快。源地址和目标地址均可采用寄存器寻址。
关键:操作数为寄存器,例如(AX,BX)
直接寻址
数据总是在存储器中,存储单元的有效地址EA由指令给出。
MOV AX, [2000H]
物理地址:无说明都是DS段左移4位+地址,设DS=3000H,物理地址=32000H
有效地址:2000H
逻辑地址:3000H:2000H
关键:[]符号,里面包括了一个内存地址,也就是说从内存中取到操作数后在把他mov入寄存器或者其他位置。
MOV AX,ES:[2000H]
在[]前加寄存器:可以指定物理地址相对于哪个地址偏移,上面的代码相对于ES段偏移
寄存器间接寻址
操作数在存储器中,存储单元的有效地址由指令指定的寄存器给出,这些寄存器规定为:BX,BP,SI,DI,即:EA=[BX]或[BP]或[SI]或[DI]。
MOV AX, [BX]
表示以BX寄存器的内容为主存地址,把这个地址中的数据送到AX。
在指令的汇编格式中,作为间接寻址用的寄存器必须用[]括起来。(若寄存器为BX,SI,DI,则操作数在DS段,若寄存器为BP时,则操作数在SS段。)
MOV AX, ES:[BX]
关键:[]符号,里面包括了一个寄存器名,计算机先去寄存器中取到地址,再去该地址中取操作数,最后将操作数送入其他位置
通过在[]前面加寄存器:,可以指定相对于哪个段偏移
物理地址:无说明都是DS段左移4位+地址,设DS=3000H,物理地址=30000H+寄存器中的值
有效地址:寄存器中的值
逻辑地址:3000H:寄存器中的值
相对寻址
通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址。
MOV AX ,disp[BX]
表示以BX为基址寄存器,把BX内容加上disp的值,其和作为操作数的有效地址,取出数据送到AX。
MOV AX ,disp[SI]
表示把变址寄存器SI中的内容加上disp的值, 其和作为操作数的地址,取出数据送到AX。
若寄存器为BX,则段寄存器为DS,若寄存器为BP,则对应的段寄存器为SS。
常用于对数组元素进行操作。
和相对寻址方式的区别:相对寻址中,可以用寄存器:指定相对哪个段偏移,这里没有冒号(:),disp为一个值。
物理地址:无说明都是DS段左移4位+地址,设DS=3000H,物理地址=30000H+disp+寄存器中的值
有效地址:disp+寄存器中的值
逻辑地址:3000H:disp+寄存器中的值
关键:存在disp[BX]字样
基址变址寻址
如果指令中包含基址寻址也包含变址寻址,把BX、BP和SI、DI组合起来。
MOV AX, [BX] [SI]
表示把基址寄存器BX的内容加上变址寄存器SI的内容和作为操作数的地址,取出数据送到AX。
变址寄存器内容变化,变址偏移量不变,便于读写数组中的元素,是计算机中常用的一种寻址方式。
关键:变址寄存器内容变化,变址偏移量不变,上方的寄存器相对寻址的disp为一个常量,而这里变成了[寄存器],相当于从寄存器中取这个disp
物理地址:无说明都是DS段左移4位+地址,设DS=3000H,物理地址=30000H+寄存器中的值+寄存器中的值
有效地址:寄存器中的值+寄存器中的值
逻辑地址:3000H:寄存器中的值+寄存器中的值
相对基址变址寻址
如果指令中包含基址寻址也包含变址寻址,把BX、BP和SI、DI组合起来,再加上8位或16位的偏移量。
MOV AX,disp[BX] [SI]
表示把基址寄存器BX的内容加上变址寄存器SI的内容以及disp的值, 其和作为操作数的地址,取出数据送到AX。
关键:在上方址变址寻址的基础上,添加了一个disp常量,更加灵活
物理地址:无说明都是DS段左移4位+地址,设DS=3000H,物理地址=30000H+disp+寄存器中的值+寄存器中的值
有效地址:disp+寄存器中的值+寄存器中的值
逻辑地址:3000H:寄存器中的值+寄存器中的值
隐含寻址
操作数隐含在CPU的某个通用寄存器或内存的某指定单元中,指令中不直接给出操作数或操作数地址。
MUL OPR;MUL是操作码,表示乘法,OPR为乘数,而被乘数则隐含在累加器AX(16位乘法)或AL(8位乘法)中。
隐含寻址可以缩短指令的长度。
关键:在做某些运算或者操作时,计算机直接从固定的位置去取,不需要再指定。
堆栈寻址
堆栈是由若干个连续主存单元组成的先进后出(first in last out,即FILO)存储区
第一个放入堆栈的数据存放在栈底,最近放入的数据存放在栈顶。栈底是固定不变的,而栈顶是随着数据的入栈和出栈在时刻变化。
栈顶的地址由堆栈指针SP指明。