8086指令系统---数据传送指令
2015-09-23 来源:eefocus
8086指令系统分为以下6组:
⒈ 数据传送指令
⒉ 算术指令
⒊ 逻辑指令
⒋ 串处理指令
⒌ 控制转移指令
⒍ 处理机控制指令
数据传送指令
数据传送指令的功能是把数据、地址传送到寄存器或存储器单元中。它分为4类。
⑴ 通用数据传送指令 ⑵ 累加器专用传送指令
MOV 传送 IN 输入
PUSH 进栈 OUT 输出
POP 出栈 XLAT 换码
XCHG 交换
⑶ 地址传送指令 ⑷ 标志寄存器传送指令
LEA 有效地址送寄存器 LAHF 标志送AH
LDS 指针送寄存器和DS SAHF AH送标志寄存器
LES 指针送寄存器和ES PUSHF 标志进栈
POPF 标志出栈
1 通用数据传送指令
MOV dst, src;传送指令(move)
执行操作:(dst) ← (src)
功能: 将源操作数(字节或字)传送到目的地址。
注意:
● 目的操作数dst和源操作数src不能同时用存储器寻址方式,这个限制适用于所有指令;
● 目的操作数dst不能是CS,也不能用立即数方式;
● 目的操作数dst和源操作数src不允许同时为段寄存器;
● MOV指令不影响标志位。
PUSH src ; 进栈指令(push onto the stack)
执行操作: (SP) ← (SP)-2
((SP)) ← (src)
POP dst ; 出栈指令(pop from the stack)
执行操作: (dst) ← ((SP))
(SP) ← (SP)+2
PUSH和POP指令分别将数据存入堆栈或把堆栈中的数据取出。堆栈是以LIFO(后进先出)方式工作的一个存储区,程序中定义的堆栈段就是这样一个LIFO存储区。数据存入堆栈单元或从堆栈单元中取出都由堆栈指针SP指示,而SP总是指向栈顶,所以进栈和出栈指令都会自动修改SP。
PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,存储的方法同样是高8位存入高地址字节,低8位存入低地址字节。POP指令执行时,将SP所指示的栈顶地址的内容取出放入目的地址,然后SP增2,指向新的栈顶地址。
注意:
● PUSH和POP指令只能是字操作,因此存取字数据后,SP的修改必须是+2或-2;
● PUSH和POP指令不能使用立即数方式;
● POP指令的dst不允许是CS寄存器;
● PUSH和POP指令都不影响标志位。
PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。
XCHG opr1, opr2 ; 交换指令(exchange)
执行操作:(opr1) ←→ (opr2)
XCHG指令使两个操作数opr1,和opr2互相交换,其中一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。
注意:
● 不允许使用段寄存器
● 不影响标志位
例 假设(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。
PUSH DS
PUSH BX
PUSH [BX]
POP DI
POP WORD PTR [DI+2]
POP DS
执行结果: (SP)=100H-2=0FEH (SP)=0FE-2=0FCH (SP)=0FC-2=0FAH
(400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H
执行结果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H
(DI)=00A8H (100AAH)=2100H (DS)=1000H
例 已知(AX)=6634H, (BX)=0F24H, (SI)=0012H, (DS)=1200H, (12F36H)=2500H, 写出下列指令执行的结果。
XCHG AH,AL ; 执行前: (AH)=66H, (AL)=34H
; 执行后: (AH)=34H, (AL)=66H
XCHG AX,[BX+SI] ; 执行前: (AX)=6634H, (12F36H)=2500H
; 执行后: (AX)=2500H, (12F36H)=6634HH
2 累加器专用传送指令
这组指令只限于使用累加器(ac:AX 或AL)传送信息。
IN ac, port ; 输入指令(input), port≤0FFH
执行操作: (AL) ← (port) 传送字节
或 (AX) ← (port+1,port) 传送字
IN ac, DX ; 输入指令, DX中的port>0FFH
执行操作: (AL) ← ((DX)) 传送字节
或 (AX) ← ((DX)+1,(DX)) 传送字
OUT port, ac ; 输出指令(output), port≤0FFH
执行操作: (port) ← (AL) 传送字节
或 (port+1,port) ← (AX) 传送字
OUT DX, ac ; 输出指令(output), DX中的 port>0FFH
执行操作: ((DX)) ← (AL) 传送字节
或 ((DX)+1,(DX)) ← (AX) 传送字
对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。微处理机分配给外部设备最多有64K个端口,其中前256个端口(0~FFH)称为固定端口,可以直接在指令中指定。当端口地址超过8位(≥256),称为可变端口,它必须先送到DX寄存器,然后再用IN或OUT指令传送信息。CPU与I/O端口传送信息的寄存器只限于累加器ac (AX或AL),传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。
注意:
● 只限于在AL或AX与I/O端口之间传送信息
● 不影响标志位
XLAT ; 换码指令(translate)
执行操作: (AL) ← ((DS)×16+(BX)+(AL))
这条指令根据AL寄存器提供的位移量,将BX指示的字节表格中的代码换存在AL中。该指令还可写为:XLAT opr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。
注意:
● 所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL;
● XLAT指令不影响标志位。
例 IN AL, 61H ; (AL) ← 端口61H的内容
MOV DX, 278H ; (DX) ← 端口地址278H
IN AL, DX ; (AL) ← 端口278H的内容
例 OUT 61H, AL ; 61H端口 ← (AL)
MOV DX, 279H ; (DX) ← 端口地址279H
OUT DX, AX ; 279H端口 ← (AX)
3 地址传送指令
这组指令完成把地址送到指定寄存器的功能。
LEA reg, src ; 有效地址送寄存器(load effective address)
执行操作:(reg) ← offset of src
LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。
LDS reg, src ; 指针送寄存器和DS(load DS with point)
执行操作: (reg) ← (src)
(DS) ← (src+2)
LES reg, src ; 指针送寄存器和ES(load ES with point)
执行操作: (reg) ← (src)
(ES) ← (src+2)
LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址送DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。
注意:
● 指令中的reg不能是段寄存器;
● 指令中的src必须使用存储器寻址方式;
● 该指令不影响标志位。
例假设某数据段定义如下:
0000 DATA SEGMENT
0000 0040 TABLE DW 0040H
0002 3000 DW 3000H
0004 DATA ENDS
请指出下列指令的执行结果,并说明它们之间的区别。
① MOV BX, TABLE
② LEA BX, TABLE
③ MOV BX, OFFSET TABLE
答:第①条指令执行后,(BX)=0040H,
第②条指令执行后,(BX)=0000,
第③条指令执行后,(BX)=0000。
比较①②两条指令,第①条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。
比较②③两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。既然功能相同,它们之间还有什么区别呢?
首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。
其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。
例 对例3.17的数据定义,下列两条指令的执行结果是什么?
① LDS BX, TABLE
② LES BX, TABLE
答:LDS指令执行后,(BX)=0040H, (DS)=3000H
LES指令执行后,(BX)=0040H, (ES)=3000H
4 标志寄存器传送指令
这组指令完成和标志位有关的操作。
LAHF 标志寄存器的低字节送AH(load AH with flags)
SAHF AH送标志寄存器低字节(store AH into flags)
PUSHF 标志进栈(push the flags)
POPF 标志出栈(pop the flags)
注意:
● LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS
● LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。
LAHF 标志寄存器的低字节送AH(load AH with flags)
执行操作:
(AH) ← (FLAGS)0-7
SAHF AH送标志寄存器低字节(store AH into flags)
执行操作:
(FLAGS) 0-7 ← (AH)
PUSHF 标志进栈(push the flags)
执行操作:
(SP) ← (SP)-2
((SP)+1,(SP)) ← (FLAGS)0-15
POPF 标志出栈(pop the flags)
执行操作:
(FLAGS) 0-15 ← ((SP)+1,(SP))
(SP) ← (SP)+2
进入单片机查看更多内容>>
⒈ 数据传送指令
⒉ 算术指令
⒊ 逻辑指令
⒋ 串处理指令
⒌ 控制转移指令
⒍ 处理机控制指令
数据传送指令的功能是把数据、地址传送到寄存器或存储器单元中。它分为4类。
⑴ 通用数据传送指令 ⑵ 累加器专用传送指令
MOV 传送 IN 输入
PUSH 进栈 OUT 输出
POP 出栈 XLAT 换码
XCHG 交换
⑶ 地址传送指令 ⑷ 标志寄存器传送指令
LEA 有效地址送寄存器 LAHF 标志送AH
LDS 指针送寄存器和DS SAHF AH送标志寄存器
LES 指针送寄存器和ES PUSHF 标志进栈
POPF 标志出栈
1 通用数据传送指令
MOV dst, src;传送指令(move)
执行操作:(dst) ← (src)
功能: 将源操作数(字节或字)传送到目的地址。
注意:
● 目的操作数dst和源操作数src不能同时用存储器寻址方式,这个限制适用于所有指令;
● 目的操作数dst不能是CS,也不能用立即数方式;
● 目的操作数dst和源操作数src不允许同时为段寄存器;
● MOV指令不影响标志位。
PUSH src ; 进栈指令(push onto the stack)
执行操作: (SP) ← (SP)-2
((SP)) ← (src)
POP dst ; 出栈指令(pop from the stack)
执行操作: (dst) ← ((SP))
(SP) ← (SP)+2
PUSH和POP指令分别将数据存入堆栈或把堆栈中的数据取出。堆栈是以LIFO(后进先出)方式工作的一个存储区,程序中定义的堆栈段就是这样一个LIFO存储区。数据存入堆栈单元或从堆栈单元中取出都由堆栈指针SP指示,而SP总是指向栈顶,所以进栈和出栈指令都会自动修改SP。
PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,存储的方法同样是高8位存入高地址字节,低8位存入低地址字节。POP指令执行时,将SP所指示的栈顶地址的内容取出放入目的地址,然后SP增2,指向新的栈顶地址。
注意:
● PUSH和POP指令只能是字操作,因此存取字数据后,SP的修改必须是+2或-2;
● PUSH和POP指令不能使用立即数方式;
● POP指令的dst不允许是CS寄存器;
● PUSH和POP指令都不影响标志位。
PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。
XCHG opr1, opr2 ; 交换指令(exchange)
执行操作:(opr1) ←→ (opr2)
XCHG指令使两个操作数opr1,和opr2互相交换,其中一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。
注意:
● 不允许使用段寄存器
● 不影响标志位
例 假设(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。
PUSH DS
PUSH BX
PUSH [BX]
POP DI
POP WORD PTR [DI+2]
POP DS
执行结果: (SP)=100H-2=0FEH (SP)=0FE-2=0FCH (SP)=0FC-2=0FAH
(400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H
执行结果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H
(DI)=00A8H (100AAH)=2100H (DS)=1000H
例 已知(AX)=6634H, (BX)=0F24H, (SI)=0012H, (DS)=1200H, (12F36H)=2500H, 写出下列指令执行的结果。
XCHG AH,AL ; 执行前: (AH)=66H, (AL)=34H
; 执行后: (AH)=34H, (AL)=66H
XCHG AX,[BX+SI] ; 执行前: (AX)=6634H, (12F36H)=2500H
; 执行后: (AX)=2500H, (12F36H)=6634HH
这组指令只限于使用累加器(ac:AX 或AL)传送信息。
IN ac, port ; 输入指令(input), port≤0FFH
执行操作: (AL) ← (port) 传送字节
或 (AX) ← (port+1,port) 传送字
IN ac, DX ; 输入指令, DX中的port>0FFH
执行操作: (AL) ← ((DX)) 传送字节
或 (AX) ← ((DX)+1,(DX)) 传送字
OUT port, ac ; 输出指令(output), port≤0FFH
执行操作: (port) ← (AL) 传送字节
或 (port+1,port) ← (AX) 传送字
OUT DX, ac ; 输出指令(output), DX中的 port>0FFH
执行操作: ((DX)) ← (AL) 传送字节
或 ((DX)+1,(DX)) ← (AX) 传送字
对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。微处理机分配给外部设备最多有64K个端口,其中前256个端口(0~FFH)称为固定端口,可以直接在指令中指定。当端口地址超过8位(≥256),称为可变端口,它必须先送到DX寄存器,然后再用IN或OUT指令传送信息。CPU与I/O端口传送信息的寄存器只限于累加器ac (AX或AL),传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。
注意:
● 只限于在AL或AX与I/O端口之间传送信息
● 不影响标志位
XLAT ; 换码指令(translate)
执行操作: (AL) ← ((DS)×16+(BX)+(AL))
这条指令根据AL寄存器提供的位移量,将BX指示的字节表格中的代码换存在AL中。该指令还可写为:XLAT opr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。
注意:
● 所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL;
● XLAT指令不影响标志位。
MOV DX, 278H ; (DX) ← 端口地址278H
IN AL, DX ; (AL) ← 端口278H的内容
例 OUT 61H, AL ; 61H端口 ← (AL)
MOV DX, 279H ; (DX) ← 端口地址279H
OUT DX, AX ; 279H端口 ← (AX)
这组指令完成把地址送到指定寄存器的功能。
LEA reg, src ; 有效地址送寄存器(load effective address)
执行操作:(reg) ← offset of src
LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。
LDS reg, src ; 指针送寄存器和DS(load DS with point)
执行操作: (reg) ← (src)
(DS) ← (src+2)
LES reg, src ; 指针送寄存器和ES(load ES with point)
执行操作: (reg) ← (src)
(ES) ← (src+2)
LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址送DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。
注意:
● 指令中的reg不能是段寄存器;
● 指令中的src必须使用存储器寻址方式;
● 该指令不影响标志位。
0000 DATA SEGMENT
0000 0040 TABLE DW 0040H
0002 3000 DW 3000H
0004 DATA ENDS
请指出下列指令的执行结果,并说明它们之间的区别。
① MOV BX, TABLE
② LEA BX, TABLE
③ MOV BX, OFFSET TABLE
答:第①条指令执行后,(BX)=0040H,
第②条指令执行后,(BX)=0000,
第③条指令执行后,(BX)=0000。
比较①②两条指令,第①条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。
比较②③两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。既然功能相同,它们之间还有什么区别呢?
首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。
其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。
例 对例3.17的数据定义,下列两条指令的执行结果是什么?
① LDS BX, TABLE
② LES BX, TABLE
答:LDS指令执行后,(BX)=0040H, (DS)=3000H
LES指令执行后,(BX)=0040H, (ES)=3000H
4 标志寄存器传送指令
这组指令完成和标志位有关的操作。
LAHF 标志寄存器的低字节送AH(load AH with flags)
SAHF AH送标志寄存器低字节(store AH into flags)
PUSHF 标志进栈(push the flags)
POPF 标志出栈(pop the flags)
注意:
● LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS
● LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。
LAHF 标志寄存器的低字节送AH(load AH with flags)
执行操作:
(AH) ← (FLAGS)0-7
SAHF AH送标志寄存器低字节(store AH into flags)
执行操作:
(FLAGS) 0-7 ← (AH)
PUSHF 标志进栈(push the flags)
执行操作:
(SP) ← (SP)-2
((SP)+1,(SP)) ← (FLAGS)0-15
POPF 标志出栈(pop the flags)
执行操作:
(FLAGS) 0-15 ← ((SP)+1,(SP))
(SP) ← (SP)+2
相关文章