您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第3.3.1 数据传送指令
第3章80x86的指令系统和寻址方式3.3.1数据传送指令3.3.1.1通用数据传送指令3.3.1.2累加器专用传送指令3.3.1.3地址传送指令3.3.1.4标志寄存器传送指令3.3.1.5类型转换指令返回本节首页第3章80x86的指令系统和寻址方式3.3.1.1通用数据传送指令(1)传送指令MOV(2)传送指令MOVSX(3)传送指令MOVZX(4)进栈指令PUSH(5)出栈指令POP(6)进栈指令PUSHA/PUSHAD(7)出栈指令POPA/POPAD(8)交换指令XCHG第3章80x86的指令系统和寻址方式(1)传送指令MOV格式:MOVDST,SRC功能:将源操作数传送入目的地址,源地址内容不变。即(SRC)→(DST)。其中:DST表示目的操作数,SRC表示源操作数。MOV指令的机器语言可以有7种格式:(P32)MOVmem/reg1,mem/reg2当然,双操作数指令不允许两个操作数都使用存储器,因而两个操作数中必须有一个是寄存器。这种方式不允许指定段寄存器。MOVreg,data其中reg指定寄存器,data为立即数。当然,这种方式也不允许指定段寄存器。第3章80x86的指令系统和寻址方式MOVac,mem其中ac为累加器。MOVmem,acMOVsegreg,mem/reg其中,segreg指定段寄存器,但不允许使用cs寄存器。此外,这条指令执行完后不响应中断,要等下一条指令执行完后才可能响应中断。MOVmem/reg,segregMOVmem/reg,data这种方式的目的操作数只用存储器寻址方式而不用寄存器方式。第3章80x86的指令系统和寻址方式图3.9bMOV指令所允许的数据传送路径及类型图3.9b描述了MOV指令在传送数据时允许传送的路径及类型第3章80x86的指令系统和寻址方式注意:1、立即数不能直接送段寄存器:MOVCS,12H;MOVDS,12H;MOVSS,12H;MOVES,12H;2、目的操作数不能是立即数、CS。MOV12H,AL;MOVCS,AX;3、不允许在两个段寄存器之间直接传送数据。MOVDS,CS;MOVDS,SS;……4、不允许在两个存储单元(字或字节)之间直接传送数据。MOV[2000H],[BX];MOV[DI],[BP];…….5、源操作数和目的操作数的数据类型必须一致。MOVBX,AL;6、MOV指令不影响标志位。第3章80x86的指令系统和寻址方式【例】数据传送指令举例。MOVDS,AX;AX中的16位数送DSMOVBL,AL;AL中的8位数送BLMOVCL,30;立即数30送CLMOVSI,057BH;立即数057BH送SIMOVAX,[BX];BX和BX+1所指的两内存单元内容送AXMOV[DI],AX;AX内容送DI和DI+1所指的两内存单元第3章80x86的指令系统和寻址方式【例】数据传送指令举例。例3.20MOVAX,DATA-SEGMOVDS,AX例3.21MOVAL,’E’;把立即数(E的ASCII码)送AL寄存器例3.22MOVBX,OFFSETTABLE例3.23MOVAX,Y[BP][SI]例3.24MOVEAX,[EBX+ECX*4]MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,[DI];源操作数为寄存器间接寻址MOVDI,ES:3[SI];源操作数为变址寻址,使用跨段越前缀MOVBUFA,DL;BUFA是一字节变量MOV[BP],AX;使用SS段寄存器MOVDS:[BP],DL;使用跨段越前缀MOVBUF,DS;BUF是个字变量MOVES,BUF第3章80x86的指令系统和寻址方式【例】判断下列指令的对错。MOVAX,1000HMOV1000H,AXMOVAX,BHMOV[BX],ALMOVAL,[BX][SI]MOV[SI+DI],AXMOVES:[VALUE],DXMOVAX,ES:BX对错错对?对?错对?错第3章80x86的指令系统和寻址方式MOVAX,[DX]MOVDS,1000HMOVDS,AXMOVAX,DSMOV[2000H],SSMOV[BX],[2000H]MOVCS,AXMOVDS,ESMOVDX,AL错p28错对对对错错错错第3章80x86的指令系统和寻址方式(2)MOVSX带符号扩展传送指令(386以上)格式:MOVSXDST,SRC功能:(DST)符号扩展(SRC)。本指令有两种格式:MOVSXreg1,reg2MOVSXreg,mem将8位带符号的数符号扩展到16位或32位,也可以是16位带符号的数符号扩展到32位。不影响标志位。例3.25MOVSXEAX,CL;把CL寄存器中的8位数,符号扩展到32位,送到EAX寄存器中。例3.26MOVSXEDX,[EDI];把DS段中由EDI内容指定地址的16位数,符号扩展到32位数,送到EDX寄存器中。第3章80x86的指令系统和寻址方式(3)MOVZX带零扩展传送指令(386以上)格式:MOVZXDST,SRC功能:(DST)零扩展(SRC)。本指令有两种格式:MOVZXreg1,reg2MOVZXreg,mem将8位无符号整数零扩展到16位或32位,也可以是16位无符号整数零扩展到32位。不影晌标志位。例3.27MOVZXDX,AL;把AL寄存器中的8位无符号整数,零扩展符号到16位,送到DX寄存器中。例3.28MOVZXEAX,DATA;把DATA单元中的16位无符号整数,零扩展扩展到32位数,送到EAX寄存器中。注意:MOVSX和MOVZX的源操作数长度一定要小于目的操作数长度。第3章80x86的指令系统和寻址方式(4)进栈指令PUSH语句格式:PUSHSRC功能:堆栈指针减2,将寄存器、段寄存器或存储器中的一个字或双字数据压入堆栈。例:指令PUSHAX分两步进行:第一步,SP-1送SP,把AH(高字节)的内容送SP所指的存储单元;第二步,再做SP-1送SP,把AL(低字节)的内容送SP所指的存储单元。16位指令:①(SP)←(SP)-2②((SP)+1,(SP))←(SRC)32位指令:①(ESP)←(ESP)-4②((ESP)+3,(ESP)+2,(ESP)+1,(SP))←(SRC)第3章80x86的指令系统和寻址方式(5)出栈指令POP语句格式:POPDST功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2或加4。例:指令POPAX分两步进行:第一步,SP所指的存储单元的内容送AL(低字节),SP+1送SP;第二步,把SP所指的存储单元的内容送AH(高字节),再做SP+1送SP。从POP指令功能可看出,该指令为PUSH指令的逆过程。16位指令:①(DST)←((SP)+1,(SP))②(SP)←(SP)+232位指令:①(DST)←((ESP)+3,(ESP)+2,(ESP)+1,(ESP))②(SP)←(SP)+4第3章80x86的指令系统和寻址方式堆栈堆栈是以“先进后出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段地址存放于SS寄存器中。它只有一个出入口,所以只有一个堆栈指针寄存器SP或ESP,SP或ESP的内容在任何时候都指向当前的栈顶。堆栈的存取必须以字或双字为单位,所以PUSH和POP指令只能作字或双字操作。它们可以使用除立即数寻址以外其他寻址方式。PUSH和POP指令不影响标志位。PUSH指令可以有四种格式:PUSHregPUSHmemPUSHdataPUSHsegregPOP指令可以有三种格式:POPregPOPmemPOPsegreg第3章80x86的指令系统和寻址方式例子p33PUSHAX;将AX的内容推入堆栈PUSHDS;将DS的内容推入堆栈PUSH[BX+DI];将BX+DI和BX+DI+1所指的两单元内容推入堆栈POPBX;将栈顶两单元推出送BX中POPES;将栈顶两单元推出送ES中第3章80x86的指令系统和寻址方式成对出现p33下推入指令和推出指令是彼此互补的一般都是成对出现,即程序中有一个PUSH指令,在其他地方必还有一个POP指令。堆栈操作是遵循先进后出的原则,所以多次用PUSH指令连续保护一组数据时,稍后用POP指令恢复数据时,要用相反的次序。例如下列程序段:PUSHAX;保存AX内容PUSHES;保存ES内容PUSHDI;保存DI内容PUSHSI;保存SI内容︰POPSI;重新存回SIPOPDI;重新存回DIPOPES;重新存回ESPOPAX;重新存回AX注意:PUSHCS;POPCS;第3章80x86的指令系统和寻址方式例3.29PUSHAX例3.30POPAX第3章80x86的指令系统和寻址方式例3.31aPUSHEAX例3.31bPUSH[EAX]例3.32PUSH12H;286以上机型允许立即数进栈。第3章80x86的指令系统和寻址方式(6)PUSHA/PUSHAD所有寄存器进栈指令格式为:PUSHAPUSHAD执行操作:PUSHA:16位通用寄存器依次进栈,进栈次序为:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI。指令执行后(SP)(SP)-16仍指向栈顶。PUSHAD:32位通用寄存器依次进栈,进栈次序为:EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。指令执行后(SP)(SP)-32仍指向栈顶。第3章80x86的指令系统和寻址方式(7)POPA/POPAD所有寄存器出栈指令格式为:POPAPOPAD执行操作:POPA:16位通用寄存器依次出栈,出栈次序为:DI,SI,BP,SP,BX,DX,CX,AX,指令执行后(SP)(SP)+16仍指向栈顶。应该说明的是:SP的出栈只是修改了指针使其后的BX能顺利出栈,而堆栈中原先由PUSH指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中去。POPAD:32位通用寄存器依次出栈,出栈次序为:EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX。指令执行后(SP)(SP)+32仍指向栈顶。与POPA相同,堆栈中存放的原ESP的内容被丢弃而不装入ESP寄存器。这两条堆栈指令不影响标志位。第3章80x86的指令系统和寻址方式例3.33PUSHAD第3章80x86的指令系统和寻址方式(8)交换指令XCHGp34(3)语句格式:XCHGOPR1,OPR2功能:将源地址与目的地址中的内容互换。即(OPR1)←→(OPR2)该指令的两个操作数中必须有一个在寄存器中,因此它可以在寄存器之间,或者在寄存器和存储器之间交换信息,但不允许使用段寄存器。但CS和IP不能作为一个操作数交换:XCHGCS,IP两个存储单元之间也不能直接执行数据交换指令:XCHG[BX],[DI]指令允许字或字节操作。386以上允许双字操作。该指令可用除立即数外的任何存址方式,且不影响标志位。第3章80x86的指令系统和寻址方式【例】MOVAX,5678H;(AX)=5678HMOVBX,0FFFFH;(BX)=0FFFFHXCHGAX,BX;(AX)=0FFFFH,;(BX)=5678H例3.34XCHGBX,[BP+SI]如(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154HOPPR2的物理地址=(SS)*16+(BP)+(SI)=2F000H+0200H+0046H=2F246H则指令执行后:(BX)=4154H(2F246H)=6F30H例3.35XCHGEAX,EBXEAX和EBX寄存器的内容互换。返回本节首页第3章80x86的指令系统和寻址方式3.3.1.2累加器专用传送指令p34(1)输入指令IN(input)(2)输出指令OUT(output)(3)换码指令(查表指令)XLAT(translate)这组指令只限于用累加器EAX,AX或AL传送信息。这组指令不影响标志位。第3章80x86的指令系统和寻址方式(1)输入指令INP34输入指令用来从指定的外
本文标题:第3.3.1 数据传送指令
链接地址:https://www.777doc.com/doc-4160551 .html