代汇编语言程序设计.ppt
汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计 第三章第三章第三章第三章 寻址方式与指令系统寻址方式与指令系统本章要点本章要点基本寻址方式基本寻址方式指令系统指令系统字符设备字符设备I/OI/O功能调用功能调用12343232位指令寻址位指令寻址指令系统:计算机提供给用户使用的指令集。目的操作数,源操作数替代目的操作数不影响源操作数操作结果操作结果操作码操作数操作码例如:MOV AX,100MOV AX,BXMOV AX,BX要访问操作数,首先必须确定如何形成操作数的地址。寻址方式:形成操作数地址的方法。寻址方式选择得正确与否,直接影响程序的执行效率。3.1.2 寻址方式寻址方式与数据有关的寻址方式 确定内存单元的地址与转移地址有关的寻址方式 确定转移地址寻址方式寻址方式分类分类目的操作数,目的操作数,源操作数源操作数MOV有 7 种 与数据有关的寻址方式以以MOV指令为例指令为例:3.1.2 3.1.2 数据的寻址方式数据的寻址方式对源操作数分别使用对源操作数分别使用7 种种寻址方式如下:寻址方式如下:(1)立即寻址方式)立即寻址方式 (Immediate Addressing)(2)寄存器寻址方式()寄存器寻址方式(Register Addressing)(3)直接寻址方式)直接寻址方式(Direct Addressing)(4)寄存器间接寻址方式()寄存器间接寻址方式(Register Indirect Addressing)(5)变址寻址方式)变址寻址方式(Indexed Addressing)(6)基址变址寻址方式()基址变址寻址方式(Based Index Addressing)(7)相对基址变址寻址方式)相对基址变址寻址方式 (Relative Based Index Addressing)掌握寻址方式的要点掌握寻址方式的要点:特点(区别于其他寻址方式)特点(区别于其他寻址方式);使用方法(语法形式);使用方法(语法形式);用途用途(什么情况下使用)。(什么情况下使用)。(1)立即寻址方式立即寻址方式 (Immediate Addressing)特点:特点:操作数包含在指令中。操作数包含在指令中。操作数是指令的组成部分(可以是操作数是指令的组成部分(可以是8 8位或位或1616位)位),取出指令就立即获得取出指令就立即获得操作数操作数立即数立即数例例1:MOV AL,5执行指令后执行指令后:(AL)=05H指令指令05存储器存储器B005AL例例2:MOV AX,3045H执行指令后执行指令后:(AX)=3045H用途:用途:给变量或寄存器赋常量值给变量或寄存器赋常量值限制:限制:只能用于源操作数只能用于源操作数AX低地址低地址高地址高地址指指令令OP45存储器存储器304530(2)寄存器寻址方式()寄存器寻址方式(Register Addressing)特点:特点:操作数存在寄存器中。操作数存在寄存器中。例:例:MOV AX,BX执行指令前执行指令前:(AX)=3045H (BX)=4000H 执行指令后执行指令后:(AX)=4000H (BX)=4000H 用途:用途:用寄存器提供操作数时存取速度快。用寄存器提供操作数时存取速度快。(3)直接寻址方式)直接寻址方式(Direct Addressing)特点:特点:操作数的偏移地址包含在指令中。操作数的偏移地址包含在指令中。例:设例:设 (DS)=3000H MOV AX,2000H要访问的存储单元物理地址为:要访问的存储单元物理地址为:30000H+2000H=32000H设设:(32000H)=3050H执行指令后执行指令后:(AX)=3050H指令指令 MOV AX,2000H 2000H5030存储器存储器代码段代码段op0020数据段数据段30000H32000HAX3050如果如果2000H单元在附加段单元在附加段MOV AX,ES:2000H 段跨越前缀段跨越前缀:“段寄存器名段寄存器名:”用于改变默认使用的段寄存器用于改变默认使用的段寄存器用途用途:用于存取用于存取单变量单变量中的操作数。中的操作数。(4)寄存器间接寻址方式()寄存器间接寻址方式(Register Indirect Addressing)特点特点:(寄存器寄存器)=操作数的偏移地址操作数的偏移地址例:设例:设 (DS)=2000H (BX)=1000H 指令为指令为:MOV AX,BX 20000H+1000H=21000H 计算操作数物理地址的公式:计算操作数物理地址的公式:(BX)(SI)(DI)操作数物理地址操作数物理地址=(DS)16+操作数物理地址操作数物理地址=(SS)16+(BP)要访问的存储单元物理地址为:要访问的存储单元物理地址为:1000HAX50A0 A0 50存储器存储器数据段数据段20000H21000H XX XX21002H 数组起始地址数组起始地址用途用途:可用于处理数组可用于处理数组设设:(21000H)=50A0H执行指令后执行指令后:(AX)=50A0H(5)变址寻址方式)变址寻址方式(Indexed Addressing)(寄存器相对寻址方式)(寄存器相对寻址方式)特点:特点:(变址或基址寄存器变址或基址寄存器)+指令中的位移量指令中的位移量 =操作数的偏移地址操作数的偏移地址+例:设例:设 (DS)=3000H,ARRAY=4000H,(SI)=2000H指令为指令为:MOV AX,ARRAY SI 计算操作数物理地址的公式:计算操作数物理地址的公式:(SI)(DI)+(BX)操作数物理地址操作数物理地址=(DS)16+操作数物理地址操作数物理地址=(SS)16+(BP)+8 8位位移量位位移量1616位位移量位位移量8 8位位移量位位移量1616位位移量位位移量指令指令 MOV AX,ARRAY SI 4000H30000HAX1234 34 12存储器存储器代码段代码段 op 00 40数据段数据段36000H op 2000H 数组起始地址数组起始地址 ARRAY用途用途:30000H+4000H+2000H=36000H 要访问的存储单元要访问的存储单元物理地址为:物理地址为:设设:(36000H)=1234H执行指令后执行指令后:(AX)=1234H可用于处理数组可用于处理数组(6)基址变址寻址方式)基址变址寻址方式(Based Index Addressing)特点:特点:(基址寄存器基址寄存器)+(变址寄存器变址寄存器)=操作数的偏移地址操作数的偏移地址例:设例:设(DS)=2100H,(BX)=0158H,(DI)=1000H 指令为:指令为:MOV AX,BXDI+计算操作数物理地址的公式:计算操作数物理地址的公式:(SI)(DI)(SI)(DI)操作数物理地址操作数物理地址=(DS)16+(BX)+操作数物理地址操作数物理地址=(SS)16+(BP)+21000H+0158H+1000H=22158H 要访问的要访问的存储单元物理地址存储单元物理地址为:为:0158HAX1234 34 12存储器存储器数据段数据段21000H22158H 1000H 数组起始地址数组起始地址设设:(22158H)=1234H执行指令后执行指令后:(AX)=1234H用途用途:可用于处理数组可用于处理数组21000H+0158H+1000H=22158H 指令:指令:MOV AX,BXDI2.MOV AX,BX三种可处理数组的寻址方式的比较三种可处理数组的寻址方式的比较 寄存器间接寻址方式寄存器间接寻址方式特点:适用于要处理的数组需要在程序运行中动态确定,且形式简单。特点:适用于要处理的数组需要在程序运行中动态确定,且形式简单。1.MOV AX,ARRAY SI 变址寻址方式变址寻址方式特点:可读性好,指令明确指出要处理的数组。特点:可读性好,指令明确指出要处理的数组。限制:写程序时必须清楚要处理什么数组。限制:写程序时必须清楚要处理什么数组。3.MOV AX,BXSI 基址变址寻址方式基址变址寻址方式基址变址寻址方式基址变址寻址方式特点:适用于要处理的数组需要在程序运行中动态确定,并且修改特点:适用于要处理的数组需要在程序运行中动态确定,并且修改BXBX就可以处理不同的数组。就可以处理不同的数组。指令指令3 3的的BXBX寄存器是否可被其他寄存器替换?寄存器是否可被其他寄存器替换?指令指令1 的替换寄存器为:的替换寄存器为:DI BX BP(加段跨越前缀加段跨越前缀 DS:或或 ES)指令指令2 2的替换寄存器为:的替换寄存器为:DI SI BP(加段跨越前缀加段跨越前缀 DS:或或 ES)指令指令1 1和指令和指令2 2 的的 寄存器寄存器 还可被哪些寄存器替换?还可被哪些寄存器替换?2.MOV AX,BX1.MOV AX,ARRAY SI3.MOV AX,BXSInext例:设例:设 (SS)=3000H (BP)=2000H ARRAY=0250H (SI)=1000H MOV AX,ARRAYBPSI(7)相对基址变址寻址方式()相对基址变址寻址方式(Relative Based Index Addressing)特点:特点:(基址寄存器基址寄存器)+(变址寄存器变址寄存器)+位移量位移量=操作数的偏移地址操作数的偏移地址要访问的存储单元物理地址为:要访问的存储单元物理地址为:30000H+2000H+0250H+1000H=33250H指令指令 2000HAX1234 1000H30000H33250H 34 12存储器存储器代码段代码段 op 50 02堆栈段堆栈段 op 0250H栈顶栈顶数组首址数组首址用途用途:便于访问堆栈中的数组便于访问堆栈中的数组二维数组二维数组 v1.简单变量寻址v前三种:立即寻址方式,寄存器寻址方式,直接寻址方式v2.数组或表格数据的寻址v后四种:寄存器间接,寄存器相对,基址变址,相对基址变址数据寻址与数据结构的关系2.数组或表格数据的寻址v(1)存取基本数组v数组基本地址:BXv某个元素到数组基本地址的距离:SIDIv则EA=BX+SIDIv或者位移量DISP=数组开始地址v数组元素到数组开始地址的距离:BXSIDIv则EA=DISP+BXSIDI基址变址寻址基址变址寻址寄存器相对寻址寄存器相对寻址2.数组或表格数据的寻址v(2)赋值语句ai=bjv用两个变址寄存器用DI表示ai的偏移地址,DISP表示a0数组的基地址。v则EA=DSIP+DIv相同的,bi的相对地址可以表示为vEA=DSIP+SI寄存器相对寻址寄存器相对寻址2.数组或表格数据的寻址v(3)二维数组A(i,j),aijvEA=BX+SIDIvEA=DISP+BX+SIDI基址变址寻址和相基址变址寻址和相对基址变址寻址对基址变址寻址3.记录型数组的寻址vF=f(M,I,J)有点像结构体vF数据记录项的地址vM数组的基本地址vI数组的元素(记录)vJ元素的数据项v偏移地址=f(基址,变址,位移)vEA=BX+SI+DISP4.堆栈数据结构的寻址v堆栈采用以BP为基址指针的寻址,方便数据结构相同而参数不同的数据存取。v当存取堆栈中简单变量时vEA=BP+DISPv若存取堆栈中的数据和记录v见下图 34 12存储器存储器代码段代码段 op 00 40堆栈段堆栈段 op指令指令 2000HAX1234 1000H30000H33250H 34 12存储器存储器代码段代码段 op 50 02堆栈段堆栈段 op 0250H栈顶栈顶数组首址数组首址 寻址方式的综合应用关于DEC公司的一条记录(1982年):公司名称:DEC总裁姓名:Ken Olsen 排 名:137收 入:40著名产品:PDP1988年DEC公司的信息有了变化:、Ken Olsen 在富翁榜上的排名已升至38位;、DEC的收入增加了70亿美元;、该公司的著名产品已变为VAX系列计算机。任务:编程修改内存中的过时数据。存储器各种寻址方式的综合性例子 v例:设DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H,位移量DISP1618H,试判断下列指令的寻址方式,并求出在各种寻址方式下,这些寄存器与位移量所产生的有效地址EA和物理地址(实际地址)PA。说明指令执行的结果。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,0618H这是一条直接寻址方式的指令。EA0618HPA12000H+0618H12618H该指令执行的结果是将数据段的实际地址为12618H和12619H两单元中的内容取出送AX。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,BX这是一条以数据段基址寄存器BX间接寻址的指令。EA05A6HPA12000H+05A6H125A6H该指令执行的结果是将数据段的125A6H和125A7H两单元的字内容取出送AX。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,BP这是一条以堆栈段基址寄存器BP间接寻址的指令。由于寻址时用上了BP寄存器,则操作数所默认的段寄存器就是SS。EA40A0HPA50000H+40A0H540A0H该指令执行的结果是将堆栈段的540A0H和540A1H两单元的字内容取出送AX。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,DI这是一条变址寻址的指令。EA3000HPA12000H+3000H15000H该指令执行的结果是将数据段的15000H和15001H两单元的字内容取出送AX。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,BX+DI这是一条基址加变址寻址的指令。EA05A6H+3000H35A6HPA12000H+35A6H155A6H该指令执行的结果是将数据段的155A6H和155A7H两单元的字内容取出送AX。DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000HMOVAX,BP+SI+DISP这是一条带位移量的基址加变址寻址的指令,又叫相对基址加变址寻址的指令,且操作数的默认段为SS。EA40A0H+2000H+1618H76B8HPA50000H+76B8H576B8H该指令执行的结果是将堆栈段的576B8H和576B9H两单元的字内容取出送AX。vEA=DISP+BXBP+SIDIvPA=相应的段地址*16+EAvBP寻址,默认用SSvBX,SI,DI寻址默认用DSv越段:DS可被CS,SS,ES越段vSS可被DS,CS,ES越段v不能越段情况:CS:IP,SS:SP,ES总是用来作为目的操作数的段寄存器。v程序存储器寻址方式也就是转移类指令(转移指令JMP和调用指令CALL)的寻址方式。v在8086/8088系统中,由于存储器采用分段结构,所以转移类指令有段内转移和段间转移之分。v所有的条件转移指令只允许实现段内转移,而且是段内短转移。v对于无条件转移和调用指令又可分为段内短转移、段内直接转移、段内间接转移、段间直接转移和段间间接转移等5种不同的寻址方式。程序转移寻址v寻址方式计算出操作数的地址v形成程序转移地址v段内转移:改变IP值,不改变CS值v段间转移:改变IP值,改变CS值v无论段内段间都有直接和间接形式,因此程序转移有四种寻址。v段内直接寻址段内间接寻址v段间直接寻址段间间接寻址段内直接寻址v转移偏移地址EA是指令中8位或16位位移量(DISP)与指令IP当前内容相加之后,然后送入IP。即vEA=IP+DISP8.16IPv当DISP是8位长时,EA形成一个转移范围在-123+127字节之间的短距离转移,则称为短跳转,例如短运算符SHORT的JMP指令、条件转移指令JE等。v注意:DISP是相对IP来计算的。段内直接寻址v当DISP是16位长时,EA形成一个转移范围在64KB之内的近距离转移,称为近跳转,如JMP指令等。近跳转和短跳转DISP是相对IP计算的,又称相对转移寻址。v例如:vJMPNLAB;近跳转JMPSHORTSLAB;短跳转JESLAB;短跳转vv.vNLAB:ADDAX,BXSLAB:MOVDX,CXSLAB:INCSI段内间接寻址v转移偏移地址EA如果指定的是16位的寄存器,则将寄存器的内容IP。例如:vJMPBX;EA=BX,EAIPv如果EA指定的是存储器中的一个字,则将该存储单元的内容IP。即:使用存储器的数据寻址方式获得EA,再将EA单元的内容作为转移偏移地址IP,与CS的内容相加,获得实际的指令转移地址。段内间接寻址v这种寻址方式仅用于JMP指令和CALL指令中。v例如:JMPNLABBX;EA=NLAB+BX,v(EA)IPvJMPWORDPTRNLABBX,(EA)IP,vWORDPTR操作符说明其后的地址单元是一个字。段间直接寻址v用指令只直接提供的转移偏移地址EAIP,指令同时直接提供的转移段地址CS,实现从一个代码转移到另一代码段。v例如:CALLFARPTRNEXTLAB;vFARPTR表示段间转移操作符段间直接寻址v指令指令偏移地址段地址IPCS寻址方式按数据寻址方式计算EAEAEA+2转移偏移地址段地址CSIP存储器中两个连续字单元(a)段间直接寻址(b)段间间接寻址图3.9程序段间的直接或间接转移段间间接寻址v根据存储器的数据寻址方式获得EA,再将EA双字单元第一个字的内容作为转移偏移地址IP,EA双字单元第二个字的内容作为转移段地址CS,然后CS+IP形成指令的实际转移地址。它和段内间接寻址比较,利用第二个16位数修改了CS的内容,实现段间转移。v例如:vJMPFARPTRBX;EA=BX,(EA)IP,(EA+2)CSvCALLDWORDPTRBX;vDWORDPTR说明其后的地址单元是一个双字,其余同上段间间接寻址v注意:段内、段间的存储器的数据寻址获得EA后,还要加上合适段寄存器的内容,形成存储器的地址。转移地址PA=CS与IP的新内容之和。程序转移的四种寻址均适用指令JMP与CALL。v为了说明间接转移怎样同一些数据寻址方式结合操作,假设BX=1256H,SI=528FH,DISP=20A1H,DS的内容已知,则v用寄存器相对寻址(BX寄存器),转移偏移地址IP=(1256H+20A1H+DS24);v用BX和SI作为基址变址寻址,转移偏移地址IP=(1256H+528FH+DS24)。3.2 实方式32位指令寻址v3.2.1数据与地址类型v32位CPU可处理:字节,字,双字,可访问字节地址,字地址,双字地址。v位域最长达32位v位串232-1位3.2 实方式32位指令寻址v3.2.232位的指令寻址方式vEA=基址+变址*比例因子+位移量v基址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESPv变址寄存器:vEAX,EBX,ECX,EDX,ESI,EDI,EBPv比例因子:1,2,4,8分别用于字节,字,双字,四字的变量变址。3.2.3 实地址32位指令寻址v与16位7种寻址方式相同v前缀代码67H和66H3.3 指令系统指令系统8086/8088指令系统中的指令按指令系统中的指令按功能可分为六类:功能可分为六类:数据传送数据传送指令指令算术运算算术运算指令指令逻辑运算逻辑运算 与移位指令与移位指令串操作串操作指令指令控制转移控制转移指令指令处理机处理机 控制指令控制指令 约定vOPD表示目的操作数(。)表示。里面的内容vOPS表示源操作数v表示传送R表示通用寄存器vSr表示段寄存器:SS,CS,DS,ESvM表示主存储器vXXXX表示组合号v-表示其前后组成一个数vL表示操作数的长度d表示立即数vB/W/D表示字节、字、双字数据传送指令数据传送指令(1)(1)通用传送指令通用传送指令 1)传送指令传送指令MOV指令格式:指令格式:MOV OPD,OPS执行操作:(执行操作:(OPD)(OPS)功能:功能:在在CPU与存储器之间或与存储器之间或CPU内部传送数据。内部传送数据。标志位:标志位:不受影响不受影响例例:MOV AL,E 指令执行后指令执行后:(AL)=45H(1)通用传送指令通用传送指令 OPD只能是只能是R,M,Sr(CS除外)除外)OPS可以是可以是R,M,Sr和和d1 1OPD和和OPS不能同时为不能同时为M,也不能同也不能同时为时为Sr,不能将,不能将dSr2 2OPD和和OPS类型必须匹配类型必须匹配3 3注意注意:例:例:判断下列指令是否合法:判断下列指令是否合法:MOV DS,AX 不允许两个操作数都是存储器单元不允许两个操作数都是存储器单元 MOV CS,AXMOV CH,4050HMOV DL,5BH MOV DX,5BH MOV DX,ALMOV VA1,VA2MOV 45,DL目的操作数不允许是目的操作数不允许是CSCS段寄存器段寄存器 目的操作数不允许是立即数目的操作数不允许是立即数数据类型不匹配数据类型不匹配 数据类型不匹配数据类型不匹配 小结MOV指令的正确格式mov寄存器,数据mov寄存器,寄存器mov寄存器,内存单元mov寄存器,段寄存器同学们自己用DEBUG验证。然后写出总结,例如:mov寄存器,数据/寄存器/内存单元/段寄存器mov内存单元,?/?/?/?mov段寄存器(除了CS),?/?/?/?2)MOVSX,MOVZXMOVSX,MOVZX指令指令指令格式:指令格式:MOVSX OPD,OPS执行操作:执行操作:(OPD)=(OPS)的符号全延伸)的符号全延伸-(OPS)指令格式:指令格式:MOVZX OPD,OPS执行操作:执行操作:(OPD)=0全延伸全延伸-(OPS)注意:注意:(1)OPD为为R,OPS为为R/M,OPS的长度必须小于的长度必须小于OPD长度长度(2)指令执行后,不影响标志位,指令执行后,不影响标志位,(OPS)不变不变 3)交换指令交换指令 XCHG 指令格式:指令格式:XCHGOPD,OPS执行操作:执行操作:(OPD)(OPS)功能功能:两个操作数互换:两个操作数互换 例例:XCHG AX,BX 设(设(AX)=1024H (BX)=2048H 指令执行后:指令执行后:(AX)=2048H (BX)=1024H 等效三条等效三条MOV指令:指令:MOV CX,AX MOV AX,BX MOV BX,CX 4)入栈指令入栈指令 PUSH 和和出栈指令出栈指令 POP指令格式:指令格式:PUSHOPS 执行操作:执行操作:(SP)(SP)-2 ((SP)+1,(,(SP))(OPS)功能:功能:将指定的将指定的字字数据压入栈顶数据压入栈顶 指令格式:指令格式:POP OPD 执行操作:执行操作:(OPD)((SP)+1,(,(SP))(SP)(SP)+2 功能:功能:将栈顶字数据弹出堆栈将栈顶字数据弹出堆栈例例:PUSH AX POP BX 执行指令前执行指令前后状态后状态:3104 堆栈段堆栈段栈顶栈顶SP 3001H3002H3003H3004HSP1.PUSH AXAX BX310410002.POP BXAX BX31043104执行指令前执行指令前:执行指令后执行指令后:设:(设:(AX)=3104H (BX)=1000H v前者8个字16个字节000FHv后者8个双字32个字节001FH 5)PUSHA 和和POPA PUSHADPOPA PUSHAD和和POPADPOPAD6)6)地址传送指令地址传送指令 LEA指令指令 指令格式:指令格式:LEA OPD,OPS执行操作执行操作:(OPD)OPSOPS的偏移地址的偏移地址OPDOPD是是16/3216/32位的位的R,OPSR,OPS是是MM 功能功能:将源操作数的偏移地址送指定寄存器将源操作数的偏移地址送指定寄存器操作对标志位无影响。操作对标志位无影响。例例:LEA DX,BUFFER 设设:BUFFER单元的地址单元的地址 =F000H:4300H 指令执行后指令执行后:如果指令如果指令 改为改为:MOV DX,BUFFER 指令执行后指令执行后:(BUFFER)=)=5000H(DX)=4300H(DX)=5000H这条指令通常用来建立串操作指令所须的寄存器指针。vSTRINGDBHelloWorld!,13,10,$vLEADX,STRING;意思是将STRING所在的偏移地址送入DX。vMOVAX,9vINT21H;这两句的功能为显示字符串。显示DS:DX指向的内存并以“$”结束的字符串。v假如STRING所在偏移地址为0770H,那么即是将0770HDX,vLDS/LES/LFS/LGS/LSS指令v取段地址和偏移地址指令v格式:LDS/LES/LFS/LGS/LSSOPD,OPSvEA=OPSvOPD为R(16位),OPS为M(32位)v操作对标志位没影响v执行后结果为:(EA)R偏移地址中的值送到寄存器中(OPD中)v(EA+2)DS/ES/FS/GS/SSv偏移地址+2单元里面的值送入相应段寄存器中。v例:movwordptr3060h,0100hmovwordptr3062h,1450hLESdi,3060hLDSsi,3060hLSSsp,3060h M指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:R或ES:R或SS:R不影响标志位不影响标志位 影响标志位影响标志位 PUSHF指令flags中的标志字堆栈栈顶字数据出栈POPF指令设置设置TF标志位:标志位:(flags中的中的 TF=1)PUSHF POP AX OR AX,0100H PUSH AX POPFflags(7)标志传送指令标志传送指令 传送标志寄存器传送标志寄存器flags中的标志位(中的标志位(1616位)位)vPUSHFD/POPFDv和上两个一样,除了是对双字操作。(32位)v格式书上有。(7)标志传送指令标志传送指令(7)标志传送指令标志传送指令 vLAHF/SAHF指令v格式:LAHF;取标志,FLAGS低8位依次AHvSAHF;存标志,AH依次FLAGS低8位vMSBLSBv70vSFZF空AF空PF空CFv取标志位不影响标志位v存有可能会影响(7)标志传送指令标志传送指令 v例如:LAHFvORAH,85HvSAHFv请问符号位发生什么变化?逻辑运算和移位指令逻辑运算和移位指令 位操作指令可以体现汇编语言对硬件的控制能力。位操作指令可以体现汇编语言对硬件的控制能力。1 逻辑运算指令逻辑运算指令 按位进行逻辑与、或、异或、非运算、测试位的操作。按位进行逻辑与、或、异或、非运算、测试位的操作。1)逻辑与指令逻辑与指令AND ANDOPD,OPS(OPD)(OPD)(OPS)2)逻辑或指令逻辑或指令OR OROPD,OPS (OPD)(OPD)(OPS)(OPD)(OPD)(OPS)3)异或指令异或指令XOR XOR OPD,OPS 4)逻辑非指令逻辑非指令NOTNOTOPD (OPD)(OPD)求反)求反 5)位测试指令位测试指令TEST TEST OPD,OPS(OPD)(OPS)源操作数源操作数1 保留原值保留原值 0 置置0特点:特点:1010 0 011 目的操作数目的操作数源操作数源操作数(1)逻辑与操作逻辑与操作保留保留清清00010 何时该用何种逻辑操作?何时该用何种逻辑操作?源操作数源操作数1 置置1 0 保留原值保留原值特点:特点:1010 0 011 目的操作数目的操作数源操作数源操作数(2)逻辑或操作逻辑或操作置置1保留保留1011 源操作数源操作数1 取反取反 0 保留原值保留原值特点:特点:1010 0011 目的操作数目的操作数源操作数源操作数(3)异或操作异或操作求反求反保留保留1001 如何确定源操作数?如何确定源操作数?例:例:将将AL的的D0位和位和D1位清位清0。设(设(AL)=BFH,指令为,指令为ANDAL,?分析:分析:1011 1111B 1111 1100B(FCH)1011 1100B应应将将源源操操作作数数取取为为立立即即数数FCH,指令为:,指令为:AND AL,0FCH 执行指令后:执行指令后:(AL)=BCH 根根据据上上述述操操作作的的特特点点,可可以以确确定定该该用用什什么么操操作作实实现现需需要要的的功功能能:某些位某些位清清0 0 (保留保留其他位)用逻辑与操作其他位)用逻辑与操作 某位置某位置1 1 用逻辑或操作,用逻辑或操作,某位求反某位求反用异或操作用异或操作 例:例:将将AL中中的的大写字母大写字母(AL)=41H 转换为小写字母转换为小写字母即即 41H 61H指令为:指令为:OR AL,?分析:分析:0100 0001B (41H)0010 0000B (20H)20H执行指令后:执行指令后:(AL)=61H小写转换为大写的指令为:小写转换为大写的指令为:AND AL,?0DFH 110 1 1111B (DFH)执行指令后:执行指令后:(AL)=41H 0110 0001B (61H)0100 0001B (41H)根根据据需需要要的的功功能能,先先确确定定逻逻辑辑运运算算指指令令,再再利利用用逻逻辑辑运算指令的特点运算指令的特点确定源操作数确定源操作数。逻辑运算方法:逻辑运算方法:例:测试例:测试AL的的D0位是否为位是否为1。MOV AL,0F3HTEST AL,01H 执行指令后:执行指令后:ZF=0分析:分析:1111 0011B 0000 0001B0000 0001B根据根据ZF=0可知可知AL的的D0位为位为1 指指令令系系统统有有专专门门的的指指令令来来检检测测ZF的的设设置置,从从而而控控制制程程序的处理流程序的处理流程。JZ rel ZF=0 JZ rel ZF=0 则转移则转移 relrel2 移位指令移位指令 1)逻辑左移指令逻辑左移指令 SHL opd,count 2)算术左移指令算术左移指令ArithmeticSALopd,count OPDCF补补0SHL/SAL 移位移位(分为逻辑移位、算术移位和循环移位三类)(分为逻辑移位、算术移位和循环移位三类)OPD为8/16/32位的R/MOPS是计数值(移位的次数):1、8位立即数,或CL的内容(移位前将将要移位的次数送入CL中。)最后移出的位保存在CF中。v逻辑左移与算数左移物理上完全相同。例:将例:将BL中的值逻辑左移中的值逻辑左移1位位,设(,设(BL)=AFH SHLBL,1 1 0 1 0 1 1 1 10指令执行前指令执行前0 1 0 1 1 1 1 01指令执行后指令执行后执行指令后:执行指令后:(BL)=5EHCF=1 3)逻辑右移指令逻辑右移指令 SHR opd,count 4)算术右移指令算术右移指令SARopd,count opdCF补补0SHR 移位移位S保持保持符号符号SAR 移位移位OPD为8/16/32位的R/MOPS是计数值(移位的次数):1、8位立即数,或CL的内容(移位前将将要移位的次数送入CL中。)每次右移后,LSB位保存在CF中。SHR:最高位补0SAR:符号位(MSB)不变,从位6开始右移例例:将将BL中的值逻辑右移中的值逻辑右移1位位,设(,设(BL)=AFH SHRBL,1 1 0 1 0 1 1 1 10指令执行前指令执行前0 1 0 1 0 1 1 11 指令执行后指令执行后执行指令后:执行指令后:(BL)=57HCF=1例例:将将BL中的值算术右移中的值算术右移1位位,设(,设(BL)=AFHSARBL,1 1 0 1 0 1 1 1 10指令执行前指令执行前执行指令后:执行指令后:(BL)=D7H1 1 0 1 0 1 1 11 指令执行后指令执行后 逻辑移位总是逻辑移位总是补补0 0 ,算术移位,算术移位保持符号保持符号。移位位数大于移位位数大于1 1时时,必须用必须用CL寄存器给出移位位数。寄存器给出移位位数。5)循环左移指令循环左移指令 ROL opd,count 6)带进位循环左移指令带进位循环左移指令RCLopd,count RCL 移位移位CFopdROL 移位移位 7)循环右移指令循环右移指令 ROR opd,count 8)带进位循环右移指令带进位循环右移指令RCRopd,count RCR 移位移位CFopdROR 移位移位循环移位例:将例:将BL中的值循环左移中的值循环左移1位位,设(,设(BL)=AFH ROLBL,1 1 0 1 0 1 1 1 10指令执行前指令执行前执行指令后:执行指令后:(BL)=5FH0 1 0 1 1 1 1 11指令执行后指令执行后v注注意意:如如果果移移位位位位数数大大于于1 1,必必须须用用CLCL寄寄存存器器给给出出移位位数。移位位数。v只只有有在在实实方方式式情情况况下下,OPSOPS可可以以为为8 8位位立立即即数数(=2=2的情况)的情况)例:将例:将BX指向的存储器单元的高字节与低字节互换位置。指向的存储器单元的高字节与低字节互换位置。MOV CL,8ROR BX,CL 5 B 4 00指令执行前指令执行前设设 执行指令前:执行指令前:(DS)=3000H,(,(BX)=0150H (30150H)=5B40H执行指令后:执行指令后:指令执行后指令执行后 4 0 5 B 0 (30150H)=405BH ,CF=0算术、逻辑移位可用于:算术、逻辑移位可用于:改变数据二进制位的位置(丢失移出的位)改变数据二进制位的位置(丢失移出的位)二进制的整次幂的乘法(左移)、除法(右移)二进制的整次幂的乘法(左移)、除法(右移)算术移位用于算术移位用于带符号数带符号数操作操作 逻辑移位用于逻辑移位用于无符号数无符号数操作操作循环移位可用于:循环移位可用于:改变数据二进制位的位置(不丢失移动的位)改变数据二进制位的位置(不丢失移动的位)双精度移位指令vSHLDOPD,OPS,移位位数双精度左移vSHRDOPD,OPS,移位位数双精度右移v双精度移位指令指令操作数的初值指令执行后的结果vSHLDAX,BX,1(AX)=1234H,(BX)=8765H(AX)=2469HvSHLDAX,BX,3(AX)=1234H,(BX)=8765H(AX)=91A4HvSHRDAX,BX,2(AX)=1234H,(BX)=8765H(AX)=448DHvSHRDAX,BX,4(AX)=1234H,(BX)=8765H(AX)=5123Hv环境不支持v移位指令中,溢出标志位OF的设置规则为:v如果只移动一位,则系统按照操作数的最高符号位在移位前后是否发生改变,来相应地设置溢出标志OF的值:如果移位前操作数的最高符号位与移位后操作数的最高符号位不相同(有变化),则设置OF=1,认为溢出了;否则,设置OF=0,认为没有溢出;v但是,如果移位位数大于1,则OF的值不确定;也就是说,溢出标志OF的值只有在移位位数为1时才有意义算术运算指令算术运算指令 算术运算指令完成加、减、乘、除。算术运算指令完成加、减、乘、除。(1)加法指令加法指令 验证验证 完成二进制的加法、带进位加法、加完成二进制的加法、带进位加法、加1。1)加法指令加法指令ADD 验证验证 ADDOPD,OPS(OPD)(OPD)+(OPS)影响影响CF、AF、OF、PF、SF、ZF 标志位标志位。2)带进位加法指令带进位加法指令ADC 验证验证ADC OPD,OPS(OPD)()(OPD)+(OPS)+CF(进进位位标志位的值)标志位的值)3)加加1指令指令INC INCopd(opd)(opd)+1 CF=1:无符号数运算溢出:无符号数运算溢出 最高有效位有进位时最高有效位有进位时,CF置置1 OF=1:带符号数运算溢出带符号数运算溢出 两个同符号操作数的运算结果两个同符号操作数的运算结