您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 3.2 数据传送指令
1复习:3大类寻址方式立即数寻址方式寄存器寻址方式存储器寻址方式直接寻址方式寄存器间接寻址方式寄存器相对寻址方式基址变址寻址方式相对基址变址寻址方式2立即寻址、寄存器寻址【例1】下列程序执行后,(AX)=?(BX)=?MOVAX,1234HMOVBX,5678HADDAX,BX;AX(AX)+(BX)执行:1234H→AX;5678H→BX;(AX)+(BX)→AX执行后:(AX)=68ACH,(BX)=5678H3直接寻址【例2】已知(DS)=2000H,(ES)=3000H,(32000H)字节=15H,(32001H)字节=24H。执行指令MOVAX,ES:[2000H]执行后(AX)=?若执行MOVAL,ES:[2000H]则(AL)=15HEA=2000HPA=(ES)×10H+EA=32000H(AX)=2415H4直接寻址【例3】已知:(AX)=1212H,(DS)=3000H,BUF为数据段定义的变量,其偏移地址是2000H,(32000H)=45H,(32001H)=67H.执行指令:MOVAX,BUF执行后:(AX)=?等价:MOVAX,[BUF]MOVAX,[2000H]EA=2000HPA=(DS)×10H+EA=32000H(AX)=6745H5寄存器间接寻址【例4】已知:(AX)=0,(BP)=30H,(DS)=4000H,(SS)=2000H,(20030H)=34H,(20031H)=12H执行指令:MOVAX,Wordptr[BP]执行后:(AX)=?EA=BP=0030HPA=(SS)×10H+EA=(SS)×16+(BP)=20030H(AX)=1234H6寄存器相对寻址【例5】已知:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=6050H执行指令:MOVWordptr6[BX],AX执行后:(BX)=?,(20036H)=?EA=(BX)+6=0036HPA=(DS)×10H+EA=(DS)×16+(BX)+6=20036H(20036H)=(AX)=0040HBX=0030H7基址加变址寻址【例6】设执行前(DS)=2100H,(BX)=158H,(DI)=10A5H,(221FDH)=1234H.执行:MOVAX,[BX][DI]EA=(BX)+(DI)=158H+10A5H=11FDHPA=(DS)×10H+EA=(DS)×10H+(BX)+(DI)=21000H+11FDH=221FDH执行后:(AX)=1234H练习:指出各指令中源操作数和目的操作数的寻址方式,并说明操作数的类型(字节或字数据)。源操作数是立即数寻址;目的操作数是寄存器寻址;传送的是字数据。(1)MOVSI,1000H源操作数是直接寻址,EA=1000H;目的操作数是寄存器寻址;传送的是字节数据。(2)MOVBL,[1000H](3)MOV[BX+0100H],CX源操作数是寄存器寻址;目的操作数是寄存器相对寻址,EA=BX+0100H;传送的是字数据。源操作数是立即数寻址,十进制数100;目的操作数是基址变址寻址,EA=BP+SI;传送的是字节数据。(4)MOVBYTEPTR[BP][SI],100(5)MOVAX,[BX+DI+0004H]源操作数是基址变址相对寻址,EA=BX+DI+0004H;目的操作数是寄存器寻址;传送的是字数据。(6)MOVAX,[BX]源操作数是寄存器间接寻址,EA=BX;目的操作数是寄存器寻址;传送的是字数据。118086/8088指令系统可分成如下6类:数据传送指令(DataTransfer)算术运算指令(Arithmetic)逻辑运算和移位指令(Logic)串操作指令(Stringmanipulation)程序控制指令(ProgramControl)处理器控制指令(Input/Output)133.2数据传送指令可实现存储器寄存器I/O接口数据传送指令又可分为如下四种:通用传送:MOV,PUSH,POP,XCHG目标地址传送:LEA标志传送输入输出:IN,OUT14(1)MOVdst,src;dst←src1.通用传送指令所有的通用传送指令都不改变标志。功能:实现字或字节数据的复制。将源操作数src,传送到目的操作数dst中。传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。①MOVAL,12H②MOVAX,1122H151)寄存器送(段)寄存器或主存MOVAX,BX;AX←BX,字传送MOVAH,AL;AH←AL,字节传送MOVDS,AX;DS←AX,字传送MOV[BX],AL;[BX]←AL,字节传送将AL的内容送到位于DS段、偏移地址=(BX)的存储单元MOVreg/mem/seg,reg162)立即数送寄存器或主存MOVAL,4;AL←4,字节传送MOVSI,200H;SI←0200H,字传送MOVBYTEPTR[SI],0aH;byteptr说明是字节操作MOVWORDPTR[SI+2],0bH;wordptr说明是字操作注意立即数是字节量还是字量明确指令是字节操作还是字操作MOVreg/mem,imm173)段寄存器送寄存器或主存MOV[SI],DSMOVAX,ES;AX←ESMOVDS,AX;DS←AX不能在段寄存器之间进行直接数据传送MOVDS,ES;错误MOVreg/mem,seg184)主存送(段)寄存器moval,[bx];al←ds:[bx]movdx,[bp];dx←ss:[bp]moves,[si];es←ds:[si]MOVreg/seg,mem19MOV指令使用规则:1)立即数、CS不允许作为目的操作数2)不允许mem←mem3)不允许seg←seg4)不允许seg←立即数5)源、目的操作数类型要一致6)IP不能作为MOV指令的操作数7)用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。20几个不能传送的解决办法:用AX作桥梁存储器←存储器:MOVAX,MEM1MOVMEM2,AX段寄存器←段寄存器:MOVAX,DSMOVES,AX段寄存器←立即数:MOVAX,DATAMOVDS,AX21MOVAL,[1000H]MOV[1002H],ALAL数据段AAHA1H65H31000H31001H31002H如果想将内存(31000H)的内容传送到(31002H)。必须通过寄存器中转。MOV[1002H],[1000H]22什么是堆栈?堆栈段是保存数据和地址的一个特定内存区域。按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。不影响标志位!(2)堆栈操作指令为什么要设置堆栈?为什么要按“后进先出”方式工作?主程序IP继续执行主程序执行子程序主程序IPIP(下)继续执行主程序IP’执行子程序2IP’(下)执行子程序1继续执行子程序1(a)(b)子程序调用示意图(a)主程序调子程序;(b)子程序嵌套示意图IP(下)24堆栈和队列堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈)队列:按照先进先出(FIFO)的原则组织的存储器空间LIFOFIFO25规定由SS指示堆栈段的段地址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。数据有入栈和出栈操作,操作后栈顶位置会发生变化,即堆栈指针SP发生变化。SPSS堆栈段进栈方向退栈方向栈底栈顶堆栈26PUSHsrc;src为16位操作数例:PUSHAX;将AX内容压栈执行操作:(SP)-1←高字节AH(SP)-2←低字节AL(SP)←(SP)-2①压栈指令入栈前FFHSP-2SP-1SP→ALAHFFHSP→入栈后27设(AX)=1020H低地址存储区(SS段)执行前(AX)=1020存储区(SS段)进栈方向(SP)执行后2010(AL)(AH)PUSHAX指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)-128压栈指令的格式为:PUSHregPUSHmem/regPUSHseg例如:PUSHAXPUSH[BX]PUSHDS注意进栈方向是高地址向低地址发展29POPdst例:POPBX;将栈顶内容弹至BX执行操作:(BL)←(SP)(BH)←(SP)+1(SP)←(SP)+2②弹出指令出栈前BLBHFFHSP→SP+1SP+2FFHSP→出栈后30POPBX的执行示意图低地址存储区(SS段)出栈方向执行前2010(SP)存储区(SS段)执行后(BX)=1020H(SP)(SP)+1(SP)+2BX2010高地址低地址高地址31堆栈指令使用时应注意:①堆栈操作总是按字进行②不能从栈顶弹出一个字给CS③堆栈指针为SS:SP,SP永远指向栈顶④SP自动进行增减量(-2,+2)32格式:XCHGreg,mem/reg功能:交换两操作数的内容。(3)交换指令XCHG交换能在两个通用寄存器之间;通用寄存器和内存之间进行不影响标志位。要求:两操作数中必须有一个在寄存器中;操作数不能为段寄存器和立即数;源和目地操作数类型要一致。举例:XCHGAX,BXXCHGByteptr[2000H],CL33DestinationIndex目的变址寄存器SIDIBPSPAX累加器AccumulatorBX基数寄存器BaseCX计数寄存器CountDX数据寄存器DataAHBHCHDHALBLCLDLIPPSWDSESSSCS数据段寄存器DataSegment附加段寄存器ExtraSegment堆栈段寄存器StackSegment代码段寄存器CodeSegmentProcessorStatusWord状态标志寄存器InstructionPointer指令指针寄存器变址寄存器段寄存器控制寄存器通用寄存器SourceIndex源变址寄存器BasePoint基址指针寄存器StackPoint堆栈指针寄存器指针寄存器数据寄存器复习8088的内部寄存器例:设DS=1000H,SS=2000H,AX=1A2BH,BX=1200H,CX=339AH,BP=1200H,SP=1352H,SI=1354H,求以下各指令执行后的值。11350H11351H11352H11353H11354H11355H0A5H3CH0FFH26H52H0E7H126A4H126A5H21352H21353H0A5H3CH88H51HAX=1352H(1)MOVAX,1352HAX=?(2)MOVAX,[1352H]AX=?内存单元地址=DS×10H+EA=11352H,所以,AX=26FFHEA=BX+0150H=1350H,CH=33H内存单元地址=DS×10H+1350H=11350H所以,(11350H)=33H(3)MOV0150H[BX],CH内存单元有什么变化?图页(4)MOVAX,0152H[BP]AX=?EA=BP+0152H=1352H内存单元的地址=SS×10H+1352H=21352H所以,AX=5188HSS=2000H,SP=1352H内存单元的地址=SS×10H+SP=21352H所以,AX=5188H,SP=SP+2=1354H(5)POPAXAX=?SP=?图页
本文标题:3.2 数据传送指令
链接地址:https://www.777doc.com/doc-6144033 .html