汇编指令--数据传输指令

一.数据传输指令

指令包括:MOV,XCHG,XLAT,LEA,LDS,LES,PUSH,POP,PUSHF,LAHF,SAHF,POPF,IN,OUT

重点掌握:MOV,XCHG,XLAT,LEA,PUSH,POP

1.MOV指令(move)

作用:把一个字或者字节的操作数从源地址传送到目标地址

;使用格式:
;mov target,source
;mem表示内存,imm表示立即数(数据),seg表示段寄存器
mov reg/mem,imm        ;mov ax,0123H
mov reg/mem/seg,reg    ;mov bx,ax
mov reg/seg,mem        
mov reg/mem,seg

注意事项:有source决定target的范围

1.target不能时CS(代码段寄存器)

2.target和source不能同时为内存数,段寄存器(CS/DS/ES/SS/FS/GS)

3.不能将立即数传送给段寄存器

4.target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。

5.由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target数的位数相同,再进行传送。有时,需要用BYTE PTR,WORD PTR明确指出立即数的位数

图示解析:

REG可以和REG,MEM,段寄存器,进行数据交流

im可以和REG,MEM进行数据交路

CS可以和REG,MEM进行数据交流

段寄存器可以和REG,MEM进行数据交流

MEM可以和段寄存器,REG进行数据交流

示例:

mov al,4    ;将4以字节的形式传送给al寄存器,为字节传送
mov cx,00FFH    ;将00FFH传送给CX寄存器,上述的4和00FF都为立即数,cx,al均为reg
mov si,0200H    ;将0200H传送给寄存器si,为字传送
mov ax,bx        ;将bx中的内容传送给ax,属于寄存器之间的操作
mov byte ptr [si] , 0ah      ;byte ptr说明是字节操作
mov ds,ax    ;将ax中的内容传送给段寄存器ds,属于段寄存器(seg)和寄存器之间的传送
mov [si],al    ;将al中的内容传递给段寄存器ds,属于段寄存器(seg)和寄存器之间的传送
;说明: 
[bp]--->ss:[bp]
[si]--->ds:[si]    ds作为段地址,si作为偏移地址
[bx]--->ds:[bx]

代码演示如下: 

 

 

 

 

 

 2.XCHG指令(exchange)

作用:将一个字节或者自己的源操作数和目的操作数相交换

;使用格式
;XCHG OPRD1,OPRD2
;     目的    源
XCHG reg,reg
XCHG reg,mem
XCHG mem,reg
;XCHG指令可以交换两个寄存器,寄存器->寄存器中的数据

示例:

xchg al,cl
xchg ax,[bx]
xchg [bx],ax
xchg al,ah

注意事项:

1.不能同时都为内存操作

2.任何一个寄存器都不能为段寄存器

3.任何一个操作不能是立即数

4.两个操作数的长度必须相等

代码演示:

 3.换码指令XLAT

作用:将bx指定的缓冲区,AL指定的位移处的一个字节数据取出赋值给AL

;使用格式
xlat     ;al<-ds:[bx+al] [bx+al]:整体作为偏移地址,al作为地址位移

 示例

mov bx,0100H
mov al,03H
xlat   
;al<-ds:[0100+03]H

 

4. 堆栈指令PUSH,POP

作用:将寄存器或者存储器中的数据按照堆栈操作的规则进行出入栈

;使用格式
;PUSH 源操作数
;POP    目的操作数
PUSH    reg/mem/seg
POP    reg/mem/seg

示例: 

PUSH ax;    将ax寄存器中的数据压入栈中
POP ax;    将栈顶中的数据出栈到ax中

注意事项:

1.当栈为空时不能进行出栈

2.指令的操作数必须是16位,即不能使用al这种8位寄存器

演示

ss:sp指向栈顶

未压栈

压栈后

出栈

 

5.地址传送指令LEA LDS LES

作用:将对应的地址表示送入对应的寄存器中

;使用格式
LEA reg,mem
LDS reg,mem
LES reg,mem

示例:

mov bx,0400H
mov si,3CH
lea bx,[bx+si+0f62H]
;bx = 0400H + 003CH + 0f62H = 139EH

LDS:将mem指定的字送入指定的寄存器中,并且DS=mem+2

LES:将mem指定的字送入指定的寄存器中,并且ES=mem+2

代码演示

 6.标志寄存器传送指令 LAHF,SAHF,PUSHF,POPF

作用:标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便对各个标志位的直接操作,首先需要了解一下什么是标志寄存器

标志寄存器:用来存储相关指令的某些执行结果,用来为CPU执行相关指令提供依据并可以以此来控制CPU的相关行为。8086中标志寄存器PSW(程序状态字)。该寄存器并不是用来存放普通数据的,而是按位起作用,每一位都有专门的含义。

SF:符号标志位,如果执行结果为负数,则SF=1,非负则SF=0;

ZF:零标志位,如果执行结果为0,则ZF=1,否则ZF=0;

PF:奇偶标志位,如果执行结果中所有二进制位中1的个数位偶数则PF=1,否则PF=0

CF:进/借位标志符,一般来说,再进行有符号的运算时,如果数据最高位产生了进位或者借位,CF=1,否则CF=0;一般表示有符号数的溢出;

OF:溢出标志位,运算结果超出了机器所能表示的范围称为溢出,溢出则OV=1

一般表示无符号数的溢出;

DF:方向标志位,在串处理指令操作后控制DI,SI的增减,如果DF=0,则前述寄存器递增,否则递减,注意DF的值由程序员通过CLD(0)和STD(1)指令设定;

TF:调试标志位,当TF=1时,处理器每次只执行一条指令,即单步执行;

IF:中断允许标志位,用来控制8086CPU是否可以接受外部中断请求。IF=1,则能相应外部中断,否则屏蔽外部中断;

AF:辅助进位标志位,运算过程中看第三位,不论长度多少。如果最后四位向前进位/借位,AF=1,否则AF=0;

 演示:

 

;使用格式 直接输入即可
;低8位传送
LAHF ;将标志寄存器的低字节传送给寄存器AH
     ;SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF ;SAHF将寄存器内容送入FLAGS的低字节
     ;用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志
;16位传送
PUSHF    ;PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
POPF     ;POPF指令将栈顶字单元内容送入标志寄存器,同时栈顶指针加2

7.输入输出指令IN,OUT 

8086通过输入输出指令与外设进行数据交换,呈现给程序员的外设是端口(Port),即I/O地址

8086的寻址方式

1.直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号

2.间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号

对大于FFH的端口只能采用间接寻址方式

;使用格式
;字节输入
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间接寻址)
;字节输出
OUT i8,al        ;I/O端口<-AL(i8直接寻址)
OUT dx,al        ;I/O端口<-AL(DX间接寻址)
;字输出
OUT i8,ax        ;I/O端口<-AX(i8直接寻址)
OUT DX,ax        ;I/O端口<-AX(DX间接寻址)

下列程序可以从CPU中的RAM中读取月份和日期(保存方式位BCD码)

mov al,8
out 70,al
in al,71        ;这三句可以将月份保存在al中
mov ah,7
mov al,7
out 70,al
in al,71        ;这三句可以将日期保存在al中