数据传送指令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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间接寻址)

相关文档
最新文档