数据传送类指令

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.2.1 数据传送类指令

数据传送指令用于实现寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、立即数到寄存器或存储器之间的字节或字的传送。这类指令的共同特点是不影响标志寄存器的内容(SAHF,POPF除外)。堆栈操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。

1.通用数据传送指令

通用数据传送指令包括传送指令MOV、堆栈操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交换指令XCHG和查表转换指令XLAT。这类指令是唯一允许以段寄存器作为操作数的指令(XCHG除外)。

表3.4 数据传送类指令

指令类型指令书写格式指令功能

通用数据传送指令MOV 目标,源

PUSH 源

POP 目标

XCHG 目标,源

XLAT 字节或字传送

字压入堆栈

字弹出堆栈

字节或字交换

字节翻译

目标地址传送指令LEA 目标,源

LDS 目标,源

LES 目标,源装入有效地址

装入DS寄存器

装入ES寄存器

标志位传送指令LAHF

SAHF

PUSHF

POPF 将FR低字节装入AH寄存器

将AH内容装入FR低字节

将FR内容压入堆域

从堆栈弹出FR内容

I/O数据传送指令IN 累加器,端口

OUT 端口,累加器从端口输入字节或字

将字节或字输出到端口

(1)MOV 传送指令

指令格式:MOV OPD,OPS

指令功能:将源操作数OPS传送到目的操作数OPD,即(OPD)→(OPS)。

源操作数OPS可以是8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的立即数。

(2)PUSH进栈(压入)指令

指令格式:PUSH OPS

指令功能:将源操作数OPS压入堆栈,即SP–2 → SP,OPS → (SPH,SP)。

源操作数0PS可以是16位通用寄存器、段寄存器或存储器中的数据字,以保证堆栈按“字”操作。源操作数OPS不能是立即数。

由于堆栈是按“后进先出”方式工作,所以每次执行PUSH指令时,总是首先修改栈指针(S P)–2 → SP (即SP先减2),使之指向新栈顶,然后把源操作数压入堆栈中SP所指示

的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。

由于堆栈总是按字操作,所以,SP总是指向字地址单元,堆栈段基址由SS确定。堆栈最大容量为64K。

(3)POP出栈(弹出)指令

指令格式:POP OPD

指令功能:将堆栈中当前SP所指示的栈顶的一个字传送到指定的目的操作数OPD中,同时修改栈指针,即(SP+1,SP)→ OPD,(SP)+ 2 → SP,出栈操作是进栈操作的逆过程。

目的操作数OPD可以是16位通用寄存器、段寄存器或存储单元,但CS不能作目的操作数。和进栈指令不同的是,出栈操作时是先将数据弹出送入目标地址,然后修改栈指针,即将S P减2送SP,这时SP向高地址端移动,指向新的栈顶。

(4)XCHG数据交换指令

指令格式:XCHG OPD,OPS

指令功能:把一个字或字节的源操作数OPS与目的操作数OPD互相交换位置。

即(OPD)→ OPS,(OPS)→ OPD。

源操作数OPS可为通用寄存器或存储器,目的操作数OPD只能为通用寄存器。因此,交换指令可以在通用寄存器之间、通用寄存器与累加器之间、通用寄存器与存储器之间进行。段寄存器不能作为操作数。

(5)XLAT查表转换指令(换码指令)

指令格式:XLAT 转换表

或XLAT

指令功能:将[BX]为首址,[AL]为位移量的字节存储器单元中的数据→ AL,即[BX+AL] → AL。

查表转换指令XLAT可用来将一种代码转换成另一种代码,或者说可使累加器中的一个值

变换为内存表格中的某一个值。具体实现是这样的:

使用XLAT指令之前必须先在内存(数据段)中建立一个表格,表格的内容就是所需要转换的代码,表格最多不超过256个字节,将表格的起始地址事先装入BX寄存器中,AL中存放所要查找的对象(表中某一项)到表首地址间的位移量。执行XLAT指令时,就将BX 中的内容和AL中的内容相加作为有效地址,将表格中与该地址相对应的单元中的内容取出并传送到AL中。也就是说,指令执行后所要查找的对象(即转换后的代码)就在AL中,BX中内容保持不变。可见,只要改变AL的值即可从表中找到不同的代码。

例:利用XLAT指令将一位十六进制数转换为对应的ASCII码。

为实现这一转换,首先应在内存数据段建立一个表格,表中存放着十六进制数0,1,…,F 的ASCII码,并将表格的首地址置于BX中,AL中置入所要查找的十六进制数距表头的位移量,比如现在要查找表中第5项内容,则AL中应置入4。实现上述操作的程序如下:DATA SEGMENT

TAB DB ‘0 1 2 3 4 5 6 7 8 9 A B C D E F’

DATA END

MOV BX,OFFSET TAB ;变量TAB的有效地址FA → BX,即表示首址

MOV AL,4 ;TAB表中第5项的位移量4 → AL

XLAT TAB ;([BX+AL])=(TAB+4)=34H → AL

上述过程如图3.5所示。程序中DATA SEGMENT到DATA END之间的语句是十六进制数的ASCII码表。

2.地址传送指令

8086/8088指令系统中有3条专门用于传送地址的指令:LEA、LDS和LES。可用来传送操作数的段地址或偏移地址。

相关文档
最新文档