玩转汇编——通用数据处理指令(一)

一、数据传送指令

(一)通用传送指令

1.传送指令MOV

在这里插入图片描述

①源操作数与目的操作数类型必须一致

在这里插入图片描述

②两个操作数其中之一必须要有明确的类型,两者都无法指定类型时,要显示指定(eg. mov byte ptr [bx],255 即byte ptr 说明是字节操作 )

在这里插入图片描述

③不允许两个操作数都是主存单元

在这里插入图片描述

④对专用寄存器可进行操作的指令有限,功能不强,使用时要注意。(例如,立即数不能直接传送段寄存器DS,要通过AX间接传送给DS)

在这里插入图片描述

2.交换指令XCHG

交换指令XCHG用来将8位或16位源操作数和目的操作数内容交换,可以在通用寄存器与通用寄存器或存储器之间对换数据。

合法格式:〈reg通用寄存器 mem存储器〉
xchg reg,reg/mem
xchg reg/mem,reg

在这里插入图片描述

交换指令实现位置互换,无所谓源操作数与目的操作数的位置前后,注意操作数不能是立即数,也不支持存储器与存储器之间数据对换
在8086处理器中,空操作指令(助记符NOP)NOP与xchg ax,ax等价。空指令有两个作用:(1)该指令在主存中占用一字节空间,可用来临时占用代码空间,以便后续填入需要的指令代码;执行空指令花费时间,可实现短时间延时。

(二)堆栈操作指令

堆栈是一个按照“先进后出FIFO”存取原则组织的存储区域。堆栈具有两种基本操作:数据压入堆栈(进栈指令PUSH),数据弹出堆栈(出栈指令POP)。
8086处理器的堆栈建立在主存区域中,SS段寄存器指向段基地址,堆栈段的范围由堆栈指针寄存器SP的初值确定,这个位置就是堆栈底部(栈底处于高地址,栈顶处于低地址,栈顶即为数据入口)。数据进入堆栈,SP逐渐减小(SP-2H);数据依次弹出堆栈,SP逐渐增大(SP+2H)
在这里插入图片描述
在这里插入图片描述

8086处理器的堆栈只能以字为单位操作。

1.进栈指令PUSH

由于目的位置就是栈顶,由SP确定,PUSH指令只表达源操作数。(SP自减)

格式为:push r16/m16/seg
<r16 表示16位通用寄存器内容,m16表示16位存储操作数,seg表示段寄存器内容>
PUSH操作步骤:
①SP←SP-2
②SS:[SP]←r16/m16/seg

进栈字量数据时,SP向低地址移动2字节单元指向栈顶,即减2(准备了两个字节的存储单元);然后数据以“低对低,高对高”的小端方式放到栈顶。
在这里插入图片描述

2.出栈指令POP

由于源操作数在栈顶,由SP确定,POP指令只表达目的操作数。(SP自增)

格式为:pop r16/m16/seg
POP操作步骤:
①r16/m16/seg←SS:[SP]
②SP←SP+2

出栈字量数据时,首先数据以“低对低,高对高”的小端方式原则从栈顶传送目的位置;然后SP向高地址移动2字节单元,即加2。
在这里插入图片描述
在这里插入图片描述

3.堆栈的应用

在这里插入图片描述

(三)其他传送指令

1.地址传送指令

存储器操作数具有地址属性,地址传送指令获取存储器操作数的地址
LEA r16,mem ;r16←mem的有效地址EA(不需类型一致)

LEA指令类似于地址操作符OFFSET的作用
LEA指令在指令执行时计算出偏移地址
OFFSET操作符在汇编阶段取得变量的偏移地址
OFFSET无需在执行时计算、指令执行速度更快
LEA指令能获取汇编阶段无法确定的偏移地址

2.换码指令

数据表是常见的数据结构,编程中经常需要获得数据表中某个特定的数据项,处理器为此专门设计了换码指令。
XLAT指令功能:AL←[BX+AL]
使用XLAT指令前,将BX指定的缓冲区中,AL指定的位移处的一个字节数据,取出赋给AL(由于XLAT指令隐含使用BX和AL,所以其助记符后无须写出操作数,默认该缓冲区在DS数据段)。

换码指令执行前:
在主存建立一个字节量表格,内含有目的代码,表格首地址存放于BX,AL存放相对表格首地址的位移量。
换码指令执行后:
将AL寄存器的内容转换为目标代码。

在这里插入图片描述

示例解惑:
在上例中,num相当于是索引值,tab是数据代码表,cx寄存器记录循环次数(当执行loop循环时cx会自减1,当cx=0时退出循环)
本例将要搜索的索引值num的偏移地址赋给si寄存器(因为基址变址寻址原则上是基址存放于BX/BP寄存器中,变址存放于SI/DI寄存器中,故此处的变址偏移量先存放于SI寄存器中),tab代码表的偏移地址赋给bx寄存器(XLAT指令功能:AL←[BX+AL] )然后将第一个索引值赋值给al寄存器,执行XLAT指令相当于用基址变址的方法寻址,将bx存储的代码表中的内容按照偏移量取出再放入AL寄存器里(此时AL寄存器里存的是代码表中对应索引值的字符ASCII码),最后显示完再调整si,指向下一个数字。

对于换码指令,我的个人理解是类似于先定义一个存储目标内容的数组(对应tab->bx)再定好要去找谁(对应num->si->al)最后从目标内容数组中取出对应索引的值,放到AL寄存器中(XLAT:AL←[BX+AL] )到此就完成了换码操作。

在这里插入图片描述

3.与IO交互的输入输出指令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君知燕云归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值