博主联系方式:
QQ:1540984562
微信:wxid_nz49532kbh9u22
QQ交流群:892023501(嵌入式方向)
QQ交流群:856398158(后端方向)

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176

传送类指令

指令分类
功能:把数据、地址、或立即数传送到寄存器或存储单元中 。

1.通用传送类指令:MOV指令

MOV指令的格式为:   MOV   DST,   SRC	(MOV指令的实质是:把SRC的内容复制到DST中,执行操作后 SRC的内容不变!)
语法格式:MOV reg/mem/seg ,reg/mem/seg/imm

Reg:寄存器,mem:存储器,seg:段寄存器,imm立即数
对标志位的影响:除标志寄存器传送指令外,均不影响标志位

当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明
MOV [BX+SI], 255 ;非法指令,修正:
MOV BYTE PTR [BX+SI],255;BYTE PTR说明是字节操作
MOV WORD PTR [BX+SI],255;WORD PTR说明是字操作

传输方向

MOV例题讲解:

问:将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。

MOV   SI,OFFSETAREA1;(OFFSET是取地址					
MOV   DI,OFFSETAREA2;  偏移量,必须加上)
;SI DI作为指针指向两个内存的首地址
MOV   CX,100;	循环次数为100	
AGAIN:MOV   AL,[SI];RD为低
       MOV [DI],AL  ;WR为低	通过中间寄存器,将SI指向的内容转移到DI指向的空间
       INC    SI	
       INC    DI	;指针自加1
       DEC   CX		;计数器减1
       JNZ  AGAIN 	;结果不为0转移		等效于LOOP

有关寻址方式的一些语法要求请看这里!!!

2.取有效指令LEA指令:

指令格式: LEA reg16 ,存储器寻址方式/地址标号
将源操作数指向的偏移地址送入寄存器中

LEA  BX,[BX+SI+0F62H]
如指令执行前:
(BX)=0400H,(SI)=003CH
则指令执行后:
(BX)=0400H+003CH+ 0F62H
            =139EH
            ;139EH是偏移地址!不是DS:139EH中的内容!

LEA 指令与MOV 指令的区别:
LEA SI,BUFF;将标号BUFF的偏移地址送入寄存器中
MOV SI,BUFF;将标号BUFF所指存储单元内容送入SI

LEA例题讲解:

问:如指令执行前(SI)=3000H,(BX)=0400H,MEEM=12000H,DS=1000H,执行LEA BX,MEEM指令后BX的内容为

BX存储的是MEEM的偏移地址,BX=MEEM-DS*16H=2000H;

问:执行LEA BX,(SI)指令后BX的内容为

BX存储的是SI的偏移地址所以BX=(SI)=3000H;

3.取地址指针指令:LDS、LES

LDS指令 (指针送寄存器和DS)
指令格式:LDS reg16 ,存储器寻址方式

语法格式:LDS reg16 ,reg16/mem/lable
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS

LDS例题讲解:

LDS AX,(SI +20 ) (20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H,
执行的结果为:AX=???,DS=???

执行的结果为:AX=???,DS=???

src存储单元地址=DS*16H + SI + 20H =20000+0030+0020=20050;

AX=(20050)=1234H;
DS=(20050+2)=5678H;

已知指令执行前(22000H~22005H)=12H、34H,56H、78H,9AH、BCH,AX=0000H,DS=2000H,BX=2000H,MEEM=22002H,执行指令LDS AX,MEEM和执行指令LDS AX,(BX)
过程

LES指令 (指针送寄存器和ES)
指令格式:LES reg16 ,存储器寻址方式
语法格式: LES reg16 ,reg16/mem/lable ;
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到ES中

LES例题讲解:

问:LES AX,20(SI)或 LES AX,(SI +20 ) 假设执行前为(20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H

执行的结果为:AX=???,ES=???

物理地址=20020+0030H=20050H

AX=(20050H)=1234H
ES=(20050+2H)=5678H

4.标志传送指令:LAHF、SAHF

LAHF SAHF

5.数据交换指令:XCHG

执行的操作:交换DST与SRC的内容 DST SRC
语法格式为: XCHG reg/mem,reg/mem

注意点:这种交换只能在通用寄存器之间、通用寄存器与存贮器之间进行,存储器与存储器之间不能交换段寄存器不能作为一个操作数。

例:XCHG BX ,[BP+SI]

如指令执行前:(BX)=6F30H,(BP)=0200H,2F246H=54H 2F247H=51H ,(SI)=0046H,(SS)=2F00H,(2F00H)=4254H,OPR2的物理地址=2F00×16+0200+0046=2F246H
则指令执行后:(BX)=5154H,(2F246H)=6F30H。

6.字节转换指令:XLAT

XLAT

7.堆栈操作指令:PUSH、POP、PUSHF、POPF

堆栈概念–存储器的一段区域,按“先进后出”的原则进行存取操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元

堆栈是一块特殊的存储区域,利用这块区域可以存储返回地址等信息,从而实现子程序的嵌套调用。
作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
PUSH:

指令格式:进栈 PUSH SRC (堆栈压入指令,进栈指令)
操作:(SP) (SP)-2, 指针-2
((SP)+1,(SP)) SRC 把操作数压入栈中
功能:将16位寄存器,段寄存器,16位存储单元数据压入堆栈。
POP:
指令格式: 出栈 POP DST
操作:(DST) ((SP)+1,(SP)),
(SP) (SP)+2
过程:

1
压栈和出栈的流程:

MOV  AX,8000H
MOV  SS,AX   ;设堆栈段地址  (SS)=8000H
MOV  SP,2000H ;设堆栈指针
MOV  DX,3E4AH
PUSH DX ;(先进) DX内容存入(SS×16+1FFEH=(SP-2))
PUSH AX  ; AX内容存入(SS×16+1FFCH =(SP-2-2) )
PUSH  (2000H);取数据段 (DS×16+2000H)内容进栈
             ;存入(SS×16+1FFAH =(SP-2-2-2) )
   
POP (2000H); (SS×16+1FFAH)到(DS×16+2000H)
POP   AX     ; (SS×16+1FFCH)到AX 
POP   DX   ;(后出) (SS×16+1FFEH)到DX

流程
PUSHF和POPF:
在这里插入图片描述
在这里插入图片描述

栈操作例题讲解:

1、交换DS 和 ES的内容

PUSH DS;
PUSH ES;
POP DS;
POP ES;

2、在子程序设计时,需要从子程序返回时保持通用寄存器不变,这时候可以利用堆栈把寄存器保护起来

PUSH AX;
PUSH BX;
PUSH CX;
PUSH DX;
//调用子程序;
//子程序返回;
POP DX;
POP CX;
POP BX;
POP AX;

注意事项:

PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;
·堆栈操作只能作字操作;
·SS:SP在任何时候都指向当前的栈顶

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176