新版汇编语言程序设计-钱晓捷02_第1页
新版汇编语言程序设计-钱晓捷02_第2页
新版汇编语言程序设计-钱晓捷02_第3页
新版汇编语言程序设计-钱晓捷02_第4页
新版汇编语言程序设计-钱晓捷02_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 2 章教学重点重点掌握常用指令功能及应用常用传送指令加减法指令逻辑运算和移位指令控制转移指令字符串输入输出功能调用什么是指令系统计算机的指令系统就是指该计算机能够执行的全部指令的集合每种计算机都有它支持的指令集合 16位8086指令系统是Intel 80 x86系列微处理器指令系统的根底Intel 80 x86系列微处理器指令系统:整数指令浮点指令多媒体指令8086指令系统概述Intel 8086指令系统共有117条根本指令可分成6个功能组 数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理机控制类指令如何学习学习指令的本卷须知指令的功能该指令能够实现何种操作

2、。通常指令助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式该指令中的操作数可以采用何种寻址方式指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响其他方面该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的存放器等汇编语言指令格式由4局部组成:标号: 指令助记符 目的操作数,源操作数 ; 注释 标号表示该指令在主存中的逻辑地址 每个指令助记符就代表一种指令 目的和源操作数表示参与操作的对象 注释是对该指令或程序段功能的说明教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键逐个展开指令2.1 数据传送类指令数据传送是计算机中最

3、根本、最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志存放器传送指令外,均不影响标志位重点掌握MOV XCHGPUSH POPLEA2.1.1 通用数据传送指令提供方便灵活的通用传送操作有3条指令MOVXCHGXLATMOVXCHGXLAT1. 传送指令MOVmove把一个字节或字的操作数从源地址传送至目的地址MOV reg/mem,imm;立即数送存放器或主存例题2.1MOV reg/mem/seg,reg;存放器送段存放器或主存例题2.2MOV reg/seg,mem;主存送段存放器例题2.3MOV reg/mem,seg;段存放器送存放器或主存

4、例题2.5例2.1:立即数传送mov al,4;al4,字节传送mov cx,0ffh;cx00ffh,字传送mov si,200h;si0200h,字传送mov byte ptr si,0ah;byte ptr 说明是字节操作mov word ptr si+2,0bh;word ptr 说明是字操作 注意立即数是字节量还是字量 明确指令是字节操作还是字操作MOV例2.2:存放器传送mov ax,bx;axbx,字传送mov ah,al;ahal,字节传送mov ds,ax;dsax,字传送mov bx,al;bxal,字节传送MOV例2.3:存储器传送mov al,bxmov dx,bp;d

5、xss:bpmov es,si;esds:si 不存在存储器向存储器的传送指令MOV例2.5:段存放器传送mov si,dsmov ax,es;axesmov ds,ax;dsaxes 对段存放器的操作有一些限制MOVMOV指令传送功能MOV并非任意传送立即数段寄存器CS DS ES SS通用寄存器AX BX CX DXBP SP SI DI存储器非法传送种种两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反两个操作数不能都是存储器传送指令很灵活,但主存之间的直接传送却不允许段存放器的操作有一些限制段存放器属专用存放器,对他们的操作能力有限例如例如例如两个操作数的类型要一致绝大

6、多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否那么为非法指令MOV AL,050AH;非法指令:050Ah为字,而AL为字节存放器有明确的字节或字类型,有存放器参与的指令其操作数类型就是存放器的类型对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型第 2 章两个操作数不能都是存储器8086指令系统不允许两个操作数都是存储单元除串操作指令,要实现这种传送,可通过存放器间接实现mov ax,buffer1;axbuffer1将buffer1内容送axmov buffer2,ax;buffer2ax;这里buffe

7、r1和buffer2是两个字变量;实际表示直接寻址方式第 2 章要小心段存放器的操作不允许立即数传送给段存放器MOV DS,100H;非法指令:立即数不能传送段存放器不允许直接改变CS值MOV CS,SI;不允许使用的指令不允许段存放器之间的直接数据传送MOV DS,ES;非法指令:不允许段存放器间传送第 2 章2. 交换指令XCHGexchange把两个地方的数据进行互换存放器与存放器之间对换数据存放器与存储器之间对换数据不能在存储器与存储器之间对换数据XCHG reg,reg/mem;reg reg/mem例题2.7例题2.6例2.6:存放器间交换mov ax,1234h;ax=1234h

8、mov bx,5678h;bx=5678hxchg ax,bx;ax=5678h,bx=1234hxchg ah,al;ax=7856hXCHG例2.7:存放器与存储器交换xchg ax,2000h;字交换;等同于 xchg 2000h,axxchg al,2000h ;字节交换;等同于 xchg 2000h,al XCHG换码指令执行前:主存建立一个字节量表格,含要转换成的目的代码表格首地址存放于BX,AL存放相对表格首的位移量换码指令执行后:将AL存放器的内容转换为目标代码3. 换码指令XLATtranslate将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给ALXLAT;al

9、ds:bx+al例题2.8例2.8:代码转换mov bx,100hmov al,03hxlat 换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式采用默认操作数XLAT2.1.2 堆栈操作指令堆栈:后进先出FILO,位于堆栈段;SS段存放器记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈指针存放器SP指定堆栈和队列堆栈:按照后进先出(LIFO)的原那么组织的存储器空间栈队列:按照先进先出(FIFO)的原那么组织的存储器空间堆LIFOFIFO第 2 章堆栈的操作堆栈只有两种根本操作:进栈和出栈,对应两条指令PUSH和POPWord 1Word 2Word 3Word 4

10、Word 5StackPUSHPOPPUSH;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部POP;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加21. 进栈指令PUSHpush axpush 2000hPUSH r16/m16/seg;SPSP2;SS:SPr16/m16/segWordStackPUSHSP-22. 出栈指令POPpop axpop 2000hPOP r16/m16/seg;r16/m16/segSS:SP;SPSP2WordStackPOPSP+2堆栈的特点堆栈操作的单位是字,进栈和出栈只对字量字量数据从栈顶压入和弹出时,都是低地址字节送低

11、字节,高地址字节送高字节堆栈操作遵循先进后出原那么,但可用存储器寻址方式随机存取堆栈中的数据堆栈常用来临时存放数据传递参数保存和恢复存放器例题2.11例2.11:现场保护恢复push ax;进入子程序后push bxpush ds.pop ds;返回主程序前pop bxpop ax2.1.3 标志传送指令标志存放器传送指令用来传送标志存放器FLAGS的内容标志位操作指令直接对CF、DF、IF标志进行复位或置位1. 标志存放器传送标志存放器传送指令用来传送标志存放器FLAGS的内容,方便进行对各个标志位的直接操作有2对4条指令低8位传送:LAHF和SAHF16位传送:PUSHF和POPF标志低字

12、节进出AH指令LAHF;AHFLAGS的低字节LAHF指令将标志存放器的低字节送存放器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意SAHF;FLAGS的低字节AHSAHF将AH存放器内容送FLAGS的低字节用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志标志存放器进出堆栈指令PUSHF;SPSP2;SS:SPFLAGSPUSHF指令将标志存放器的内容压入堆栈,同时栈顶指针SP减2POPF;FLAGSSS:SP;SPSP2POPF指令将栈顶字单元内容送标志存放器,同时栈顶指针SP加2例题2.12例2.12:置位

13、单步标志pushf;保存全部标志到堆栈pop ax;堆栈中取出全部标志or ax,0100h;设置D8=TF=1,;ax其他位不变push ax;将ax压入堆栈popf;FLAGSAX;将堆栈内容取到标志存放器2. 标志位操作标志位操作指令直接对CF、DF、IF标志进行复位或置位,常用于特定的情况对标志位进行设置的指令CLC STC CMCCLD STDCLI STI进位标志操作指令用于任意设置进位标志CLC;复位进位标志:CF0STC;置位进位标志:CF1CMC;求反进位标志:CFCF方向标志操作指令串操作指令中,需要使用CLD;复位方向标志:DF0STD;置位方向标志:DF1中断标志操作指

14、令在编写中断效劳程序时,需要控制可屏蔽中断的允许和禁止CLI;复位中断标志:DF0STI;置位中断标志:DF12.1.4 地址传送指令地址传送指令将存储器单元的逻辑地址送至指定的存放器有效地址传送指令 LEA指针传送指令 LDS和LES注意不是获取存储器单元的内容有效地址传送指令LEAload EA将存储器操作数的有效地址传送至指定的16位存放器中例题2.13LEA r16,mem;r16mem的有效地址EA例2.13:获取有效地址mov bx,0400hmov si,3chlea bx,bx+si+0f62h;BX0400h003ch0f62h139EH 获得主存单元的有效地址;不是物理地址

15、,也不是该单元的内容 可以实现计算功能LEA指针传送指令LDS r16,mem;r16mem,;DSmem+2LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS存放器LES r16,mem;r16mem,;ESmem+2LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES存放器例题2.14例2.14:地址指针传送mov word ptr 3060h,0100hmov word ptr 3062h,1450hles di,3060h;es=1450h,di=0100hlds si,3060h;ds=1450h,si=0100h mem指定主存的连续4个字节作为逻

16、辑地址32位的地址指针,送入DS:r16或ES:r162.1.5 输入输出指令8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口Port即I/O地址8086用于寻址外设端口的地址线为16条,端口最多为2166553664K个,端口号为0000HFFFFH每个端口用于传送一个字节的外设数据输入输出寻址方式8086的端口有64K个,无需分段,设计有两种寻址方式直接寻址:只用于寻址00HFFH前256个端口,操作数i8表示端口号间接寻址:可用于寻址全部64K个端口,DX存放器的值就是端口号大于FFH的端口只能采用间接寻址方式输入指令IN将外设数据传送给CPU内的AL/AXIN AL

17、,i8;字节输入:ALI/O端口i8直接寻址IN AL,DX;字节输入:ALI/O端口DX间接寻址IN AX,i8;字输入:AXI/O端口i8直接寻址IN AX,DX;字输入:AXI/O端口DX间接寻址例题2.15例2.15:输入字量;直接寻址,字节量输入in al,21hmov ah,alin al,20h;直接寻址,字量输入in ax,20h;间接寻址,字量输入mov dx,20hin ax,dxIN输出指令OUT将CPU内的AL/AX数据传送给外设OUT i8,AL;字节输出:I/O端口ALi8直接寻址OUT DX,AL;字节输出:I/O端口ALDX间接寻址OUT i8,AX;字输出:I

18、/O端口AXi8直接寻址OUT DX,AX;字输出:I/O端口AXDX间接寻址例题2.16例2.16:输出字节量;间接寻址,字节量输出mov dx,3fchmov al,80hout dx,alOUT2.2 算术运算类指令四那么运算是计算机经常进行的一种操作。算术运算指令实现二进制和十进制数据的四那么运算请注意算术运算类指令对标志的影响掌握:ADD/ADC/INC、SUB/SBB/DEC/ NEG/CMP熟悉:MUL/IMUL、DIV/IDIV理解:CBW/CWD、DAA/DAS、 AAA/ AAS/AAM/AAD加法指令ADDADD指令将源与目的操作数相加,结果送到目的操作数ADD指令按状态

19、标志的定义相应设置ADD reg,imm/reg/mem;regregimm/reg/memADD mem,imm/reg;memmemimm/reg例题2.17a例2.17a:加法运算mov al,0fbh;al=0fbhadd al,07h;al=02hmov word ptr 200h,4652h;200h=4652hmov bx,1feh;bx=1fehadd al,bl;al=00hadd word ptr bx+2,0f0f0h;200h=3742hADD带进位加法指令ADCADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数ADC指令按状态标志的定义相应设置AD

20、C指令主要与ADD配合,实现多精度加法运算ADC reg,imm/reg/mem;regregimm/reg/memCFADC mem,imm/reg;memmemimm/regCF例题2.17b例2.17b:双字加法mov ax,4652h;ax=4652hadd ax,0f0f0h;ax=3742h,CF=1mov dx,0234h;dx=0234hadc dx,0f0f0h;dx=f325h,CF=0;DX.AX0234 4652HF0F0 F0F0HF325 3742HADC增量指令INCincrementINC指令对操作数加1增量INC指令不影响进位CF标志,按定义设置其他状态标志I

21、NC reg/mem;reg/memreg/mem1inc bxinc byte ptr bx减法指令SUBsubtractSUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志SUB reg,imm/reg/mem;regregimm/reg/memSUB mem,imm/reg;memmemimm/reg例题2.18a例2.18a:减法运算mov al,0fbh;al=0fbhsub al,07h;al=0f4h,CF0mov word ptr 200h,4652h;200h=4652hmov bx,1feh;bx=1fehsub al,bl;al=0f6

22、hsub word ptr bx+2,0f0f0h;200h=5562h,CF1SUB带借位减法指令SBBSBB指令将目的操作数减去源操作数,再减去借位CF进位,结果送到目的操作数。SBB指令按照定义相应设置状态标志SBB指令主要与SUB配合,实现多精度减法运算SBB reg,imm/reg/mem;regregimm/reg/memCFSBB mem,imm/reg;memmemimm/regCF例题2.18b例2.18b:双字减法mov ax,4652h;ax=4652hsub ax,0f0f0h;ax=5562h,CF=1mov dx,0234h;dx=0234hsbb dx,0f0f0

23、h;dx=1143h,CF=1;DX.AX0234 4652HF0F0 F0F0H1143 5562HSBB减量指令DECdecrementDEC指令对操作数减1减量DEC指令不影响进位CF标志,按定义设置其他状态标志DEC reg/mem;reg/memreg/mem1dec cxdec word ptr si INC指令和DEC指令都是单操作数指令 主要用于对计数器和地址指针的调整求补指令NEGnegativeNEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样NEG reg/mem

24、;reg/mem0reg/mem例题2.19例2.19:求补运算mov ax,0ff64hneg al;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1sub al,9dh;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1neg ax;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1dec al;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1neg ax;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0NEG比较指令CMPcompareCMP指令将目的操作数减去源操作数,按照定义相应设置状态标志CMP指

25、令执行的功能与SUB指令,但结果不回送目的操作数CMP reg,imm/reg/mem;regimm/reg/memCMP mem,imm/reg;memimm/reg例题2.20例2.20:比较AL与100cmp al,100;al-100jb below;al100,跳转到below执行sub al,100;al100,alal-100inc ah;ahah+1below:. 执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等CMP2.2.3 乘法指令MUL r8/m8;无符号字节乘法;AXALr8/m8MUL r16/m16;无符号字乘法;DX.AXAXr16/m16IMUL

26、r8/m8;有符号字节乘法;AXALr8/m8IMUL r16/m16;有符号字乘法;DX.AXAXr16/m16例题2.21说明乘法指令的功能乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX乘法指令利用OF和CF判断乘积的高一半是否具有有效数值第 2 章乘法指令对标志的影响乘法指令如下影响OF和CF标志:MUL指令假设乘积的高一半AH或DX为0,那么OF=CF=0;否那么OF=CF=1IMUL指令假设乘积的高一

27、半是低一半的符号扩展,那么OF=CF=0;否那么均为1乘法指令对其他状态标志没有定义 对标志没有定义:指令执行后这些标志是任意的、不可预测就是谁也不知道是0还是1 对标志没有影响:指令执行不改变标志状态第 2 章例2.21:乘法运算mov al,0b4h;al=b4h=180mov bl,11h;bl=11h=17mul bl;ax=Obf4h=3060;OF=CF=1,AX高8位不为0mov al,0b4h;al=b4h=76mov bl,11h;bl=11h=17imul bl;ax=faf4h=1292;OF=CF=1,AX高8位含有效数字2.2.4 除法指令DIV r8/m8;无符号字

28、节除法:ALAXr8/m8的商,AhAXr8/m8的余数DIV r16/m16;无符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数IDIV r8/m8;有符号字节除法:ALAXr8/m8的商,AhAXr8/m8的余数IDIV r16/m16;有符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数例题2.22说明除法指令的功能除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存

29、入AX,16位余数存入DX除法指令对标志没有定义除法指令会产生结果溢出第 2 章除法错中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的存放器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断除法错中断对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内第 2 章例2.22:除法运算mov ax,0400h;ax=400h=1024mov bl,0b4h;bl=b4h=180div bl;商al05h5;余数ah

30、7ch124mov ax,0400h;ax=400h=1024mov bl,0b4h;bl=b4h=76idiv bl;商alf3h13;余数ah24h362.2.5 符号扩展指令CBW;AL的符号扩展至AH;如AL的最高有效位是0,那么AH00;AL的最高有效位为1,那么AHFFH。AL不变CWD;AX的符号扩展至DX;如AX的最高有效位是0,那么DX00;AX的最高有效位为1,那么DXFFFFH。AX不变什么是符号扩展符号扩展指令常用于获得倍长的数据例题2.23例题2.24符号扩展的概念符号扩展是指用一个操作数的符号位即最高位形成另一个操作数,后一个操作数的各位是全0正数或全1负数。符号扩

31、展不改变数据大小对于数据64H表示数据100,其最高位D7为0,符号扩展后高8位都是0,成为0064H仍表示数据100对于数据FF00H表示有符号数-256,其最高位D15为1,符号扩展后高16位都是1,成为FFFFFF00H仍表示有符号数-256第 2 章例2.23:符号扩展mov al,80h;al=80hcbw;ax=ff80hadd al,255;al=7fhcbw;ax=007fh例2.24:AXBXcwd;DX.AXAXidiv bx;AXDX.AXBX 对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数 对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这

32、就是零位扩展2.2.6 十进制调整指令压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位09,高4位任意,通常默认为0十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果分成压缩BCD码和非压缩BCD码调整BCD码Binary Coded Decimal二进制编码的十进制数:一位十进制数用4位二进制编码来表示8086支持压缩BCD码和非压缩BCD码的调整运算真值864二进制编码08H40H压缩BCD码08H64H非压缩BCD码08H060

33、4H压缩BCD码加、减调整指令ADD AL,i8/r8/m8ADC AL,i8/r8/m8DAA;AL将AL的加和调整为压缩BCD码SUB AL,i8/r8/m8SBB AL,i8/r8/m8DAS;AL将AL的减差调整为压缩BCD码使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态例题2.25a例题2.25b例题2.26例2.25a:压缩BCD加法mov al,68h;al=68h,压缩BCD码表示真值68mov bl,28h;bl=28h,压缩BCD码表示真值28add

34、 al,bl;二进制加法:al=68h+28h=90hdaa;十进制调整:al=96h;实现压缩BCD码加法:682896例2.25b:压缩BCD减法mov al,68h;al=68h,压缩BCD码表示真值68mov bl,28h;bl=28h,压缩BCD码表示真值28sub al,bl;二进制减法:al=68h-28h=40hdas;十进制调整:al=40h;实现压缩BCD码加法:68-2840例2.26:压缩BCD减法mov ax,1234hmov bx,4612hsub al,bldas;34-1222,CF0 xchg al,ahsbb al,bhdas;12-4666,CF=1xch

35、g al,ah;1 123446126622非压缩BCD码加、减调整指令ADD AL,i8/r8/m8ADC AL,i8/r8/m8AAA;AL将AL的加和调整为非压缩BCD码;AHAH调整的进位SUB AL,i8/r8/m8SBB AL,i8/r8/m8AAS;AL将AL的减差调整为非压缩BCD码;AHAH调整的借位使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令AAA和AAS指令在调整中产生了进位或借位,那么AH要加上进位或减去借位,同时CF=AF=1,否那么CF=AF=0;它们对其他标志无定义例题2.27a例题2.27b例2.27a:非压缩BCD加mov ax,060

36、8h;ax=0608h,非压缩BCD码表示真值68mov bl,09h;bl=09h,非压缩BCD码表示真值9add al,bl;二进制加法:al=08h+09h=11haaa;十进制调整:ax=0707h;实现非压缩BCD码加法:68977例2.27b:非压缩BCD减mov ax,0608h;ax=0608h,非压缩BCD码表示真值68mov bl,09h;bl=09h,非压缩BCD码表示真值9sub al,bl;二进制减法:al=08h-09h=ffhaas;十进制调整:ax=0509h;实现非压缩BCD码减法:68-959非压缩BCD码乘、除调整指令MUL r8/m8AAM;AX将AX的

37、乘积调整为非压缩BCD码AAD;AX将AX中非压缩BCD码扩展成二进制数DIV r8/m8AAM指令跟在字节乘MUL之后,将乘积调整为非压缩BCD码AAD指令跟在字节除DIV之前,先将非压缩BCD码的被除数调整为二进制数AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、CF和AF无定义例题2.27c例题2.27d例2.27c:非压缩BCD乘mov ax,0608h;ax=0608h,非压缩BCD码表示真值68mov bl,09h;bl=09h,非压缩BCD码表示真值9mul bl;二进制乘法:al=08h09h=0048haam;十进制调整:ax=0702h;实现非压缩BCD码乘法:8

38、972例2.27d:非压缩BCD除mov ax,0608h;ax=0608h,非压缩BCD码表示真值68mov bl,09h;bl=09h,非压缩BCD码表示真值9aam;二进制扩展:ax=680044hdiv bl;除法运算:商al=07h,余数ah=05h;实现非压缩BCD码初法:6897余5习题2.9设X、Y、Z、V均为16位带符号数,分别存放在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?VZYX65F302 0024E00500习题2.9:算术运算1mov ax,Ximul Y;DX.AXXYmov cx,axmov bx,dx;BX.CXXYm

39、ov ax,Zcwdadd cx,axadc bx,dx;BX.CXXYZ习题2.9:算术运算2sub cx,540sbb bx,0;BX.CXXYZ540mov ax,Vcwdsub ax,cxsbb dx,bx;DX.AXVXYZ540idiv X;DX.AXVXYZ540X教学提示在正确理解每条指令的功能根底上,可以阅读和编写有实际意义的程序段多多阅读程序段2.3 位操作类指令位操作类指令以二进制位为根本单位进行数据的操作这是一类常用的指令,都应该掌握注意这些指令对标志位的影响1、逻辑运算指令AND OR XOR NOT TEST2、移位指令SHL SHR SAR3、循环移位指令ROL

40、ROR RCL RCR逻辑与指令AND对两个操作数执行逻辑与运算,结果送到目的操作数AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义AND reg,imm/reg/mem;regregimm/reg/memAND mem,imm/reg;memmemimm/reg 只有相“与的两位都是1,结果才是1;否那么,“与的结果为0逻辑或指令OR对两个操作数执行逻辑或运算,结果送到目的操作数OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义OR reg,imm/reg/mem;regregimm/reg/memOR mem,imm/

41、reg;memmemimm/reg 只要相“或的两位有一位是1,结果就是1;否那么,结果为0逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送到目的操作数XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义XOR reg,imm/reg/mem;regregimm/reg/memXOR mem,imm/reg;memmemimm/reg 只有相“异或的两位不相同,结果才是1;否那么,结果为0逻辑非指令NOT对一个操作数执行逻辑非运算NOT指令是一个单操作数指令NOT指令不影响标志位NOT reg/mem;reg/memreg/mem 按位取反,原来是“0的

42、位变为“1;原来是“1的位变为“0例题:逻辑运算mov al,45h;逻辑与 al=01hand al,31h;CF=OF=0,SF=0、ZF=0、PF=0mov al,45h;逻辑或 al=75hor al,31h;CF=OF=0,SF=0、ZF=0、PF=0mov al,45h;逻辑异或 al=74hxor al,31h;CF=OF=0,SF=0、ZF=0、PF=1mov al,45h;逻辑非 al=0bahnot al;标志不变例题:逻辑指令应用;AND指令可用于复位某些位同0相与,不影响其他位:将BL中D3和D0位清0,其他位不变and bl,11110110B;OR指令可用于置位某些

43、位同1相或,不影响其他位:将BL中D3和D0位置1,其他位不变or bl, 00001001B;XOR指令可用于求反某些位同1相异或,不影响其他位:将BL中D3和D0位求反,其他不变xor bl, 00001001B测试指令TEST对两个操作数执行逻辑与运算,结果不回送到目的操作数TEST指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义TEST reg,imm/reg/mem;regimm/reg/memTEST mem,imm/reg;memimm/reg只有相“与的两位都是1,结果才是1;否那么,“与的结果为0例2.32:测试为0或1test al,01h;

44、测试AL的最低位D0jnz there;标志ZF=0,即D0=1;那么程序转移到there.;否那么ZF=1,即D0=0,顺序执行there: . TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况TEST移位指令shift将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作SHL reg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0SHR reg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0SAL reg/mem,1/CL;算术左移,最高位进入CF,最低位补0SAR reg/mem,1/CL;算术右移,最低位进入CF,最高位不变SAL

45、与SHL相同移位指令的操作数移位指令的第一个操作数是指定的被移位的操作数,可以是存放器或存储单元后一个操作数表示移位位数,该操作数为1,表示移动一位;当移位位数大于1时,那么用CL存放器值表示,该操作数表达为CL移位指令对标志的影响按照移入的位设置进位标志CF根据移位后的结果影响SF、ZF、PF对AF没有定义如果进行一位移动,那么按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同有变化,那么OF = 1;否那么OF = 0。当移位次数大于1时,OF不确定例2.33:移位指令mov cl,4mov al,0f0h;al=f0hshl al,1

46、;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shr al,1;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1sar al,1;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0sar al,cl;al=03h;CF=1,SF=0、ZF=0、PF=1例2.34:移位实现乘mov si,axshl si,1;si2axadd si,ax;si3axmov dx,bxmov cl,03hshl dx,cl;dx8bxsub dx,bx;dx7bxadd dx,si;dx7bx3ax 逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以2循环

47、移位指令rotate将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作ROL reg/mem,1/CL ;不带进位循环左移ROR reg/mem,1/CL ;不带进位循环右移RCL reg/mem,1/CL ;带进位循环左移RCR reg/mem,1/CL ;带进位循环右移循环移位指令对标志的影响按照指令功能设置进位标志CF不影响SF、ZF、PF、AF如果进行一位移动,那么按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同有变化,那么OF = 1;否那么OF = 0。当移位次数大于1时,OF不确定例2.

48、35:32位数移位;将DX.AX中32位数值左移一位shl ax,1rcl dx,1DXAXCF0例2.36:位传送;把AL最低位送BL最低位,保持AL不变ror bl,1ror al,1rcl bl,1rol al,1AL、BLCFBLCFALCFAL之D0例2.37:BCD码合并;AH.AL分别存放着非压缩BCD码的两位;将它们合并成为一个压缩BCD码存ALand ax,0f0fh;保证高4位为0mov cl,4rol ah,cl;也可以用shl ah,cladd al,ah;也可以用or al,ah2.4 控制转移类指令控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的

49、常用指令重点掌握:JMP/Jcc/LOOP CALL/RETINT n/IRET 常用系统功能调用一般了解: LOOPZ/LOOPNZ INTO 控制转移类指令通过改变IP和CS值,实现程序执行顺序的改变2.4.1 无条件转移指令只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行指令操作数label是要转移到的目标地址目的地址、转移地址JMP指令分成4种类型: 段内转移、相对寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址JMP label;程序转向label标号指定的地址目标地址的寻址方式相对寻址方式相对寻址方式以当前IP为基地址,加上位移量构成

50、目标地址直接寻址方式转移地址象立即数一样,直接在指令的机器代码中间接寻址方式转移地址在存放器或主存单元中用标号表达用存放器或存储器操作数表达用标号表达目标地址的范围:段内段内转移近转移near在当前代码段64KB范围内转移 32KB范围不需要更改CS段地址,只要改变IP偏移地址段内转移短转移short转移范围可以用一个字节表达,在段内128127范围的转移代码段代码段目标地址的范围:段间段间转移远转移far从当前代码段跳转到另一个代码段,可以在1MB范围更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段 实际编程时,MASM汇编程序会根据目

51、标地址的距离,自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制段内转移、相对寻址JMP label;IPIP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负again:dec cx;标号again的指令jmp again;转移到again处继续执行jmp output;转向outputoutput:mov result,al;标号output的指令段内转移、间接寻址JMP r16/m16 ;IPr16/m16将一个16位存放器或主存字单

52、元内容送入IP存放器,作为新的指令指针,但不修改CS存放器的内容jmp ax;IPAXjmp word ptr 2000h;IP2000h段间转移、直接寻址JMP far ptr label;IPlabel的偏移地址;CSlabel的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行jmp far ptr otherseg;远转移到代码段2的otherseg段间转移、间接寻址JMP far ptr mem;IPmem,CSmem+2用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP存放器

53、,高位字送CS存放器mov word ptr bx,0mov word ptr bx+2,1500hJMP far ptr bx ;转移到1500h:02.4.2 条件转移指令指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,那么程序将顺序执行下一条指令操作数label是采用相对寻址方式的短转移标号表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移距当前IP地址128127个单元的范围之内Jcc label ;条件满足,发生转移:IPIP8位位移量 ;条件不满足,顺序执行Jcc指令的分类Jcc指令不影响标志,但要利用标志表2.2。根据利用

54、的标志位不同,16条指令分成3种情况:1. 判断单个标志位状态2. 比较无符号数上下3. 比较有符号数大小转移条件cc:单个标志状态JZ/JEZF=1Jump if Zero/EqualJNZ/JNEZF=0Jump if Not Zero/Not EqualJSSF=1Jump if SignJNSSF=0Jump if Not SignJP/JPEPF=1Jump if Parity/Parity EvenJNP/JPOPF=0Jump if Not Parity/Parity OddJOOF=1Jump if OverflowJNOOF=0Jump if Not OverflowJCCF

55、=1Jump if CarryJNCCF=0Jump if Not Carry第 2 章 采用多个助记符,只是为了方便记忆和使用转移条件cc:两数大小关系JB/JNAECF=1Jump if Below/Not Above or EqualJNB/JAECF=0Jump if Not Below/Above or EqualJBE/JNACF=1或ZF=1Jump if Below/Not AboveJNBE/JACF=0且ZF=0Jump if Not Below or Equal/AboveJL/JNGESFOFJump if Less/Not Greater or EqualJNL/JG

56、ESF=OFJump if Not Less/Greater or EqualJLE/JNGZFOF或ZF=1Jump if Less or Equal/Not GreaterJNLE/JGSF=OF且ZF=0Jump if Not Less or Equal/Greater第 2 章判断单个标志位状态这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零或相等JS和JNS:利用符号标志SF,判断结果是正是负JO和JNO:利用溢出标志OF,判断结果是否产生溢出JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1的个数是偶是奇JC/JB/JNAE和

57、JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位例题2.38例题2.39例题2.40例题2.41例题2.42例2.38:JZ/JNZ指令test al,80h;测试最高位jz next0;D70ZF1,转移mov ah,0ffh;D71,顺序执行jmp done;无条件转向next0:mov ah,0done:.test al,80h;测试最高位jnz next1;D71ZF0,转移mov ah,0;D70,顺序执行jmp done;无条件转向next1:mov ah,0ffhdone:.例2.39:JS/JNS指令;计算|XY|绝对值;X和Y为存放于X单元和Y单元的16位操作

58、数;结果存入resultmov ax,Xsub ax,Yjns nonnegneg ax;neg是求补指令nonneg:mov result,ax例2.40:JO/JNO指令;计算XY;X和Y为存放于X单元和Y单元的16位操作数;假设溢出,那么转移到overflow处理mov ax,Xsub ax,Yjo overflow.;无溢出,结果正确overflow:.;有溢出处理例2.41:JP/JNP指令;设字符的ASCII码在AL存放器中;将字符加上奇校验位;在字符ASCII码中为“1的个数已为奇数时;那么令其最高位为“0;否那么令最高位为“1and al,7fh;最高位置“0,同时判断“1的个

59、数jnp next;个数已为奇数,那么转向nextor al,80h;否那么,最高位置“1next:.例2.42:JC/JNC指令;记录BX中1的个数xor al,al;AL0,CF0again:test bx,0ffffh ;等价于 cmp bx,0je nextshl bx,1jnc againinc aljmp againnext:.;AL保存1的个数另一种做法记录BX中“1的个数xor al,al;AL0,CF0again:cmp bx,0jz nextshl bx,1;也可使用 shr bx,1adc al,0jmp againnext:.;AL保存1的个数比较无符号数上下无符号数的

60、大小用高Above低Below表示利用CF确定上下、利用ZF标志确定相等Equal两数的上下分成4种关系: 低于不高于等于:JBJNAE 不低于高于等于:JNBJAE 低于等于不高于:JBEJNA 不低于等于高于:JNBEJA 例2.43a:比较无符号数cmp ax,bx;比较ax和bxjnb next;假设axbx,转移xchg ax,bx;假设axbx,交换next:.结果:AX保存较大的无符号数比较有符号数大小有符号数的大Greater小Less需要组合OF、SF标志,并利用ZF标志确定相等Equal两数的大小分成4种关系: 小于不大于等于:JLJNGE 不小于大于等于:JNLJGE 小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论