《数据传送类指令》由会员分享,可在线阅读,更多相关《数据传送类指令(20页珍藏版)》请在金锄头文库上搜索。
1、IBMPC汇编语言 程序设计(第2版)清华大学计算机系列教材教师:刘 琼qq:215089778电话:1807321311980X86指令系统分为以下6组:数据传送指令数据传送指令 串处理指令串处理指令算术指令算术指令 控制转移指令控制转移指令逻辑指令逻辑指令 处理机控制与杂项操作指令处理机控制与杂项操作指令在学习汇编指令时,指令的功能是我们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。因此,对指令要掌握以下几个方面内容: 指令操作数的寻址方式;指令操作数的寻址方式; 指令对标志位的影响、标志位对指令的影响;指令对标志位的影响、标志位对指令的影响;
2、 指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令 。第04讲(第04周):数据传送类指令(3课时)第第0404讲:数据传送类指令讲:数据传送类指令前一讲 后一讲3.33.3、80x8680x86的指令系统的指令系统总目录3.3. .、数据传送指令、数据传送指令数据传送指令负责把负责把“立即数立即数、地址地址、存储单元中的、存储单元中的数据数据”传送到传送到寄存器寄存器、存存储器储器或或端口号寄存器端口号寄存器。它相对于高级语言里的赋值语句。 分以下五种: 通用数据传送指令通用数据传送指令:XCHG(交换);MOV(传
3、送)、MOVSX( 带符号传送)、MOVZX(带零扩展传送);PUSH(进栈)、POP(出栈)、PUSHA/PUSHAD(所有通用寄存器入栈)、POPA/POPAD(所有通用寄存器出栈) 累加器专用传送指令( (输入输出输入输出) ): IN(输入)、OUT(输出)、XLAT(换码); 地址传送指令地址传送指令: LEA(有效地址寄存器)、LDS(指针送寄存器和DS); LES(指针送寄存器和ES)、LSS(指针送寄存器和SS);LFS(指针送寄存器和FS)、LGS(指针送寄存器和GS); 标志寄存器传送标志寄存器传送:LAHF(标志送AH)、 SAHF(AH送标志寄存器);DUSHF/DUS
4、HFD(标志入栈)、POPF/POPFD(标志出栈); 类型转换指令类型转换指令: CBW(字节转换成字)、 CWD/CWDE(字转换成双字);CDQ(双字转换成四字)、BSWAP(字节交换); 第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录(一)、通用数据传送指令具体格式 MOV Reg/MemMOV Reg/Mem,Reg/Mem/ImmReg/Mem/Imm 其中:Reg-Register(寄存器),Mem-Memory(存储器),Imm-Immediate(立即数) ,它们可以是8位、16位。 具体功能:把源操作数(SRC)的值传给目的操作数(DST)。指令执行后,
5、目的操作 数的值被改变,而源操作数的值不变。若存储单元是该指令的一个操作数时,该 操作数的寻址方式可以是任意一种存储单元寻址方式。在汇编语言中,主要的数据传送方式如下图所示。虽然一条MOV指令能实现 其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。 段寄存器 CS、DS、SS、ES通用寄存器 8位或者16位存储器立即数 8位或者16位1、普通传送指令 :MOV DST,SRC (不影响标志位)第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。(1)两个操作数的两个操作数的数据类型要相同数据类型要相
6、同,要同为8位、16位,如:MOV BL,AX等是不正确的;(2)两个操作数两个操作数不能同时为段寄存器不能同时为段寄存器,如:MOV ES,DS等; (3)代码段寄存器代码段寄存器CSCS不能为目的操作数不能为目的操作数,但可作为源操作数,但可作为源操作数,如:指令MOV CS, AX等不正确,但指令MOV AX,CS等是正确的; (4)立即数不能直接传给段寄存器立即数不能直接传给段寄存器, 如:MOV DS,100H等; (5)立即数不能作为目的操作数立即数不能作为目的操作数,如:MOV 100H,AX等; (6)指令指针指令指针IPIP不能作为不能作为MOVMOV指令的操作数指令的操作数
7、; (7)两个操作数不能同时为存储单元两个操作数不能同时为存储单元:如:MOV VARA,VARB等,其中VARA和VARB是同数据类型的内存变量。 第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录2、带符号扩展传送指令:MOVSX DST,SPC(不影响标志位) 具体格式: MOVSX REG1,REG2 REG1为16位时,REG2为8位; REG1为32位时,REG2为16位;MOVSX REG32,MEM16 REG32为32位,MEM16为16位; 具体功能:(DST)符号扩展(SRC)/8位符号扩展成16位、16位符号扩展成32位,符号扩展就是高8/16位一律补符
8、号位; 实例分析eg3.25,eg3.263、带零扩展传送指令:MOVZX DST SRC(不影响标志位) 具体格式:MOVZX REG1,REG2 REG1为16位时,REG2为8位; REG1为32位时,REG2为16位;MOVZX REG32,MEM16REG32为32位,MEM16为16位; 具体功能:(DST)零扩展(SRC)/8位零扩展成16位、16位零扩展成32位,零扩展就是高8/16位一律补0; 实例分析:eg3.25,eg3.26第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录4、入栈指令:PUSH SRC(不影响标志位)堆栈是一个重要的数据结构,它具有“先
9、进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。 具体格式:PUSH data/reg/segreg/memmem允许任何寻址方式,但8086不允许立即数寻址; 具体功能:16位指令(SP)(SP)2,(SP)+1 ,(SP) ) (SRC)32位指令(ESP)(ESP)4,(ESP)+3,(ESP)+2,(ESP)+1,(ESP)(SRC)即:堆栈指针先减2/4,然后将寄存器、段寄存器或存储器中的单/双字数据压入堆栈;是单/双字取决于操作数的长度。5、出栈指令:POP DST(不影响标志位) 具体格式:POP reg/segreg/mem DST不是“立即
10、数”和“CS”即可; 具体功能:16位指令(DST)(SP)+1,(SP),(SP)(SP)+2;32位指令(DST)(ESP)+3,(ESP)+2,(ESP)+1,(ESP),(ESP)(ESP)+4;即:先将栈顶单/双字元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,然堆栈指针加2/4 ;是单/双字取决于操作数的长度。第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录【例】PUSH AX28 16 A7SS=5000H50000堆栈段52500 52501 52502SP=2500H31 25AX283116 A7SS=5000H50000堆栈段52500 52501
11、 52502SP=24FEH2531 25AX525FF525FE(1)执行前(2)执行后【例】POP AX 与 PUSH AX 的操作恰好相反第04讲(第04周):数据传送类指令(3课时)前一讲 后一讲总目录第04讲(第04周):数据传送类指令(3课时)总结:(1)、80286及及其后机型的堆栈指针ESP/SP在指令执行前后始终 指向当前的栈顶,即最后一个入栈的元素,且栈顶指针栈底指针;(2)、栈操作只能允许“字”或“双字”出/入栈,是字还是双字出/入栈由操作数长度决定;(3)、80286中PUSH SP指令入栈的是SP的新值,而80386及其后机型的PUSH SP/ESP指令入栈的是SP/
12、ESP的旧值;(4)、PUSH 和POP指令中操作数寻址如果采用ESP为基址寄存器时,PUSH指令采用ESP的旧值,而POP指令采用ESP的新值实例1:若(ESP)=12345678H,(DS)=2000H(设段转换为20000000H)求:PUSH ESP 和 POP ESP访问哪里?例题分析Eg3.29 Eg 3.32;前一讲 后一讲总目录第04讲(第04周):数据传送类指令(3课时)6 6、所有通用寄存器入栈指令:、所有通用寄存器入栈指令:PUSHA /PUSHADPUSHA /PUSHAD( (不影响标志不影响标志) ) 功能功能将八个通用寄存器的值全部入栈,入栈次序如下:将八个通用寄
13、存器的值全部入栈,入栈次序如下: 1616位:位:AXAX、CXCX、DXDX、BXBX、SPSP、BPBP、SISI、DIDI依次入栈,然后依次入栈,然后(SP)(SP)(SP)-16(SP)-16; 3232位:位:EAXEAX、ECXECX、EDXEDX、EBXEBX、ESPESP、EBPEBP、ESIESI、EDIEDI依次入栈,然后依次入栈,然后(SP)(SP)(SP)-32(SP)-32; 注意:注意:( (SP/ESP)SP/ESP)进入栈的是进入栈的是PUSHA/PUSHADPUSHA/PUSHAD执行前执行前的内容的内容 例题:例题:PUSHA PUSHA 执行前执行前(AX
14、)=1200H,(CX)=3400H,(DX)=5600H,(BX)=7800H,(SP)=8A00H,(AX)=1200H,(CX)=3400H,(DX)=5600H,(BX)=7800H,(SP)=8A00H, (BP)=00ABH,(SI)=00BCH,(DI)=00DEH(BP)=00ABH,(SI)=00BCH,(DI)=00DEH;执行后;执行后(SP)=8BF0H,(SP)=8BF0H,栈如下:栈如下:7、所有通用寄存器出栈指令:POPA / POPAD(不影响标志) 功能将当前堆栈中连续的8个字/8个双字内容出栈并给相应的通用寄存器,出栈次序与 入栈PUSHA/PUSHAD反序
15、,最后(SP)(SP)16/32; 注意:当出栈给SP/ESP时,内容丢失不送入SP/ESP;8、交换指令:XCHG OPR1,OPR2(不影响标志位) 具体格式: XCHG REG1,REG2 通用寄存器与通用寄存器交换XCHG REG,MEM 通用寄存器与内存单元交换; 注意:交换双方可以是“字节”,“字”或“双字”内容,但两个操作数的长度必须相同。前一讲 后一讲总目录、累加专用传送指令:3条指令,仅限于使用AL,AX,EAX,用于ACC与I/O端 口交换数据,(不影响标志位);9、输入指令:IN 累加器,端口号(不影响标志位) 长格式(PORT为8位端口号)IN AL,PORT 字节操作:(AL) (PORT)IN AX,PORT 字操作:(AX) (PORT+1, PORT)IN EAX,PORT 双字操作:(EAX) (PORT+3, PORT+2, PORT+1, PORT) 短格式(DX中存放16位端口号)IN AL,DX字节操作:(AL) (DX)IN AX,DX字操作:(AX) (DX)+1, (DX)IN EAX,D