移位指令的用法( )是指定的被移位的操作数,可以是寄存器或存储单元?

1、3.2.3 位操作类指令位操作类指令以二进制位为基本单位位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指进行数据的操作;这是一类常用的指令,都应该特别掌握令,都应该特别掌握注意这些指令对标志位的影响注意这些指令对标志位的影响1、逻辑运算指令、逻辑运算指令AND OR XOR NOT TEST2、移位指令、移位指令SHL SHR SAR3、循环移位指令、循环移位指令ROL ROR RCL RCR逻辑与指令AND对两个操作数执行逻辑与运算,结果对两个操作数执行逻辑与运算,结果送到目的操作数送到目的操作数AND指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置SF、Z2、F和和PF状态,而对状态,而对AF未定义未定义AND reg,imm/reg/mem AND reg,imm/reg/mem ;regregregregimm/reg/memimm/reg/memAND mem,imm/reg AND mem,imm/reg ;memmemmemmemimm/regimm/reg 只有相只有相“与与”的两位都是的两位都是1,结,结果才是果才是1;否则,;否则,“与与”的结果为的结果为0逻辑或指令OR对两个操作数执行逻辑或运算,结果对两个操作数执行逻辑或运算,结果送到目的操作数送到目的操作数OR指令设置指令设置CF = OF = 0,根据结果设,根据结果设置置S3、F、ZF和和PF状态,而对状态,而对AF未定义未定义OR reg,imm/reg/mem OR reg,imm/reg/mem ;regregregregimm/reg/memimm/reg/memOR mem,imm/reg OR mem,imm/reg ;memmemmemmemimm/regimm/reg 只要相只要相“或或”的两位有一位是的两位有一位是1,结果就是结果就是1;否则,结果为;否则,结果为0逻辑异或指令XOR对两个操作数执行逻辑异或运算,结对两个操作数执行逻辑异或运算,结果送到目的操作数果送到目的操作数XOR指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置4、SF、ZF和和PF状态,而对状态,而对AF未定义未定义XOR reg,imm/reg/mem XOR reg,imm/reg/mem ;regregregregimm/reg/memimm/reg/memXOR mem,imm/reg XOR mem,imm/reg ;memmemmemmemimm/regimm/reg 只有相只有相“异或异或”的两位不相同,的两位不相同,结果才是结果才是1;否则,结果为;否则,结果为0逻辑非指令NOT对一个操作数执行逻辑非运算对一个操作数执行逻辑非运算NOT指令是一个单操作数指令指令是一个单操作数指令NOT指令不影响标志位指令不影响标志位NOT reg/me5、m NOT reg/mem ;reg/memreg/memreg/memreg/mem 按位取反,原来是按位取反,原来是“0”的位变为的位变为“1”;原来是;原来是“1”的位变为的位变为“0”例题:逻辑运算例题:逻辑运算mov al,45hmov al,45h;逻辑与;逻辑与 al=01hal=01handand al,31h al,31h;CF=OF=0CF=OF=0,SF=0SF=0、ZF=0ZF=0、PF=0PF=0mov al,45hmov al,45h;逻辑或;逻辑或 al=75hal=75horor al,31h al,31h;CF=OF=0CF=OF=0,SF=0SF=0、ZF=6、0ZF=0、PF=0PF=0mov al,45hmov al,45h;逻辑异或;逻辑异或 al=74hal=74hxorxor al,31h al,31h;CF=OF=0CF=OF=0,SF=0SF=0、ZF=0ZF=0、PF=1PF=1mov al,45hmov al,45h;逻辑非;逻辑非 al=0bahal=0bahnotnot al al;标志不变;标志不变例题:逻辑指令应用例题:逻辑指令应用;ANDAND指令可用于复位某些位(同指令可用于复位某些位(同0 0相与),不相与),不影响其他位:将影响其他位:将BLBL中中D D3 3和和D D0 0位清位清0 0,其他位不变,其他位不变a7、ndand bl,11110110B bl,11110110B;OROR指令可用于置位某些位(同指令可用于置位某些位(同1 1相或),不相或),不影响其他位:将影响其他位:将BLBL中中D D3 3和和D D0 0位置位置1 1,其他位不变,其他位不变oror bl, 00001001B bl, 00001001B;XORXOR指令可用于求反某些位(同指令可用于求反某些位(同1 1相异或),相异或),不影响其他位:将不影响其他位:将BLBL中中D D3 3和和D D0 0位求反,其他不变位求反,其他不变xorxor bl, 00001001B bl, 00001001B例:屏蔽例:屏蔽AL的第8、的第0、1两位两位 AND AL, 0FCH例:置例:置AL的第的第5位为位为1 OR AL, 20H 例:使例:使AL的第的第0、1位变反位变反 XOR AL, 3例:测试某些位是例:测试某些位是0是是1 TEST AL, 1 JZ EVEN * * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * * * * * * * * 0 1 XOR 0 0 0 0 0 0 1 1 * * * * * * 1 0 * * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0 * * * * * * * * AND 0 9、0 0 0 0 0 0 1 0 0 0 0 0 0 0 *测试指令TEST对两个操作数执行逻辑与运算,对两个操作数执行逻辑与运算,结果结果不回送到目的操作数不回送到目的操作数AND指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置SF、ZF和和PF状态,而对状态,而对AF未定义未定义TEST reg,imm/reg/memTEST reg,imm/reg/mem;regregimm/reg/memimm/reg/memTEST mem,imm/regTEST mem,imm/reg;memmemimm/regimm/reg只有相只有相“与与”的两位都是的两位都是1,结果,结果才10、是才是1;否则,;否则,“与与”的结果为的结果为0例例31:测试为:测试为0或或1test al,01htest al,01h;测试;测试ALAL的最低位的最低位D D0 0jnz therejnz there;标志;标志ZF=0ZF=0,即,即D D0 0=1=1;则程序转移到;则程序转移到therethere.;否则;否则ZF=1ZF=1,即,即D D0 0=0=0,顺序执行,顺序执行there: .there: . TEST指令通常用于检测一些条件是否指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况满足,但又不希望改变原操作数的情况例例3:请求出:请求出AL中中“1”的个数11、,存在的个数,存在AH中。中。 MOV AH, 0 Again: SHL AL, 1 ADC AH, 0 CMP AL, 0 JNZ AGAIN HLT MOV AH,0 MOV CL,8 Again: SHL AL,1 JNC Next INC AH Next: DEC CL JNZ Again HLT移位指令(shift)将操作数移动一位或多位,分成逻辑移位和将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作算术移位,分别具有左移或右移操作SHL reg/mem,1/CLSHL reg/mem,1/CL;逻辑左移,最高位进入;逻辑左移,最高位进入CFCF,最低位补,最低12、位补0 0SHR reg/mem,1/CLSHR reg/mem,1/CL;逻辑右移,最低位进入;逻辑右移,最低位进入CFCF,最高位补,最高位补0 0SAL reg/mem,1/CLSAL reg/mem,1/CL;算术左移,最高位进入;算术左移,最高位进入CFCF,最低位补,最低位补0 0SAR reg/mem,1/CLSAR reg/mem,1/CL;算术右移,最低位进入;算术右移,最低位进入CFCF,最高位不变,最高位不变SALSAL与与SHLSHL相同相同移位指令的操作数移位指令的第一个操作数是指定移位指令的第一个操作数是指定的被移位的操作数,可以是寄存的被移位的操作数,可以是寄存器13、或存储单元器或存储单元后一个操作数表示移位位数后一个操作数表示移位位数,该,该操作数操作数为为1,表示移动一位;当移,表示移动一位;当移位位数位位数大于大于1时,则用时,则用CL寄存器值寄存器值表示,该操作数表达为表示,该操作数表达为CL移位指令对标志的影响按照移入的位设置进位标志按照移入的位设置进位标志CF根据移位后的结果影响根据移位后的结果影响SF、ZF、PF对对AF没有定义没有定义如果进行一位移动,则按照操作数的如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出最高符号位是否改变,相应设置溢出标志标志OF:如果移位前的操作数最高位:如果移位前的操作数最高位与移位后操作数的最14、高位不同(有变与移位后操作数的最高位不同(有变化),则化),则OF = 1;否则;否则OF = 0。当移。当移位次数大于位次数大于1时,时,OF不确定不确定例例32:移位指令:移位指令mov cl,4mov cl,4mov al,0f0hmov al,0f0h;al=f0hal=f0hshl al,1shl al,1;al=e0hal=e0h;CF=1CF=1,SF=1SF=1、ZF=0ZF=0、PF=0PF=0,OF=0OF=0shr al,1shr al,1;al=70hal=70h;CF=0CF=0,SF=0SF=0、ZF=0ZF=0、PF=0PF=0、OF=1OF=1sar al,1s15、ar al,1;al=38hal=38h;CF=0CF=0,SF=0SF=0、ZF=0ZF=0、PF=0PF=0、OF=0OF=0sar al,clsar al,cl;al=03hal=03h;CF=1CF=1,SF=0SF=0、ZF=0ZF=0、PF=1PF=1例例33:移位实现乘:移位实现乘mov si,axmov si,axshl si,1shl si,1;si2si2axaxadd si,axadd si,ax;si3si3axaxmov dx,bxmov dx,bxmov cl,03hmov cl,03hshl dx,clshl dx,cl;dx8dx8bxbxsub dx,bxsu16、b dx,bx;dx7dx7bxbxadd dx,siadd dx,si;dx7dx7bxbx3 3axax 逻辑左移一位相当于无符号数乘以逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以逻辑右移一位相当于无符号数除以2循环移位指令(rotate)将操作数从一端移出的位返回到另一将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,端形成循环,分成不带进位和带进位,分别具有左移或右移操作分别具有左移或右移操作ROL reg/mem,1/CL ROL reg/mem,1/CL ;不带进位循环左移;不带进位循环左移ROR reg/mem,1/CL ROR reg/mem17、,1/CL ;不带进位循环右移;不带进位循环右移RCL reg/mem,1/CL RCL reg/mem,1/CL ;带进位循环左移;带进位循环左移RCR reg/mem,1/CL RCR reg/mem,1/CL ;带进位循环右移;带进位循环右移循环移位指令对标志的影响按照指令功能设置进位标志按照指令功能设置进位标志CF不影响不影响SF、ZF、PF、AF如果进行一位移动,则按照操作数的如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出最高符号位是否改变,相应设置溢出标志标志OF:如果移位前的操作数最高位:如果移位前的操作数最高位与移位后操作数的最高位不同(有变与移位后操作数的最18、高位不同(有变化),则化),则OF = 1;否则;否则OF = 0。当移。当移位次数大于位次数大于1时,时,OF不确定不确定DXAXMOV CL, 4 SHL DX, CL MOV BL, AH SHL AX, CL SHR BL, CL OR DL, BL 00000000 实现实现32位数的移位,要求左移位数的移位,要求左移4位。位。DH DLAH ALBL 0000DXAXBL0000 BL 0000DLDL方法方法1 MOV CL, 4 Again: SHL AX, 1 RCL DX, 1 DEC CL JNZ AgainAXDXCC方法方法2例例34:32位数移位位数移位;将;将DX19、.AXDX.AX中中3232位数值左移一位位数值左移一位shl ax,1shl ax,1rcl dx,1rcl dx,1DXAXCF0例例35:位传送:位传送;把;把ALAL最低位送最低位送BLBL最低位,保持最低位,保持ALAL不变不变ror bl,1ror bl,1ror al,1ror al,1rcl bl,1rcl bl,1rol al,1rol al,1AL、BLCFBLCFALCFAL之之D0例例36:BCD码合并码合并;AH.ALAH.AL分别存放着非压缩分别存放着非压缩BCDBCD码的两位码的两位;将它们合并成为一个压缩;将它们合并成为一个压缩BCDBCD码存码存ALALand20、 ax,0f0fhand ax,0f0fh;保证高;保证高4 4位为位为0 0mov cl,4mov cl,4rol ah,clrol ah,cl;也可以用;也可以用shl ah,clshl ah,cladd al,ahadd al,ah;也可以用;也可以用or al,ahor al,ah例例5: 在内存某一缓冲区中,存在内存某一缓冲区中,存 放着若干用放着若干用BCD码表示的码表示的 十进制数,每一个单元中十进制数,每一个单元中 存放两位,要求将它们转存放两位,要求将它们转 换成换成ASC码,存放在缓码,存放在缓 冲区,高冲区,高4位的位的BCD码转换码转换 的的ASC码放在地址较高码放在地21、址较高 的单元。的单元。BCDBUF ASCBUF65 23 02 00 2435 36 33 32 32 30开始开始设地址设地址设转换个数设转换个数转换低转换低 4 位位取数取数存结果存结果转换高转换高 4 位位存结果存结果CX -1-CXCX=0?结束结束 MOV SI, Offset BCDBUF MOV DI, Offset ASC BUF MOV CH, Count Again: MOV AL, SI INC SI MOV BL, AL AND AL, 0FH OR AL, 30H MOV DI, AL INC DI MOV AL, BL ; 0 1 1 0, 0 1 0 1 MO22、V CL, 4 SHR AL, CL ; 0 0 0 0, 0 1 1 0 OR AL, 30H ; 0 0 1 1, 0 1 1 0 MOV DI, AL INC DI DEC CH JNZ Again HLT BCDBUF ASCBUF65 23 02 00 24 35 36 33 32 32 30 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1SIDI3.2.4 控制转移类指令控制转移类指令控制转移类指令用于实现分支、循环、用于实现分支、循环、过23、程等程序结构,是仅次于传送过程等程序结构,是仅次于传送指令指令的最常用指令的最常用指令重点掌握:重点掌握:JMP/Jcc/LOOP CALL/RETINT n/IRET 常用系统功能调用常用系统功能调用一般了解:一般了解: LOOPZ/LOOPNZ INTO 控制转移类指令通过控制转移类指令通过改变改变IP(和(和CS)值,值,实现程序执行顺序的改变实现程序执行顺序的改变1). 无条件转移指令只要执行无条件转移指令只要执行无条件转移指令JMP,就使程序转,就使程序转到指定的目标地址处,从目标地址处开始执到指定的目标地址处,从目标地址处开始执行那里的指令行那里的指令操作数操作数label是要转移24、到的是要转移到的目标地址目标地址(目的目的地址地址、转移地址转移地址)JMP指令分成指令分成4种类型:种类型: 段内转移、直接寻址段内转移、直接寻址 段内转移、间接寻址段内转移、间接寻址 段间转移、直接寻址段间转移、直接寻址 段间转移、间接寻址段间转移、间接寻址JMP labelJMP label;程序转向;程序转向labellabel标号指定的地址标号指定的地址目标地址的寻址方式直接寻址方式直接寻址方式n转移地址象立即数一样,直接在转移地址象立即数一样,直接在指令的机器代码中,就是直接寻指令的机器代码中,就是直接寻址方式址方式间接寻址方式间接寻址方式n转移地址在寄存器或主存单元中,转移地址在25、寄存器或主存单元中,就是通过寄存器或存储器的间接就是通过寄存器或存储器的间接寻址方式寻址方式用标号表达用标号表达用寄存器或存储器用寄存器或存储器操作数表达操作数表达与转移地址有关的寻址方式:与转移地址有关的寻址方式: 段内寻址段内寻址 段内直接寻址段内直接寻址 JMP NEAR PTR NEXT 段内间接寻址段内间接寻址 JMP TABLE BX 段间寻址段间寻址 段间直接寻址段间直接寻址 JMP FAR PTR NEXT 段间间接寻址段间间接寻址 JMP DWORD PTR BX 用来确定转移指令及转子指令的转向地址用来确定转移指令及转子指令的转向地址。(1) 段内直接寻址段内直接寻址转向的26、有效地址转向的有效地址 = 当前当前(IP) + 位移量位移量(8bit/16bit) 例例: JMP NEAR PTR NEXT 近转移近转移 -32768 +32767 JMP SHORT NEXT 短转移短转移 -128 +127 目标地址的范围:段内段内转移段内转移近转移(近转移(near)n在当前代码段在当前代码段64KB范围内转移范围内转移( 32KB范围)范围)n不需要更改不需要更改CS段地址,段地址,只要改只要改变变IP偏移地址偏移地址段内转移段内转移短转移(短转移(short)n转移范围可以用一个字节表达,转移范围可以用一个字节表达,在段内在段内128127范围的转移范围的转27、移代码段代码段代码段代码段目标地址的范围:段间段间转移段间转移远转移(远转移(far)n从当前代码段跳转到另一个从当前代码段跳转到另一个代码段,可以在代码段,可以在1MB范围范围n需要需要更改更改CS段地址和段地址和IP偏移偏移地址地址n目标地址必须用一个目标地址必须用一个32位数位数表达,叫做表达,叫做32位远指针位远指针,它,它就是逻辑地址就是逻辑地址代码段代码段代码段代码段 实际编程时,汇编程序会根据目标地址的距离,实际编程时,汇编程序会根据目标地址的距离,自自动处理动处理成短转移、近转移或远转移成短转移、近转移或远转移 程序员可用操作符程序员可用操作符short、near ptr 或或28、far ptr 强制强制段内转移、直接寻址JMP labelJMP label;IPIP+IPIP+位移量位移量位移量是紧接着位移量是紧接着JMP指令后的那条指令的偏移地址,指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负小方向转移时,位移量为负jmp jmp againagain;转移到;转移到againagain处继续执行处继续执行again:again:dec cxdec cx;标号;标号againagain的指令的指令jmp jmp o29、utputoutput;转向;转向outputoutputoutput:output: mov result,almov result,al;标号;标号outputoutput的指令的指令实际为相对寻址实际为相对寻址段内转移、间接寻址JMP r16/m16 JMP r16/m16 ;IPr16/m16IPr16/m16将一个将一个1616位寄存器或主存字单元内容送入位寄存器或主存字单元内容送入IPIP寄存器,作为新的指令指针,但不修改寄存器,作为新的指令指针,但不修改CSCS寄存寄存器的内容器的内容jmp axjmp ax;IPAXIPAXjmp word ptr 2000hjmp word 30、ptr 2000h ;IP2000hIP2000h段间转移、直接寻址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址将标号所在段的段地址作为新的将标号所在段的段地址作为新的CS值,值,标号在该段内的偏移地址作为新的标号在该段内的偏移地址作为新的IP值;这值;这样,程序跳转到新的代码段执行样,程序跳转到新的代码段执行jmp far ptr othersegjmp far ptr otherseg;远转移到代码段;远转移到代码段2 2的的othersegotherseg段间转移、间接31、寻址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem+2CSmem+2用一个双字存储单元表示要跳转的目标地用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个址。这个目标地址存放在主存中连续的两个字单元中的,低位字送字单元中的,低位字送IPIP寄存器,高位字送寄存器,高位字送CSCS寄存器寄存器mov word ptr bx,0mov word ptr bx,0mov word ptr bx+2,1500hmov word ptr bx+2,1500hJMP far ptr bx JMP far ptr bx ;转移到;转移到32、1500h:01500h:03.4.2 条件转移指令指定的条件指定的条件cc如果成立,程序转移到如果成立,程序转移到由标号由标号label指定的目标地址去执行指指定的目标地址去执行指令;条件不成立,则程序将顺序执行令;条件不成立,则程序将顺序执行下一条指令下一条指令操作数操作数label是采用短转移,称为相对是采用短转移,称为相对寻址方式寻址方式Jcc labelJcc label ;条件满足,发生转移:;条件满足,发生转移:IPIPIPIP8 8位位移量位位移量 ;条件不满足,顺序执行;条件不满足,顺序执行相对寻址方式Jcc指令的操作数指令的操作数label是一个标号是一个标号n一个一个8位33、位移量,表示位位移量,表示Jcc指令后的那条指令后的那条指令的偏移地址,到目标指令的偏移地址指令的偏移地址,到目标指令的偏移地址的地址位移的地址位移n8位位移量是位位移量是相对于相对于当前当前IP的,且距当前的,且距当前IP地址地址128127个单元的范围之内,个单元的范围之内,属于段内短距离转移属于段内短距离转移nJcc目标地址就采用这种目标地址就采用这种相对寻址方式相对寻址方式Jcc指令为指令为2个字节,条件不满足时的个字节,条件不满足时的顺序执行就是当前指令偏移指针顺序执行就是当前指令偏移指针IP加加2Jcc指令的分类Jcc指令不影响标志,但要利用标指令不影响标志,但要利用标志(表志(表34、2.2)。根据利用的标志位)。根据利用的标志位不同,不同,16条指令分成条指令分成3种情况:种情况:1. 判断单个标志位状态判断单个标志位状态2. 比较无符号数高低比较无符号数高低3. 比较有符号数大小比较有符号数大小条件转移指令中的条件cc 实际虽然指令只有实际虽然指令只有16条,但却有条,但却有30个助记符个助记符 采用多个助记符,只是为了方便记忆和使用采用多个助记符,只是为了方便记忆和使用1. 判断单个标志位状态这组指令单独判断这组指令单独判断5个状态标志之一个状态标志之一JZ/JE和和JNZ/JNE:利用零标志:利用零标志ZF,判断结,判断结果是否为零(或相等)果是否为零(或相等)JS35、和和JNS:利用符号标志:利用符号标志SF,判断结果是,判断结果是正是负正是负JO和和JNO:利用溢出标志:利用溢出标志OF,判断结果是,判断结果是否产生溢出否产生溢出JP/JPE和和JNP/JPO:利用奇偶标志:利用奇偶标志PF,判,判断结果中断结果中“1”的个数是偶是奇的个数是偶是奇JC/JB/JNAE和和JNC/JNB/JAE:利用进位:利用进位标志标志CF,判断结果是否进位或借位,判断结果是否进位或借位例题例题2.38例题例题2.39例题例题2.40例题例题2.41例题例题2.42例例2.38:JZ/JNZ指令指令test al,80htest al,80h;测试最高位;测试最高位jz36、 next0jz next0;D7D70 0(ZFZF1 1),转移),转移mov ah,0ffhmov ah,0ffh;D7D71 1,顺序执行,顺序执行jmp donejmp done;无条件转向;无条件转向next0:next0:mov ah,0mov ah,0done:done:.test al,80htest al,80h;测试最高位;测试最高位jnz next1jnz next1;D7D71 1(ZFZF0 0),转移),转移mov ah,0mov ah,0;D7D70 0,顺序执行,顺序执行jmp donejmp done;无条件转向;无条件转向next1:next1:mov a37、h,0ffhmov ah,0ffhdone:done:.例例2.39:JS/JNS指令指令;计算计算|XY|(绝对值)(绝对值);X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作数;结果存入;结果存入resultmov ax,Xmov ax,Xsub ax,Ysub ax,Yjns nonnegjns nonnegneg axneg ax;negneg是求补指令是求补指令nonneg:nonneg: mov result,axmov result,ax例例2.40:JO/JNO指令指令;计算;计算XY;X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作38、数;若溢出,则转移到;若溢出,则转移到overflow处理处理mov ax,Xmov ax,Xsub ax,Ysub ax,Yjo overflowjo overflow.;无溢出,结果正确;无溢出,结果正确overflow:overflow: .;有溢出处理;有溢出处理例例2.41:JP/JNP指令指令;设字符的;设字符的ASCII码在码在AL寄存器中寄存器中;将字符加上奇校验位;将字符加上奇校验位;在字符;在字符ASCII码中为码中为“1”的个数已为奇数时的个数已为奇数时;则令其最高位为;则令其最高位为“0”;否则令最高位为;否则令最高位为“1”and al,7fhand al,7fh;最39、高位置;最高位置“0”0”,同时判断,同时判断“1”1”的个的个数数jnp nextjnp next;个数已为奇数,则转向;个数已为奇数,则转向nextnextor al,80hor al,80h;否则,最高位置;否则,最高位置“1”1”next:next:.例例2.42:JC/JNC指令指令;记录;记录BX中中1的个数的个数xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:test bx,test bx,0ffffh 0ffffh ;等价于;等价于 cmp bx,0cmp bx,0je nextje nextshl bx,1shl bx,1jnc a40、gainjnc againinc alinc aljmp againjmp againnext:next:.;ALAL保存保存1 1的个数的个数另一种做法另一种做法记录记录BX中中“1”的个数的个数xor al,alxor al,al;ALAL0 0,CFCF0 0again:again:cmp bx,0cmp bx,0jz nextjz nextshl bx,1shl bx,1;也可使用;也可使用 shr bx,1shr bx,1adc al,0adc al,0jmp againjmp againnext:next:.;ALAL保存保存1 1的个数的个数比较无符号数高低无符号数的大小用高(无41、符号数的大小用高(Above)低)低(Below)表示)表示利用利用CF确定高低、利用确定高低、利用ZF标志确定相标志确定相等(等(Equal)两数的高低分成两数的高低分成4种关系:种关系: 低于(不高于等于):低于(不高于等于):JB(JNAE) 不低于(高于等于):不低于(高于等于):JNB(JAE) 低于等于(不高于):低于等于(不高于):JBE(JNA) 不低于等于(高于):不低于等于(高于):JNBE(JA )例例2.43a:比较无符号数:比较无符号数cmp ax,bxcmp ax,bx;比较;比较axax和和bxbxjnb nextjnb next;若;若axaxbxbx,转移,转42、移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:next:.结果:结果:AX保存较大的保存较大的无符号数无符号数比较有符号数大小有符号数的大(有符号数的大(Greater)小()小(Less)需要组合需要组合OF、SF标志,并利用标志,并利用ZF标标志确定相等(志确定相等(Equal)两数的大小分成两数的大小分成4种关系:种关系: 小于(不大于等于):小于(不大于等于):JL(JNGE) 不小于(大于等于):不小于(大于等于):JNL(JGE) 小于等于(不大于):小于等于(不大于):JLE(JNG) 不小于等于(大于):不小于等于(大于):JNLE(J43、G )例例2.43b:比较有符号数:比较有符号数cmp ax,bxcmp ax,bx;比较;比较axax和和bxbxjnl nextjnl next;若;若axaxbxbx,转移,转移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:next:.结果:结果:AX保存较大的保存较大的有符号数有符号数3.4.3 循环指令(loop)循环指令默认利用循环指令默认利用CX计数器,方便实计数器,方便实现计数循环的程序结构现计数循环的程序结构label操作数采用相对寻址方式操作数采用相对寻址方式LOOP labelLOOP label;CXCXCXCX1 1, ;CX044、CX0,循环到标号,循环到标号labellabelLOOPZ labelLOOPZ label;CXCXCXCX1 1, ;CX0CX0且且ZFZF1 1,循环到标号,循环到标号labellabelLOOPZ labelLOOPZ label;CXCXCXCX1 1, ;CX0CX0且且ZFZF0 0,循环到标号,循环到标号labellabelJCXZ labelJCXZ label;CXCX0 0,转移到标号,转移到标号labellabel例例2.44:记录空格个数:记录空格个数mov cx,countmov cx,count;设置循环次数;设置循环次数mov si,offset strin45、gmov si,offset stringxor bx,bxxor bx,bx;bxbx0 0,记录空格数,记录空格数jcxz donejcxz donemov al,20hmov al,20h;如果长度为;如果长度为0 0,退出,退出again:again: cmp al,es:sicmp al,es:sijnz nextjnz next;ZFZF0 0非空格,转移非空格,转移inc bxinc bx;ZF=1ZF=1是空格,个数加是空格,个数加1 1next:next:inc siinc siloop againloop again;字符个数减;字符个数减1 1,不为,不为0 0继续循环继46、续循环dec cxjnz againcmp cx,0jz next3.4.4 子程序指令子程序是完成特定功能的一段程序子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个当主程序(调用程序)需要执行这个功能时,采用功能时,采用CALL调用指令转移到该调用指令转移到该子程序的起始处执行子程序的起始处执行当运行完子程序功能后,采用当运行完子程序功能后,采用RET返返回指令回到主程序继续执行回指令回到主程序继续执行主程序与子程序CALL label主程序主程序RET子程序子程序回到回到CALL指令后的指令指令后的指令处处返回地址返回地址子程序调用指令CALL指令分成指令分成4种类型(类似种47、类型(类似JMP)CALL label;段内调用、直接寻址;段内调用、直接寻址CALL r16/m16;段内调用、间接寻址;段内调用、间接寻址CALL far ptr label ;段间调用、直接寻址;段间调用、直接寻址CALL far ptr mem ;段间调用、间接寻址;段间调用、间接寻址CALL指令需要保存返回地址:指令需要保存返回地址:n段内调用段内调用入栈偏移地址入栈偏移地址IPSPSP2,SS:SPIPn段间调用段间调用入栈偏移地址入栈偏移地址IP和段地址和段地址CSSPSP2,SS:SPIPSPSP2,SS:SPCS子程序返回指令根据段内和段间、有无参数,分成根据段内和段间、有无48、参数,分成4种类型种类型RET;无参数段内返回;无参数段内返回RET i16;有参数段内返回;有参数段内返回RET;无参数段间返回;无参数段间返回RET i16;有参数段间返回;有参数段间返回需要弹出需要弹出CALL指令压入堆栈的返回地址指令压入堆栈的返回地址n段内返回段内返回出栈偏移地址出栈偏移地址IPIPSS:SP, SPSP2n段间返回段间返回出栈偏移地址出栈偏移地址IP和段地址和段地址CSIPSS:SP,SPSP2CSSS:SP,SPSP2i16参数的作用参数的作用返回指令RET的参数RET i16;有参数返回;有参数返回RET指令可以带有一个立即数指令可以带有一个立即数i16,则堆栈49、指针则堆栈指针SP将增加,即将增加,即SPSP+i16这个特点使得程序可以方便地废这个特点使得程序可以方便地废除若干执行除若干执行CALL指令以前入栈的指令以前入栈的参数参数例例2.45:子程序:子程序;主程序;主程序mov al,0fhmov al,0fh;提供参数;提供参数ALALcallcall htoasc htoasc ;调用子程序;调用子程序.;子程序;子程序:将:将ALAL低低4 4位的一位位的一位1616进制数进制数转换转换成成ASCIIASCII码码htoasc:htoasc: and al,0fhand al,0fh;只取;只取alal的低的低4 4位位or al,30ho50、r al,30h;alal高高4 4位变成位变成3 3cmp al,39hcmp al,39h;是;是0 09 9,还是,还是0Ah0Ah0Fh0Fhjbe htoendjbe htoendadd al,7add al,7;是;是0Ah0Ah0Fh0Fh,加上,加上7 7htoend:htoend: retret;子程序返回;子程序返回3.4.5 中断指令中断(中断(Interrupt )是又一种改变)是又一种改变程序执行顺序的方法程序执行顺序的方法中断具有多种中断类型中断具有多种中断类型中断的指令有中断的指令有3条:条:INT i8 IRET INTO本节主要掌握类似子程序调用指本节主要掌握51、类似子程序调用指令的中断调用指令令的中断调用指令INT i8,进而学,进而学习使用习使用DOS功能调用功能调用中断的过程主程序主程序IRET中断服务程序中断服务程序断点断点中断请求中断请求中断请求可以来自处理器外部的中断源,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起:也可以由处理器执行指令引起:例如执行例如执行INT i8指令。指令。8086的外部中断8086可以管理可以管理256个中断个中断各种中断用一个向量编号来区别各种中断用一个向量编号来区别主要分成外部中断和内部中断主要分成外部中断和内部中断外部中断外部中断来自来自CPU之外的原因引之外的原因引起的中断,又可以分成起52、的中断,又可以分成n可屏蔽中断可屏蔽中断:可由:可由CPU的中断允许标志的中断允许标志IF控制控制n非屏蔽中断非屏蔽中断:不受:不受CPU的中断允许标志的中断允许标志IF控制控制8086的内部中断内部中断内部中断CPU内部执行程序引起内部执行程序引起的中断,又可以分成:的中断,又可以分成:n除法错中断除法错中断:执行除法指令,结果溢出产:执行除法指令,结果溢出产生的生的 0 号中断号中断n指令中断指令中断:执行中断调用指令:执行中断调用指令INT i8产生产生的的 i8 号中断号中断n断点中断断点中断:用于断点调试(:用于断点调试(INT 3)的)的 3 号中断号中断n溢出中断溢出中断:执行溢53、出中断指令,:执行溢出中断指令,OF1产产生的生的 4 号中断号中断n单步中断单步中断:TF1在每条指令执行后产生在每条指令执行后产生的的 1 号中断号中断中断指令INTINT i8INT i8;中断调用指令:产生;中断调用指令:产生i8i8号中断号中断IRETIRET;中断返回指令:实现中断返回;中断返回指令:实现中断返回INTOINTO;溢出中断指令:;溢出中断指令:;若溢出标志;若溢出标志OF=1OF=1,产生,产生4 4号中断号中断;否则顺序执行;否则顺序执行3.4.6 系统功能调用21H号中断是号中断是DOS提供给用户的用于调提供给用户的用于调用系统功能的中断,它有近百个功能供用用系54、统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能理和文件管理三个方面的功能ROM-BIOS也以中断服务程序的形式,也以中断服务程序的形式,向程序员提供系统的基本输入输出程序向程序员提供系统的基本输入输出程序汇编语言程序设计需要采用系统的各种汇编语言程序设计需要采用系统的各种功能程序功能程序充分利用操作系统提供的资源是程序设充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握计的一个重要方面,需要掌握功能调用的步骤通常按照如下通常按照如下4 4个步骤进行:个步骤进行: 在在AHAH寄存器中设置系统功能调用号55、寄存器中设置系统功能调用号 在指定寄存器中设置入口参数在指定寄存器中设置入口参数 执行指令执行指令INT 21HINT 21H(或(或ROM-BIOSROM-BIOS的中的中断向量号)实现中断服务程序的功能断向量号)实现中断服务程序的功能调用调用 根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况输入输出类功能调用向显示器输出字符向显示器输出字符 字符的输出字符的输出 字符串的输出字符串的输出从键盘输入数据从键盘输入数据 字符的输入字符的输入 字符串的输入字符串的输入 按键的判断按键的判断裸机裸机汇编语言程序字符输出的功能调用DOS功能调用功能调用INT 21Hn功能号:功能号:56、AH02Hn入口参数:入口参数:DL字符的字符的ASCII码码n功能:在显示器当前光标位置显示功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位给定的字符,光标右移一个字符位置。如按置。如按Ctrl-Break或或Ctrl-C则退出则退出例例2.46:显示问号:显示问号;在当前显示器光标位置显示一个问号;在当前显示器光标位置显示一个问号mov ah,02hmov ah,02h;设置功能号:;设置功能号:ah02hah02hmov dl,?mov dl,?;提供入口参数:;提供入口参数:dl?dl?int 21hint 21h;DOSDOS功能调用:显示功能调用:显示 进行字符输出时,57、当输出响铃字符(进行字符输出时,当输出响铃字符(07H)以及退格(以及退格(08H)、回车()、回车(0DH)和换行)和换行(0AH)字符时,该功能调用可以自动识别并)字符时,该功能调用可以自动识别并能进行相应处理能进行相应处理字符输出的功能调用显示器功能调用显示器功能调用INT 10Hn功能号:功能号:AH0EHn入口参数:入口参数:AL字符的字符的ASCII码码BL字符的颜色值(图形方式)字符的颜色值(图形方式)BH页号(字符方式)页号(字符方式)通常使通常使BX0n功能:将字符按原属性在光标处显功能:将字符按原属性在光标处显示,光标自动移到下一个字符位置示,光标自动移到下一个字符位置字符58、串输出的功能调用DOS功能调用功能调用INT 21Hn功能号:功能号:AH09Hn入口参数:入口参数:DS:DX欲显示字符串在主存中的首地址欲显示字符串在主存中的首地址字符串应以字符串应以$(24H)结束)结束n功能:在显示器输出指定的字符串功能:在显示器输出指定的字符串可以输出回车(可以输出回车(0DH)和换行()和换行(0AH)字符产生回车和换行的作用字符产生回车和换行的作用例例2.47:显示字符串:显示字符串string db Hello,Everybody !,string db Hello,Everybody !,0dh,0ah,0dh,0ah,$;在数据段定义要显示的字符串;在数据59、段定义要显示的字符串.mov ah,09hmov ah,09h;设置功能号:;设置功能号:ah09hah09hmov dx,offset stringmov dx,offset string;提供入口参数:;提供入口参数:dxdx字符串的偏移地址字符串的偏移地址int 21hint 21h;DOSDOS功能调用:显示功能调用:显示字符输入的功能调用DOS功能调用功能调用INT 21Hn功能号:功能号:AH01Hn出口参数:出口参数:AL字符的字符的ASCII码码n功能:获得按键的功能:获得按键的ASCII代码值代码值调用此功能时,若无键按下,则调用此功能时,若无键按下,则会一直等待,直到按键后才读取会一直等待,直到按键后才读取该键值该键值例例2.48:判断按键:判断按键getkey:getkey: mov ah,01hmov ah,01h;功能号:;功能号:ah01hah01hint 21hint 21h;功能调用;功能调用cmp al,Ycmp al,Y ;处理出口参数;处理出口参数alalje yeskeyje yeskey;是;是“Y”Y”cmp al,Ncmp al,Nje nokeyje nokey;是;是“N”}

我要回帖

更多关于 移位指令的用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信