您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 3-2数据传送指令.
指令系统•条指令,按照其功能可以分为以下六个功能组:数据传送(DataTransfer)算术运算(Arithmetic)逻辑运算(Logic)串操作(StringManipulation)程序控制(ProgramControl)处理器控制(ProcessorControl)在学习指令过程中要注意3个方面事项:(1)指令功能是什么;(2)执行结果放在那里?;(3)指令对标志位影响。数据操作类指令控制类指令7.38086的指令系统•虚线框内是重点讲述的•数据传送类指令传送类指令,主要用于数据的保存及交换等场合。MOV指令(注意指令操作数的规定)格式:MOV目的,源功能:将源操作数(一个字或字节)送到目的操作数。例1:MOVAL,’B’;AL←42H(B的ASCⅡ码)例2MOVAX,DATAMOVDS,AX;定义数据段1)一般传送类指令该类指令不影响状态标志位例1、MOVAX,[BX+SI+10H]操作如图所示数据段3000H:0000H3000H:3010H34H12HAHAL20H00HBX+10H00HSI+3000H:3000H+0010H注低对低高对高•[例2]把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域中。MOVSI,OFFSETMEM1MOVDI,OFFSETMEM2MOVCX,20NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZNEXTHLTMOV指令的几点说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数MOVseg,seg;错MOVmem,mem;错误(2)立即数不能传送到段寄存器中。MOVseg,imm;错误(3)在通用传送指令中,寄存器既可以作为源操作数,也可以作为目的操作数,但CS和IP这两个寄存器不能作为目的操作数,这两个寄存器的值不能随意修改。(4)dest与src必须类型匹配,即同时是字节或字类型。(5)用BX、SI、DI间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。••例:;分析如下MOV指令的正确性:•MOVAX,BL•MOVDS,1000H•MOV[BX],[SI]•MOVES,CS•MOVCS,AX;类型不匹配;不允许立即数送段寄存器;不允许内存操作数之间传送;不允许段寄存器之间传送;CS不能作为目的操作数;错误,类型不匹配;正确,MASM可以判断出要送字节0例:设B是已定义的字节变量,判断指令的正确性。•MOVAX,B•MOVAL,0•指令与数据段:看一个数据段,看里面的内容和指令的对应关系例3:MOVDX,OFFSETARRAY;将ARRAY的偏移地址送DX,DX=0105H例4:MOVAL,AREA1;AL←AREA1中的内容14HMOVAREA2,AL;0102H单元←14H•图解:数据段、数据在内存的排放、变量的定义、•1、方框内:DATASEGMENT表示段的开始,DATA是段名,SEGMENT是表示段开始的符号(关键字)这是一个伪指令(说明指令);最后一句同样的段名,DATA后面跟一个ENDS表示段到这个地方结束。•2、ORG0100H表示下面的这些数据(Area1)从段内偏移地址0100开始存放,不是从0000H开始。如果没有”ORG0100H“这条指令,那么数据从0000H这个偏移地址开始存放。•3、AREA1是一个变量的符号,这个符号后面有两个数据,14H3BH这两个数据都是字节型的,因此用DB加以定义D-DefineB-Byte;由于是字节型的,后面的数据都是8位二进制数也就是两位16进制数,由于是两个数据,数据间用逗号隔开。•4、AREA2DB3DUP(0)数据还是DB类型,但表示形式不一样了,这里的数据每个都是0,但要重复3次;3是重复次数,括号里面是重复的内容。•5、ARRAYDW3100H,01A6H这里的数据是字数据,每个数据16位,用DW来定义,在内存占两个字节;低位占低地址,高位占高地址。•什么是堆栈堆栈是内存中的一个区域堆栈用于存放象子程序的返回地址、中断处理中的断点地址等重要信息(图示说明断点)堆栈有栈顶和栈底,栈底固定不动,栈顶是活动的,SP堆栈指针寄存器中存放的是堆栈栈顶的段内偏移地址。(图示)堆栈采用“先进后出”的存取原则(储衣箱)。有信息进入堆栈,SP中的地址值变小;有信息进出堆栈,SP中的地址值变大2)堆栈操作指令••堆栈的构造固定端,(数据由此向上堆积)具有最大地址的单元浮动端,指向最后被压入堆栈的数据所在存储单元。栈顶单元的地址放在SP寄存器中,SP称作栈顶指针,用来指示当前栈顶的位置堆栈段SSBottomXXXXXXXXTopSP初始SP1.栈底:2.栈顶:3.堆栈指针:••堆栈的三种基本操作SS、SP赋值(段的起始位置及长度)SP-2→SP;栈顶向上浮动数据→(SS:SP)(SS:SP)→R/MSP+2→SP数据;栈顶向下回落1、设置堆栈2、进栈把数据压入堆栈,在栈顶进行3、出栈从栈顶取出数据送入R/M堆栈是按字组织的,数据的存取均为2字节操作•=1050H,SP=0008H,AX=1234H,则8086系统中堆栈的入栈和出栈操作如下图所示。12AA…10500H10501H10502H10503H10504H10505H10506H10507H10508H栈底BB10509H段基址(SS)AX3412123434PUSHAX1050AHBBAAAABB1234BX34POPBXPOPAX12栈顶SP•堆栈指令小结:–PUSH指令–格式:PUSH源–功能:将源操作数压入堆栈。SP-2送SP。–例如:PUSHAX;将AX中的内容压入堆栈(AX不变),SP-2送SP–POP指令–格式:POP目的–功能:把当前SP所指堆栈顶的一个字送到目的操作数。–数位置。SP+2送SP。–例如:POPBX;将堆栈顶的一个字送到BX中(BX改变),SP+2送SP•练习•例:已知AX=0011H,BX=3344H,SP=0200H,执行下列程序段后,SP=?,AX=?,BX=?•PUSHAX;•PUSHBX;•POPAX;•POPBX;•SP=01FEH,AX=0011H,BX=3344H•SP=01FCH,AX=0011H,BX=3344H•SP=01FEH,AX=3344H,BX=3344H•SP=0200H,AX=3344H,BX=0011H•输入输出(I/O)指令I/O是专门面向输入输出端口进行读写的指令。执行输入指令时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。执行输出指令时,CPU可以将AL中的一个字节写到一个8位端口中,或者将AX中的一个字写到连续的8位端口读中。输入指令INacc,PORTINacc,DX输出指令OUTPORT,accOUTDX,acc端口地址端口号小于FFH端口号大于FFH端口号小于FFH端口号大于FFH•练习•例3-32:下面是指令从端口读数据的几个例子:•1、INAL,0F1H;AL←从0F1H端口读入一个字节.•2、INAX,80H;AL←80H端口内容.AH←81H端口内容.•3、MOVDX,310H;端口地址310H先送入DX.•INAL,DX;AL←310H端口内容.•注意:(1)指令1中AL内容是0F1H?•(2)和端口打交道不能用MOV了!•例3-29:下面是OUT指令从端口读数据的几个例子:•OUT85H,AL;85H端口←AL内容.•MOVDX,0FF4H;端口地址0FF4H先送入DX.•OUTDX,AL;0FF4H端口←AL内容.•MOVDX,300H;DX指向300H口.•OUTDX,AX;300H口←AL内容.•;301H口←AH内容.•注意:第二条是字节操作,第三条是字操作•地址传送指令(1)取偏移地址指令LEA(LoadEffectiveAddress)该指令功能是将存储器地址送到一个寄存器,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令通常用来使一个寄存器作为地址指针。[例3-21]LEABX,BUFFER;将内存单元BUFFER的偏移地址送BXMOVAL,[BX];取出BUFFER中的第一个数据送ALMOVAH,[BX+1];取出BUFFER中的第二个数据送AH指令格式:LEAreg16,mem例如:LEABX,[2000H];BX=2000HLEASI,TABLE;OFFSETTABLE送SILEABX,TABLE≡MOVBX,OFFSETTABLEMOVBX,[2000H]不等于LEABX,[2000H]•[例3-22]设(BX)=1000H,(DS)=6000H,(61050H)=33H,(61051H)=44H。比较以下两条指令执行结果。LEABX,[BX+50H];将内存单元BUFFER的偏移地址送BXMOVBX,[BX+50H];4433BX执行MOV指令后1050BX执行LEA指令后61050H61051H4433存储区DS段•:LODSBORAL,ALJSX1JZX2INCPLUSJMPNEXTX1:INCMINUSJMPNEXTX2:INCZERONEXT:LOOPCHECKHLTTABLE中的100个数据负数和0的个数[例3-23]
本文标题:3-2数据传送指令.
链接地址:https://www.777doc.com/doc-2917094 .html