ASM16 13 数据传送类指令
数据传送类指令
- 数据传送是计算机中最基本、最重要的一种操作
- 传送指令也是最常使用的一类指令
- 传送指令把数据从一个位置传送到另一个位置
- 除标志寄存器传送指令外,均不影响标志位
- 重点掌握 MOV XCHG XLAT PUSH POP LEA
通用数据传送指令
- 提供方便灵活的通用传送操作
- 有3条指令 MOV XCHG XLAT
传送指令MOV(move)
- 把一个字节或字的操作数从源地址传送至目的地址
1 | MOV reg/mem,imm ;立即数送寄存器或主存 |
非法传送
- 两个操作数的类型不一致
- 例如源操作数是字节,而目的操作数是字;或相反
- 两个操作数不能都是存储器
- 传送指令很灵活,但主存之间的直接传送却不允许
- 段寄存器的操作有一些限制
- 段寄存器属专用寄存器,对他们的操作能力有限
两个操作数的类型要一致
绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须一致,否则为非法指令
1
MOV AL,050AH ;非法指令:050Ah为字,而AL为字节
寄存器有明确的字节或字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型
对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型
两个操作数不能都是存储器
- 8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种操作,可通过寄存器间接实现
要小心段寄存器的操作
不允许立即数传送给段寄存器
1
MOV DS,100H ;非法指令:立即数不能传送段寄存器
不允许直接改变CS值
1
MOV CS,[SI] ;不允许使用的指令
不允许段寄存器之间的直接数据传送
1
MOV DS,ES ;非法指令:不允许段寄存器间传送
交换指令XCHG(exchage)
把两个地方的数据进行互换
寄存器与寄存器之间对换数据
寄存器与存储器之间对换数据
不能在存储器与存储器之间对换数据
1 | ;两数交换 |
成功交换AH和BH的值
换码指令XLAT(translate)
将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL
换码指令执行前:
在主存建立一个字节量表格,内含要转换的目的代码
表格首地址存放于BX,AL存放相对表格首地址的位移量
换码指令执行后:
将AL寄存器的内容转换为目标代码
1 | MyData segment ;数据段 |
成功换码(在TABLE1中1对应的为04)
堆栈操作指令
- 堆栈是一个“后进先出FILO”(或说”先进后出“)的主存区域,位于堆栈段中;SS段寄存器记录其段地址
- 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定
- 栈顶是地址较小的一端(低端),栈底不变
堆栈的特点
- 堆栈操作的单位是字,进栈和出栈只对字量
- 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
- 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
- 堆栈常用来
- 临时存放数据
- 传递参数
- 保存和恢复寄存器
现场保护恢复
1 | mov ax,1 |
成功把BX、CX压入堆栈
成功取出BX、CX,原来堆栈的值被改变
标志寄存器传送指令
- 标志寄存器传送指令用传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
- 有2对4条指令
- 低8位传送:LAHF和SAHF
- 16位传送:PUSHF和POPF
地址传送指令
- 地址传送指令将存储单元的逻辑地址送至指定的寄存器
- 有效地址传送指令LEA
- 指针传送指令LDS和LES
- 注意不是获取存储器单元的内容
有效地址传送指令LEA(load EA)
- 将存储器操作数的有效地址传送至指定的16位寄存器中
1 | ;地址传送 |
运行成功后AX的值为BX的值加8
指针传送指令
1 | MyData2 segment |
运行完后DX的值为0000,DS的值为077D
此时DS中存的就是MyData2的段基址
输入输出指令
输入输出寻址方式
- 8086的端口有64K个,无需分段,设计有两种寻址方式
- 直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号
- 间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号
- 对大于FFH的端口只能采用间接寻址方式
输入指令IN
- 将外设数据传送给CPU内的AL/AX
输出指令OUT
- 将CPU内的AL/AX数据传送给外设
1 | ;输入输出指令 in out 端口号 |
成功运行后会让你输入,如果输入a则AL会显示a的ASCII码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo!