《第3章数据处理(2)数据传送指.ppt》由会员分享,可在线阅读,更多相关《第3章数据处理(2)数据传送指.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、3.4 3.4 数据传送类指令数据传送类指令数据传送数据传送把数据从一个位置传送到另一个位置把数据从一个位置传送到另一个位置计算机中最基本的操作计算机中最基本的操作程序设计中最常使用的指令程序设计中最常使用的指令除向标志寄存器传送外,数据传送指令标志寄存器传除向标志寄存器传送外,数据传送指令标志寄存器传送指令外,均送指令外,均不影响标志不影响标志位位全面而准确地理解每条指令的功能和应用全面而准确地理解每条指令的功能和应用是编写汇编语言程序的关键是编写汇编语言程序的关键也是理解处理器如何进行数据处理的核心也是理解处理器如何进行数据处理的核心1学习指令的注意事项学习指令的注意事项指令的功能指令的功
2、能该指令能够实现何种操作。通常指令该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式指令支持的寻址方式该指令中的操作数可以采用该指令中的操作数可以采用何种寻址方式何种寻址方式指令对标志的影响指令对标志的影响该指令执行后是否对各个标志该指令执行后是否对各个标志位有影响,以及如何影响位有影响,以及如何影响其他方面其他方面该指令其他需要特别注意的地方,如指该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的令执行时的约定设置、必须预置的参数、隐含使用的寄存器等寄存器等23.4.1 3.4.1
3、通用传送指令通用传送指令将数据将数据从源地址传送到目的地址从源地址传送到目的地址源操作数源操作数 src目的操作数目的操作数 dest30H30H被传送的数据被传送的数据3 包括包括MOV指令,指令,PUSH 和和 POP指令,指令,XCHG指令指令 1 基本传送指令基本传送指令MOVl 指令格式指令格式 MOV dst,src l 指令功能指令功能 将源操作数将源操作数src复制到目的操作数复制到目的操作数dst中,结果目的中,结果目的操作数的内容等于源操作数的内容,源操作数操作数的内容等于源操作数的内容,源操作数src的内的内容不变。容不变。dstsrcl 对标志位的影响对标志位的影响 该
4、指令该指令不影响标志位不影响标志位。4l 该该指令的源操作数指令的源操作数src可以使用各种寻址方式,目的操作可以使用各种寻址方式,目的操作数数dst可以使用除立即数外的各种可以使用除立即数外的各种寻址方式。寻址方式。依据源操作数、目的操作数的不同,依据源操作数、目的操作数的不同,MOV指令有指令有6种具体格式种具体格式 通用寄存器之间的数据传送通用寄存器之间的数据传送 例如例如 MOV AL,BL MOV AX,CX MOV EBX,EAX 它将源寄存器的内容传送到目的寄存器,源寄存器内容不它将源寄存器的内容传送到目的寄存器,源寄存器内容不变。变。5 通用寄存器通用寄存器与段寄存器之间的数据
5、传送与段寄存器之间的数据传送例如例如 MOV DS,AX MOV AX,ES注意:注意:l向向段寄存器送数据,源操作数不能用立即段寄存器送数据,源操作数不能用立即数,数,l只能只能从通用数据寄存器或存储器从通用数据寄存器或存储器段寄存器段寄存器l不能向不能向CS传送传送6例如例如 MOV AL,BX MOV 1234H,BX 段段寄存器和存储单元之间的数据传送寄存器和存储单元之间的数据传送例如例如 MOV DS,3000H MOV BX+SI,CS 立即立即数送通用寄存器数送通用寄存器 MOV AX,1234H ;将立即数将立即数1234HAX 立即立即数送存储单元数送存储单元 MOV WOR
6、D PTR DI,0800H表示是一个字型数据表示是一个字型数据 通用寄存器和存储单元之间的数据传送通用寄存器和存储单元之间的数据传送7是是双操作数指令,源操作数和目的操作数的类型必须一致。双操作数指令,源操作数和目的操作数的类型必须一致。若若立即数没有明确的类型,汇编程序立即数没有明确的类型,汇编程序MASM负责将立即数扩展负责将立即数扩展为与目的操作数位数相同。有时为与目的操作数位数相同。有时MASM不能确定内存操作数不能确定内存操作数的类型,需要的类型,需要用用byte ptr和和word ptr明确指出是字节或字类型。明确指出是字节或字类型。两个操作数不能同时都是存储器操作数,既不能将
7、存储器中的两个操作数不能同时都是存储器操作数,既不能将存储器中的内容直接传送到另一个存储器,而必须经过一次向寄存器传送内容直接传送到另一个存储器,而必须经过一次向寄存器传送的过渡。的过渡。例如例如 MOV BX,DI是错误的,而应该如下处理是错误的,而应该如下处理 MOV AL,DI MOV BX,AL 使用使用MOVMOV指令需要注意指令需要注意8不能用不能用CS寄存器作目的操作数。一般寄存器作目的操作数。一般CS,IP在执行转移指令在执行转移指令时改变。时改变。立即数不能传送到段寄存器中。立即数不能传送到段寄存器中。MOV seg,DATA ;错误错误段寄存器之间不能直接传送数据段寄存器之
8、间不能直接传送数据立即数不能作为目的操作数立即数不能作为目的操作数9例:错误的例:错误的MOV 指令如下所示:指令如下所示:MOV AX,BL ;类型不匹配;类型不匹配MOV DS,1000H ;不允许立即数送段寄存器;不允许立即数送段寄存器MOV BX,SI ;不允许内存操作数之间传送;不允许内存操作数之间传送MOV ES,CS ;不允许段寄存器之间传送;不允许段寄存器之间传送MOV CS,AX ;CS不能作为目的操作数不能作为目的操作数例:判断以下指令使用是否正确。例:判断以下指令使用是否正确。MOV 123,BL ;错误错误,目的操作数不能是立即,目的操作数不能是立即数数MOV AL,0
9、 ;正确,正确,MASM可以判断出可以判断出 ;要送要送字节字节0MOV BYTE PTR 1234,35H ;正确。正确。10(1)(1)格式:格式:XCHG dst,src XCHG dst,src ;交换交换dstdst与与srcsrc的内容的内容(2)(2)功能:功能:两两个操作数交换位置。个操作数交换位置。指令执行后,源操作数变成目的操作数,目的操指令执行后,源操作数变成目的操作数,目的操作数变成源操作数,不影响标志位。作数变成源操作数,不影响标志位。例如例如 (AX)=1234H,(BX)=5678HAX)=1234H,(BX)=5678H执行执行 XCHG AX,BX XCHG
10、AX,BX 后后(AX)=5678H,(BX)=1234H(AX)=5678H,(BX)=1234H2 2XCHGXCHG(ExchangeExchange):交换指令):交换指令11其中一个操作数可以使存储器型操作数,存储器其中一个操作数可以使存储器型操作数,存储器可以可以使用各种寻址方式,例如使用各种寻址方式,例如 XCHG BX,BP+SI;基址变址寻址方式基址变址寻址方式 XCHG AX,12345H;直接寻址方式直接寻址方式 XCHG AX,BX ;寄存器间接寻址方式寄存器间接寻址方式 XCHG AX,100HSI ;变址寻址变址寻址12(3)使用注意事项l可以在两个寄存器、或寄存器
11、与存储器之间交换l不能与段寄存器进行交换,l也不能与立即数进行交换l存储器两单元之间不能进行交换。13堆栈堆栈概念概念 -存储器的一段区域,按存储器的一段区域,按“先进后出先进后出”的原则进的原则进行存出操作。行存出操作。8086/8088系统,堆栈位于堆栈段,其系统,堆栈位于堆栈段,其段基地址段基地址由由SS指示,指示,SP寄存器作为指针,寄存器作为指针,SP内容始终指向栈顶所在存储单内容始终指向栈顶所在存储单元。元。作用:作用:在调用一个过程时,保存返回地址;在调用一个过程时,保存返回地址;保存现场保存现场中断服务程序、中断服务程序、或子程序中用到某些寄存器或或子程序中用到某些寄存器或存储
12、单元,但这些寄存器或存储单元存储单元,但这些寄存器或存储单元在主程序中在主程序中也用到,并且也用到,并且它的内容不能被子程序或中断服务程序破坏。它的内容不能被子程序或中断服务程序破坏。暂时存放寄存器或存储器单元操作数的内容。暂时存放寄存器或存储器单元操作数的内容。3.4.2 3.4.2 堆栈操作指令堆栈操作指令14注意:注意:80X86 80X86的的SPSP总是指向最后一个压入堆栈的字的存放地址;总是指向最后一个压入堆栈的字的存放地址;80X86 80X86的堆栈是向下增长的的堆栈是向下增长的每次压入前,先使每次压入前,先使SP-2SP-2,然,然后将要压入的数据存放到后将要压入的数据存放到
13、 SSSS:SP SP 指定的存储单元。指定的存储单元。弹出:先将弹出:先将SS:SPSS:SP指定的存储单元的内容取出到目的操作数,指定的存储单元的内容取出到目的操作数,然后然后SP+2.SP+2.要使用堆栈,需要先设置要使用堆栈,需要先设置SPSP。每次压入或弹出都以字为单位每次压入或弹出都以字为单位15 格式:格式:PUSH src ;功能:将功能:将src压入堆栈。压入堆栈。Src可以是可以是16位的寄存器,段寄存器,位的寄存器,段寄存器,字存储单元。字存储单元。操作过程:先修改操作过程:先修改SP的内容的内容:(SP)(SP)-2,使使SP指向指向新的栈顶,然后将新的栈顶,然后将sc
14、r的低的低8位存入位存入SP指向的单元,指向的单元,高高8位存入位存入(SP)+1指向的单元。指向的单元。(1)(1)入栈指令入栈指令16例如,原例如,原(SP)=104H,(AX)=1234H,执行执行PUSH AX 后(后(SP)=102H原原(SP)=104H,修改后修改后(SP)=102HAX的高字的高字节节12存放存放在在103H,低字节存低字节存放在放在102H3412104H105HSP103H102H低地址低地址高地址高地址104H105HSP17 格式:格式:POP dst ;功能:将功能:将(SP)指向的存储单元的内容送入指向的存储单元的内容送入dst指向的指向的寄存器或存
15、储单元。寄存器或存储单元。dst可以是可以是16位的寄存器,段寄位的寄存器,段寄存器,字存储单元。存器,字存储单元。注意:注意:CS不能作为不能作为dst。(3)(3)出栈指令出栈指令18 操作过程:先将(操作过程:先将(SP)指向的存储单元的内容)指向的存储单元的内容送到送到dst,(,(SP)为低字节,(为低字节,(SP)+1为高字节,为高字节,然后修改然后修改(SP)=(SP)+2该过程与入栈相反。该过程与入栈相反。19源操作数和目的操作数为源操作数和目的操作数为16位,可以是通用寄存位,可以是通用寄存器、段寄存器、内存操作数。但器、段寄存器、内存操作数。但CS不能作为目的不能作为目的操
16、作数。操作数。遵循遵循先进后出的原则先进后出的原则SP总是指向栈顶,压栈时,高总是指向栈顶,压栈时,高字节压入字节压入到高地址,到高地址,低低字节压入字节压入到低地址。出栈刚好相反。到低地址。出栈刚好相反。(4 4)使用堆栈指令的注意事项)使用堆栈指令的注意事项201.1.换码指令换码指令 XLAT2.(1)格式:)格式:XLAT(2)功能:功能:将将AL中的内容作为从表首地址的偏移地址,中的内容作为从表首地址的偏移地址,从表中取出一个数据,再送回从表中取出一个数据,再送回AL。表首地址存放在表首地址存放在BX中。中。(BX)+(AL)为地址的内容取出为地址的内容取出AL 该指令规定:该指令规
17、定:BX和和AL的内容之和作为偏移地址。的内容之和作为偏移地址。该指令对于进行代码转换非常有用该指令对于进行代码转换非常有用只要利用该指令只要利用该指令查表。查表。3.4.3 3.4.3 其他传送指令其他传送指令21例如:计算机内部计算的数据,在转换成十进制数据例如:计算机内部计算的数据,在转换成十进制数据后,要送到七段后,要送到七段LED数字显示器显示。七段显示器如数字显示器显示。七段显示器如下下abcdefg它有它有ag七段七段LED组成。有共组成。有共阴极和共阳极两种方式。阴极和共阳极两种方式。gfedcbacomgfedcbacom22每一段需要有一个控制信号,当有电流流过时发光。每一
18、段需要有一个控制信号,当有电流流过时发光。假设使用共阴极方式的数码管,则假设使用共阴极方式的数码管,则com应该接低电位,应该接低电位,ag如果为高电位,对应的段(笔画)亮。如果为高电位,对应的段(笔画)亮。gfedcbacomD0D1D2D3D4D5D6R通常的接法如图。用一个字节的通常的接法如图。用一个字节的D0D6控制控制ag,假设假设com接地。则接地。则DK=1,对应的笔画亮。对应的笔画亮。23这样,要现实这样,要现实的数据与控制的数据与控制LED的控制信的控制信号之间就有一号之间就有一种对应关系种对应关系要显示的数字显示控制码十六进制显示控制码D7D0(二进制)03F0011 11
19、11B1060000 0110B25B0101 1011B34F0100 1111B4660110 0110B56D0110 1101B67D0111 1101B7070000 0111B87F0111 1111B96F0110 1111B24这种转换利用这种转换利用XALT指令就比较容易实现。指令就比较容易实现。方法是方法是:将控制码做成一个表格存放在内存中将控制码做成一个表格存放在内存中,表格中的控表格中的控制码按制码按09的顺序存放,表的开始地址用符号的顺序存放,表的开始地址用符号TABLE表表示。在需要转换时,将要转换(显示)的十进制数送到示。在需要转换时,将要转换(显示)的十进制数送
20、到寄存器寄存器AL中,表头地址送到中,表头地址送到BX中,则执行中,则执行XLAT指令指令就可实现所需要的转换。假设将就可实现所需要的转换。假设将6转换成对应的显示控转换成对应的显示控制码制码25TABLE DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH MOV AL,6 MOV BX,OFFSET TABLE;表首地址 XLAT 取TABLE的地址到BX这样就取出了这样就取出了6的显示控制码,只要送到显示控制电路,就可的显示控制码,只要送到显示控制电路,就可实现对实现对6的显示。的显示。在实际应用中,待显示的信息是检测、或运算结果。在实际应用中,待
21、显示的信息是检测、或运算结果。26还可以将一些特定函数造成表,存放在存储器中,例还可以将一些特定函数造成表,存放在存储器中,例如正弦函数等。如正弦函数等。27将操作数所在存储器的地址送入目标寄存器。将操作数所在存储器的地址送入目标寄存器。(1)取有效地址指令取有效地址指令 指令格式指令格式:LEA dst,scrscr存储单元地址存储单元地址dst16位的通用寄存器位的通用寄存器 功能:功能:将源操作数的有效地址将源操作数的有效地址EA送目的操作数所指送目的操作数所指向的寄存器。向的寄存器。注意:注意:对于对于该指令,原操作数一定是存储单元的操作数该指令,原操作数一定是存储单元的操作数地址,目
22、的操作数一定是地址,目的操作数一定是16位的通用寄存器。位的通用寄存器。2 2 地址传送指令地址传送指令28例如:假设例如:假设(DS)=1000H,(SI)=3000H,(14000H)=7788H执行执行指令:指令:LEA BX,SI+1000H ;(BX)=4000H,取地址,取地址而执行下一指令:而执行下一指令:MOV BX,SI+1000H ;(BX)=7788H,取数据,取数据前面还使用了一种取地址的方法前面还使用了一种取地址的方法 MOV BX,OFFSET TABLE它与取地址指令它与取地址指令 LEA BX,TABLE效果是相同的。效果是相同的。29LEA 指令与指令与MOV
23、 指令的区别:指令的区别:LEA SI,BUFF 指令是将标号指令是将标号BUFF的偏移地址送入寄存器中;的偏移地址送入寄存器中;MOV SI,BUFF指令是将标号指令是将标号BUFF所指存储单元的内容送入所指存储单元的内容送入SI。LEA SI,BUFF;执行后:(执行后:(SI)=0002HMOV SI,BUFF;执行后:(执行后:(SI)=0048HBUFF=0123454800FEFF30 格式格式:LDS dst,src 功能功能:把源操作数:把源操作数src指定的连续指定的连续4个存储单元中存个存储单元中存放的放的32位地址指针(一个位地址指针(一个16位的段基址,一个位的段基址,
24、一个16位的位的偏移量)传送到两个偏移量)传送到两个16位的寄存器中,其中低位的寄存器中,其中低16位是位是偏移量,送偏移量,送dst,高二字节是段基址,送,高二字节是段基址,送DS。例如:例如:(DS)=3200H,(33550h)=1234H,(33552)=5678H执行执行 LDS SI,1550H 后后 -从从32000+1550=33550H开始取开始取4个字节个字节(SI)=1234H,(DS)=5678H (2 2)LDS LDS 指令指令31 格式格式 LES dst,src 功能功能:与:与LDS指令相似,只是将段寄存器指令相似,只是将段寄存器DS换成了换成了ES。(3 3
25、)LES LES 指令指令32(1)LAHF 指令指令 格式格式:LAHF 功能功能:将标志寄存器的低将标志寄存器的低8位送位送AH。注意:标志寄存器内容不注意:标志寄存器内容不变化。变化。(2)SAHF指令指令 格式格式:SAHF 功能功能:AH内容送标志寄存器的低内容送标志寄存器的低8位。位。传送到传送到AH,是为了对某些位进行修改,是为了对某些位进行修改3 3 标志寄存器传送指令标志寄存器传送指令33(3)PUSHF指令指令 格式格式:PUSHF 功能功能:16位标志寄存器内容压入堆栈。位标志寄存器内容压入堆栈。(4)POPF 指令指令 格式:格式:POPF 功能功能:将当前将当前SP所
26、指的一个字数据送标志寄存器。所指的一个字数据送标志寄存器。34对于对于8086 8086,对于标志寄存器,对于标志寄存器FLAGSFLAGS高高8 8位中的位中的OF,DF,IFOF,DF,IF有专用的置位和复位指令,但对有专用的置位和复位指令,但对TFTF没有,要修改该位,没有,要修改该位,需要将标志寄存器传送到通用数据寄存器,在通用寄需要将标志寄存器传送到通用数据寄存器,在通用寄存器中修改,然后再存器中修改,然后再传送回标志寄存器传送回标志寄存器FLAGSFLAGS。但又没。但又没有有FLAGSFLAGS与通用寄存器的传送指令,这时只好利用与通用寄存器的传送指令,这时只好利用PUSHFPU
27、SHFPOPFPOPF指令指令例如:要将例如:要将TFTF “0”“0”35PUSHFPUSHFPOP AXPOP AXAND AH,11111110B AND AH,11111110B ;FLAGS;FLAGS的的D8(TF)D8(TF)清为清为0 0PUSH AXPUSH AXPOPFPOPF 36(1)LAHF/SAHF指令是寄存器指令是寄存器AH与标志寄存器与标志寄存器FLAGS的低字节之间完成的字节型数据传送。的低字节之间完成的字节型数据传送。(2)PUSHF/POPF指令是标志寄存器指令是标志寄存器PSW与堆栈间进与堆栈间进行的字型数据传送。行的字型数据传送。(3)指令)指令SAHF/POPF将影响标志位。将影响标志位。(4)8086/8088没有对单步标志位没有对单步标志位TF的直接操作指令,的直接操作指令,可以利用可以利用PUSHF指令将标志寄存器压栈指令将标志寄存器压栈,然后弹,然后弹出到一出到一个通用数据寄存器,对它进行修改个通用数据寄存器,对它进行修改,将,将修改后的通用数修改后的通用数据寄存器压栈,最后利用据寄存器压栈,最后利用POPF,将修改后的值弹出送,将修改后的值弹出送标志寄存器。(原因是标志寄存器。(原因是TF在高在高8位)位)对标志寄存器操作指令的附加说明:对标志寄存器操作指令的附加说明:37
限制150内