数据传送指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.8086指令系统操作数符号表示
DST->目的操作数
SRC->源操作数
TARGET->循环、转移和调用指令操作数
reg->寄存器操作数,字节或字
reg8->寄存器操作数,字节
reg16->寄存器操作数,字
mem->存储器操作数,字节或字
mem8->字节型存储器操作数
mem16->字型存储器操作数
mem32->双字型存储器操作数
acc->累加器AL或AX
seg->段寄存器
imm->立即操作数,字节或字
imm8->8位立即操作数
imm16->16位立即操作数
short_label->短标号(8位偏移量)
near_label->近标号(16位地址或偏移)
far_label->远标号(32位地址)
指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式
指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响
其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等
一、数据传送类指令
1.Mov(mov目的操作数,源操作数)
目的操作数:reg、seg、mem
源操作数:reg、seg、mem、imm
注意事项:
1、立即数不能直接送入段寄存器内
2、存储器之间不能互相送数
3、段寄存器之间不能相互送数
4、目的操作数不允许用段寄存器CS
5、送数的时候需要明确是字操作还是字节操作,即源操作数和目的操作数的位数
要统一,除非目的操作数的位数大于源操作数。(寄存器有明确的字节或字类型,
有寄存器参与的指令其操作数类型就是寄存器的类型;对于存储器单元与立即
数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr
指示字类型)
如何判断
✧两个操作数都明确了,两者必须一致
✧两个操作数有一个明确,另一个就以明确的为依据
✧两个操作数都不明确,就会出错
2.XCHG(把两个地方的数据进行互换;XCHG 目的操作数,源操作数)
目的操作数:寄存器、存储器
源操作数:寄存器、存储器
注意:
1.存储器之间不能相互传数据
2.一般目的操作数与与操作数可以互换
3.XLAT(用于查表转换;XLAT)
目的操作数和源操作数隐含
源操作数:位于地址为DS:[BX+AL]中的一个字节的数据,即(DS:[BX+AL])
目的操作数:寄存器AL
注意:
1.执行该指令前,需要先执行两条指令
Mov bx,表格的首地址偏移量
Moval,被转换码
2.换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码;表格
首地址存放于BX,AL存放相对表格首地址的位移量
换码指令执行后:将AL寄存器的内容转换为目标代码
4.堆栈操作指令
SS段寄存器记录其段地址,堆栈只有一个出口,即当前栈顶;用堆
栈指针寄存器SP指定
✧进栈指令:Push目的操作数;
进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈
顶部
✧POP目的操作数;
出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指
针SP加2
注意:
1.目的操作数为mem16;reg16;seg
2.堆栈是向下生长的(即栈顶地址逐渐减小)
3.这个存储区最大地址的字单元为堆栈底部,称为栈底(bottom)
4.任何时刻存放最后一个字的存储单元地址称为栈顶(top)(SP的值)
5.栈底是不变的,栈顶是变化的
6.字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字。
7.堆栈操作遵循先进后出原则,但可用BP寻址方式随机存取堆栈中的数据。
8.POP指令的目的操作数不能为CS!!!!
应用:
保护现场:(注意进出栈的顺序)
fun:
PUSH DS
PUSH ES
PUSH AX
PUSH BX ;处理部分
POP BX
POP AX
POP ES
POP DS
RET
用堆栈交换数据(注意进出栈顺序)PUSH AX
PUSH BX
POP AX
POP BX
♌堆栈的建立和操作(代码及示意图)
5.标志寄存器传送指令(用来传送标志寄存器FLAGS的内容,方便进行对各个标志位
的直接操作)
有2对4条指令
✧低8位传送:LAHF和SAHF
✧16位传送:PUSHF和POPF
LAHF;AH←FLAGS的低字节
LAHF指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF;FLAGS的低字节←AH
SAHF将AH寄存器内容送FLAGS的低字节
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
PUSHF;(SP←SP-2;SS:[SP]←FLAGS)
栈顶指针SP先减2,PUSHF指令将标志寄存器的内容压入堆栈
POPF;(FLAGS←SS:[SP];SP←SP+2)
POPF指令将栈顶字单元内容送标志寄存器,然后栈顶指针SP加2
注意:
源操作数和目的操作数都隐含。
♌对标志位进行修改:
pushf ;保存全部标志到堆栈
pop ax ;从堆栈中取出全部标志
or ax,0100h ;设置D8=TF=1,ax其他位不变
push ax ;将ax压入堆栈
popf ;FLAGS←AX;将堆栈内容取到标志寄存器
6.地址传送指令(地址传送指令将存储器单元的逻辑地址送至指定的寄存器)
✧有效地址(偏移地址)传送指令LEA(load EA;LEA r16,mem)
将存储器操作数的有效地址传送至指定的16位寄存器中
✧指针传送指令(这两条指令主要用在串操作,mem指定主存的连续4个字节
作为逻辑地址(32位的地址指针),送入DS:[r16]或ES:[r16]) LDS r16,mem(r16←mem;DS←mem+2)
LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器
LES r16,mem(r16←mem;ES←mem+2)
LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
♌课本P46示例
7.输入输出指令(与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地
址)
目的操作数:AX/AL
源操作数:imm8(00H-0FFH)/DX(ALL)
格式:
输入指令:
IN AL,i8;字节输入:AL←I/O端口(i8直接寻址)
IN AL,DX;字节输入:AL←I/O端口(DX间接寻址)
IN AX,i8;字输入:AX←I/O端口(i8直接寻址)
IN AX,DX;字输入:AX←I/O端口(DX间接寻址)