第8章-汇编语言程序设计(第4版)课件

上传人:无*** 文档编号:241680160 上传时间:2024-07-15 格式:PPT 页数:76 大小:1.61MB
返回 下载 相关 举报
第8章-汇编语言程序设计(第4版)课件_第1页
第1页 / 共76页
第8章-汇编语言程序设计(第4版)课件_第2页
第2页 / 共76页
第8章-汇编语言程序设计(第4版)课件_第3页
第3页 / 共76页
点击查看更多>>
资源描述
第8章汇编语言程序设计8.18.1 顺序程序设计顺序程序设计8.28.2 分支程序设计分支程序设计8.38.3 循环程序设计循环程序设计8.48.4 子程序设计子程序设计(自学)(自学)天天酬酬勤勤道道 顺序程序顺序程序是最简单的程序,它的执行是最简单的程序,它的执行顺序和程序中指令的顺序完全一致。顺序和程序中指令的顺序完全一致。8.1 8.1 8.1 8.1 顺序程序设计顺序程序设计顺序程序设计顺序程序设计(1)格式:)格式:MUL source IMUL source ;符号整数乘法符号整数乘法8.1.1 8.1.1 8.1.1 8.1.1 乘除法指令乘除法指令乘除法指令乘除法指令1.乘法指令MUL和符号整数乘法指令IMULl源操作数源操作数 source source可以是可以是字节字节、字或、字或双字双字,可为,可为REGREG或或MEMMEM,不能为不能为立即数立即数l目的操作数是目的操作数是ALAL、AXAX或或EAXEAX,视,视sourcesource的类型属性决定是的类型属性决定是ALAL、AXAX还是还是EAXEAXl在乘法指令之前必须将目的操作数送在乘法指令之前必须将目的操作数送AL(AL(字节乘字节乘)或或AX(AX(字字乘乘)或或EAXEAX(双字乘)(双字乘)(2 2)操作:)操作:l8 8位或位或1616位:位:ALAL或或AXAX乘以乘以sourcesource,乘积放回到,乘积放回到AXAX或或DXDX和和AXAX,如下图所示:,如下图所示:ALsourc8AXAXsourc16AXDXl3232位:位:EAXEAX乘以乘以sourcesource,乘积放回到,乘积放回到EDXEDX和和EAXEAX,如下,如下图所示:图所示:EAXsourc32EAXEDXl乘法指令对乘法指令对CFCF和和OFOF以外的状态标志位无定义。以外的状态标志位无定义。l对于对于MULMUL指令,如果乘积的高一半为指令,如果乘积的高一半为0 0,则,则 CF CF和和OFOF均为均为0,;0,;否则,否则,CFCF和和OFOF均为均为1 1。l对于对于IMULIMUL指令,如果乘积的高一半是低一半的指令,如果乘积的高一半是低一半的符号扩展,则符号扩展,则CFCF和和OFOF均为均为0,;0,;否则,否则,CFCF和和OFOF均均为为1 1。l可用乘法运算将可用乘法运算将BCDBCD数转换为二进制数数转换为二进制数(3 3)对状态标志位的影响)对状态标志位的影响(1)格式:)格式:DIV source IDIV source ;符号整数除法符号整数除法l源操作数源操作数source可以是字节、字或双字,可为可以是字节、字或双字,可为REG或或MEM,不能为立即数不能为立即数l目的操作数是目的操作数是AX或或DX和和AX或或EDX和和EAXl所有标志位为任意值所有标志位为任意值2.除法指令DIV和符号整数除法指令IDIV(2 2)操作:)操作:8 8位或位或1616位除法指令所执行的操作如下图所示位除法指令所执行的操作如下图所示ALsourc8AXAXsourc16AXDXAHDX3232位除法指令所执行的操作如下图所示位除法指令所执行的操作如下图所示EAXsourc32EAXEDXEDXl可用除法运算(除可用除法运算(除1010取余)将二进制数转换为取余)将二进制数转换为BCDBCD数数3.扩展指令u要把一个要把一个8 8位二进制数除以另一个位二进制数除以另一个8 8位二进制数位二进制数,要有一个要有一个1616位二进制数在位二进制数在AXAX中,所以做中,所以做8 8位除以位除以8 8位的除法前先要把位的除法前先要把8 8位被除数扩展为位被除数扩展为1616位。位。u同样做同样做1616位除以位除以1616位的除法前要把位的除法前要把1616位被除数扩位被除数扩展为展为3232位位,做做3232位除以位除以3232位的除法前要把位的除法前要把3232位被位被除数扩展为除数扩展为6464位。位。u这种扩展对于无符号数除法只需将这种扩展对于无符号数除法只需将AHAH或或DXDX或或EDXEDX清清0 0,而对符号整数除法则要通过扩展符号位来,而对符号整数除法则要通过扩展符号位来把被除数扩展。把被除数扩展。l指令都隐含操作数指令都隐含操作数l在做在做8 8位除以位除以8 8位、位、1616位除以位除以1616位、位、32 32位除以位除以3232位的符位的符号整数除法之前,应先扩展号整数除法之前,应先扩展ALAL或或AXAX或或EAXEAX中的被除数。中的被除数。l扩展指令和符号整数除法仅对补码数适用。扩展指令和符号整数除法仅对补码数适用。l不影响标志位不影响标志位格式:格式:CBWCBW ;AL;AL的最高位的最高位AHAH CWDCWD ;AX;AX的最高位的最高位DXDX CWDECWDE ;AX;AX的最高位的最高位EAXEAX的高的高1616位位 CDQCDQ ;EAX;EAX的最高位的最高位EDXEDX如:有一符号字数组变量如:有一符号字数组变量ARRAYARRAY,第,第1 1个字是被除数,第个字是被除数,第2 2个个字是除数,接着存放商和余数,其程序段为:字是除数,接着存放商和余数,其程序段为:MOV SIMOV SI,OFFSET ARRAYOFFSET ARRAYMOV AXMOV AX,SISICWDCWDIDIV WORD PTR IDIV WORD PTR SI+2SI+2MOV MOV SI+4SI+4,AXAXMOV MOV SI+6SI+6,DXDX;设置指针设置指针;将被除数送入将被除数送入AXAX;将将AXAX中的符号位扩展到中的符号位扩展到DXDX;进行除法运算进行除法运算;存商存商;存余数存余数二进制编码的十进制数二进制编码的十进制数BCDBCD码码Binary-Coded Decimal)n用二进制数表示一位十进制数。有两种表示法:用二进制数表示一位十进制数。有两种表示法:压缩压缩BCDBCD码和非压缩码和非压缩BCDBCD码。码。n压缩压缩BCDBCD码的每一位用码的每一位用4 4位二进制表示,位二进制表示,0000-0000-10011001表示表示0-90-9,一个字节表示两位十进制数。,一个字节表示两位十进制数。n非压缩非压缩BCDBCD码用一个字节表示一位十进制数,码用一个字节表示一位十进制数,高高4 4位总是位总是00000000,低,低4 4位的位的0000-10010000-1001表示表示0-90-9。十十进制数制数8421码5421码2421码余余3码000000000000000111000100010001010020010001000100101300110011001101104010001000100011150101100010111000601101001110010017011110101101101081000101111101011910011100111111008.1.2 BCD8.1.2 BCD8.1.2 BCD8.1.2 BCD数调整指令数调整指令数调整指令数调整指令用二进制数算术运算指令对用二进制数算术运算指令对BCDBCD数进行运算,会得到一数进行运算,会得到一个非个非BCDBCD数或不正确的数或不正确的BCDBCD数。如:数。如:0000 0011B+0000 1001B=0000 1100B0000 0011B+0000 1001B=0000 1100B 0000 1001B+0000 0111B=0001 0000B 0000 1001B+0000 0111B=0001 0000B第一个结果是非第一个结果是非BCDBCD数数;第二个结果是不正确的第二个结果是不正确的BCDBCD数。数。若再加上若再加上6 6,就可以得到正确的,就可以得到正确的BCDBCD数:数:0000 1100B+0000 0110B=0001 0010B0000 1100B+0000 0110B=0001 0010B 0001 0000B+0000 0110B=0001 0110B 0001 0000B+0000 0110B=0001 0110B对对BCDBCD数使用二进制数算术运算指令进行运算,然后执数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理行一条专用调整指令来处理BCDBCD数的结果。数的结果。1.BCD数加法调整指令DAA和AAA格式:格式:DAA功能:功能:将将ALAL中的和调整为正确的压缩中的和调整为正确的压缩BCDBCD数数调整规则调整规则:(AL:(AL0FH)90FH)9或或AF=1AF=1,则,则ALAL加加6;6;(AL(AL0F0H)90H0F0H)90H或或CF=1,CF=1,则则ALAL加加60H.60H.(1 1)压缩)压缩BCDBCD数加法调整数加法调整 注:注:l该指令操作数隐含为该指令操作数隐含为AL,AL,即只能对即只能对ALAL中的操作数据中的操作数据进行调整进行调整l对结果调整时要用到对结果调整时要用到CFCF和和AFAF两个标志位,所以调两个标志位,所以调整指令应紧跟整指令应紧跟BCDBCD数加法指令数加法指令lDAADAA指令对指令对OFOF未定义,影响其余标志未定义,影响其余标志如如:MOV AX:MOV AX,3456H3456H ADD AL ADD AL,AH;ALAH;AL8AH,AF8AH,AF0,CF0,CF0 0 DAA ;AL DAA ;AL90H90H 0011 0100 0101 0110 1000 1010 0110 1001 0000 例例1 1 求两个字变量求两个字变量W1W1和和W2W2中压缩中压缩BCDBCD数之和,存数之和,存入字节变量入字节变量SUMSUM中。中。(完整程序见完整程序见P196P196【例例8.18.1】)如:如:8931+5678=14609 8931+5678=14609,程序段如下:,程序段如下:W1 DW 8931HW1 DW 8931HW2 DW 5678HW2 DW 5678HSUM DB 3 DUP(0)SUM DB 3 DUP(0)MOV AL,BYTE PTR W1 MOV AL,BYTE PTR W1 ;AL;AL31H31H ADD ADD AL,BYTE PTR W2AL,BYTE PTR W2 ;AL;ALA9H,CF=0,AF=0A9H,CF=0,AF=0 DAA DAA ;AL;AL09H,CF=109H,CF=1 MOV SUM,AL MOV SUM,AL ;存个位和十位存个位和十位 MOV AL,BYTE PTR W1+1 MOV AL,BYTE PTR W1+1 ;AL;AL89H89H ADC ADC AL,BYTE PTR W2+1 AL,BYTE PTR W2+1 ;AL;ALE0H,CF=0,AF=1E0H,CF=0,AF=1 DAA DAA ;AL;AL46H,CF=146H,CF=1 MOV SUM+1,AL MOV SUM+1,AL ;存百位和千位存百位和千位 ADC SUM+2,0 ADC SUM+2,0 ;处理向万位的进位处理向万位的进位格式:格式:AAA功能:将功能:将ALAL中的和调整为正确的非压缩中的和调整为正确的非压缩BCDBCD数送数送AXAX调整规则调整规则:(AL(AL0FH)90FH)9或或AF=1,AF=1,则则 (AL+6)(AL+6)0FHAL,AH+1AH;0FHAL,AH+1AH;否则,否则,ALAL0FH AL 0FH AL,AHAH不变不变.(2 2)非压缩)非压缩BCDBCD数加法调整数加法调整注:注:l同同DAADAA指令,指令,AAAAAA指令的操作数也隐含为指令的操作数也隐含为AL,AL,且要紧且要紧跟加法指令跟加法指令lAAAAAA调整后的存放规律:个位数送调整后的存放规律:个位数送AL,AL,十位数十位数(即进即进位位)加到加到AHAH中,中,故执行该指令前应注意故执行该指令前应注意AHAH是否清是否清0 0。如:将两个如:将两个BCDBCD数(数(5 5和和9 9)的)的ASCIIASCII码相加,得到和的码相加,得到和的ASCIIASCII码:码:MOV AL,35HMOV AL,35H ;5 5 ADD AL,39HADD AL,39H ;9 9,AL=6EH,AL=6EH MOV AH,0MOV AH,0 AAA AAA ;AX=0104H ;AX=0104H OR AX,3030HOR AX,3030H ;AX=3134H ;AX=3134H 即即1414 例例2 2 求两个字变量求两个字变量W1W1和和W2W2中非压缩中非压缩BCDBCD数之和,数之和,存入字节变量存入字节变量SUMSUM中。中。(自学,完整程序见自学,完整程序见P197P197【例例8.28.2】)如:如:89+67=15689+67=156,程序段如下:,程序段如下:W1 DW 0809HW1 DW 0809HW2 DW 0607HW2 DW 0607HSUM DB 3 DUP(0)SUM DB 3 DUP(0)MOV AX,W1 MOV AX,W1 ;AX;AX0809H0809H ADD AL,BYTE PTR W2 ADD AL,BYTE PTR W2 ;AL;AL10H10H,AF=1AF=1 AAA AAA ;AX;AX0906H0906H MOV SUM,AL MOV SUM,AL ;存个位存个位 MOV AL,AH MOV AL,AH ADD ADD AL,BYTE PTR W2+1AL,BYTE PTR W2+1 ;AL;AL0FH0FH,AF=0AF=0 MOV AH,0 MOV AH,0 AAA AAA ;AL;AL05H05H,AH=01HAH=01H MOV WORD PTR SUM+1,AX MOV WORD PTR SUM+1,AX ;存十位和百位存十位和百位19格式:格式:DASDAS功能:功能:将将ALAL中的差调整为正确的压缩中的差调整为正确的压缩BCDBCD数数调整规则调整规则:(AL:(AL0FH)90FH)9或或AF=1AF=1,则,则ALAL减减6;6;(AL(AL0F0H)90H0F0H)90H或或CF=1,CF=1,则则ALAL减减60H.60H.如:如:MOV AXMOV AX,5634H5634H SUB AL SUB AL,AHAH ;AL=DEH;AL=DEH,有借位,有借位 DAS DAS ;AL=78H;AL=78H,保持借位,即,保持借位,即134-56134-562.BCD数减法调整指令DAS和AAS(1 1)压缩)压缩BCDBCD数减法调整数减法调整格式:格式:AASAAS功能:将功能:将ALAL中的差调整为正确的非压缩中的差调整为正确的非压缩BCDBCD数送数送AXAX调整规则调整规则:(AL(AL0FH)90FH)9或或AF=1,AF=1,则则 (AL-6)(AL-6)0FHAL,AH-1AH;0FHAL,AH-1AH;否则,否则,ALAL0FH AL 0FH AL,AHAH不变不变.如:如:MOV AXMOV AX,0806H0806H SUB AL SUB AL,07H07H ;AX=08FFH;AX=08FFH AASAAS ;AX=0709H;AX=0709H(2 2)非压缩)非压缩BCDBCD数减法调整数减法调整21格式:格式:AAM功能:功能:将将ALAL中小于中小于64H64H的的二进制数二进制数非压缩非压缩BCDBCD数数送送AXAX调整规则调整规则:AL/0AH AL/0AH AHAH(十位),(十位),AL MOD 0AH AL MOD 0AH AL AL(个位)(个位)如如:MOV AL:MOV AL,63H63H AAM AAM ;AX=0909H;AX=0909H3.非压缩BCD数乘除法调整指令AAM和AAD(自学)(1 1)乘法调整)乘法调整格式:格式:AAD功能:将功能:将AXAX中的两位中的两位非压缩非压缩BCDBCD数数二进制数二进制数集中放集中放在在ALAL中。中。如:如:966966 MOV AX,0906H MOV AX,0906H MOV DL,06H MOV DL,06H AAD AAD ;AX=0060H;AX=0060H DIV DL DIV DL ;AL=10H,AH=0;AL=10H,AH=0 MOV DL,AH MOV DL,AH;存余数存余数 AAMAAM ;AX=0106H;AX=0106H(2 2)除法调整)除法调整注:注:l此指令可对被除数进行预此指令可对被除数进行预调整调整l加、减和乘法调整在相应加、减和乘法调整在相应运算操作运算操作之后之后进行,而除进行,而除法的调整在除法操作法的调整在除法操作之前之前进行进行 例例33:将:将AXAX中的中的3 3位位(小于等于小于等于255255大于零)大于零)BCDBCD数转换数转换为二进制数为二进制数存入字节变量存入字节变量SBSB中。中。(P192)(P192)(1)思路:)思路:N2102N110N0=(N210N1)10N0(2 2)说明)说明:AL:AL:被乘数被乘数 CH CH:乘数:乘数1010 CL:CL:移位次数移位次数 SB SB:暂存器:暂存器(3 3)绘制程序流程图)绘制程序流程图(4 4)编写程序)编写程序开始开始初始化初始化返回返回暂存十位和个位暂存十位和个位SBSB百位百位ALALAL10AXAL10AX取十位取十位AHAHALALAHALAHAL取各位取各位SBSBSB+ALSBSB+ALSBAL10AXAL10AX8.1.3 8.1.3 8.1.3 8.1.3 顺序程序设计举例顺序程序设计举例顺序程序设计举例顺序程序设计举例程序段如下:程序段如下:1.1.MOV AX,0126HMOV AX,0126H2.2.M0V CH,10M0V CH,103.3.MOV CL,4MOV CL,44.4.MOV SB,ALMOV SB,AL ;暂存十位和个位暂存十位和个位5.5.MOV AL,AH MOV AL,AH ;百位存入百位存入ALAL中中6.6.MUL CH MUL CH ;百位百位1010AXAX7.7.MOV AH,SB ;MOV AH,SB ;取十位取十位8.8.SHR AH,CLSHR AH,CL9.9.ADD AL,AH ;ADD AL,AH ;百位百位10+10+十位十位ALAL10.10.MUL CH MUL CH ;AL10;AL10AXAX11.11.AND SB,0FH;AND SB,0FH;取个位取个位12.12.ADD SB,AL ;ALADD SB,AL ;AL+个位个位SBSB开始开始初始化初始化返回返回暂存十位和个位暂存十位和个位SBSB百位百位ALALAL10AXAL10AX取十位取十位AHAHALALAHALAHAL取各位取各位SBSBSB+ALSBSB+ALSBAL10AXAL10AX 例例44 将将ALAL中的中的8 8位无符号位无符号二进制数转换为二进制数转换为BCDBCD数数放入放入AXAX中中(P194)(P194)(1)思路:)思路:“除除1010取余取余”法法(2 2)说明)说明:BL:BL:除数除数1010 BH:BH:暂存器暂存器 CL:CL:移位次数移位次数 AX:AX:被除数被除数(3 3)绘制程序流程图)绘制程序流程图(4 4)编写程序)编写程序开始开始初始化初始化返回返回AX10AX10,余数(个位),余数(个位)AHAH暂存个位暂存个位BHBH商商10,10,余数(十位)余数(十位)AHAH商(百位)商(百位)ALAL合并十位与个位合并十位与个位BHBH商(百位)商(百位)AHAH十位与各位十位与各位BHALBHAL程序如下:程序如下:MOV AL,7EH(126)MOV AL,7EH(126)MOV CL,4MOV CL,4MOV BL,10MOV BL,10MOV AH,0 MOV AH,0 ;将将8 8位二进制数扩展为位二进制数扩展为1616位位DIV BLDIV BL ;商商ALAL,余数,余数AHAH(个位数)(个位数)MOV BH,AH MOV BH,AH ;个位暂存个位暂存MOV AH,0 MOV AH,0 DIV BLDIV BL ;商商(百位数百位数)AL,AL,余数余数AH(AH(十位数十位数)SHL AH,CLSHL AH,CLOR BH,AH OR BH,AH ;BCD;BCD数十位与个位合并数十位与个位合并MOV AH,AL MOV AH,AL ;百位数送百位数送AHAHMOV AL,BHMOV AL,BH ;BCD;BCD数十位与个位送数十位与个位送ALAL开始开始初始化初始化返回返回AX10AX10,余数(个位),余数(个位)AHAH暂存个位暂存个位BHBH商商10,10,商(百位)商(百位)ALAL余数(十位)余数(十位)AHAH合并十位与个位合并十位与个位BHBH商(百位)商(百位)AHAH十位与各位十位与各位(BH)AL(BH)AL 例例55 从键盘键入从键盘键入0 09 9的任一自然数的任一自然数N N,求其立方值并将其送,求其立方值并将其送显示器显示显示器显示.(完整程序见完整程序见P201P201【例例8.58.5】)键入键入N将字符变成数将字符变成数N用乘法求用乘法求N3用除法将用除法将N3二进二进制数变成其十进制数字符制数变成其十进制数字符显示输出显示输出INPUT DB Please Input N(09),$LFZ DB 0,0,0,MOV BL,10 MOV DX,OFFSET INPUT;显示提示信息显示提示信息 MOV AH,9 INT 21H MOV AH,1 INT 21H可用乘法运算实现,也可用查表法实现。用乘法实现可用乘法运算实现,也可用查表法实现。用乘法实现思路:思路:MOV AH,2MOV DL,0AHINT 21HAND AL,0FHMUL ALMUL ALDIV BLOR AH,30HMOV LFZ+2,AHMOV AH,0DIV BLOR AX,3030HMOV WORD PTR LFZ,AXLEA DX,LFZMOV AH,9INT 21Hret开始开始定义提示信息定义提示信息返回返回定义立方值数据区定义立方值数据区9 9号号 显示提示信息显示提示信息键入自然数键入自然数N N将字符将字符N N变成数变成数N N求求N N3 3将个位变成字符将个位变成字符LFZ+2LFZ+2将百位十位变成字符将百位十位变成字符LFZLFZN N3 31010,商,商(百十位百十位)AL,)AL,余数余数(个位个位)AH)AH百十位百十位1010,商,商(百位百位)AL,)AL,余数余数(十位十位)AH)AH流程图:流程图:9 9号号 显示立方值显示立方值INPUT DB Please Input N(09):):LFB DB 0 1 8 27 64 DB 125216343512729N DB 0 MOV DX,OFFSET INPUT;显示提示信息显示提示信息 MOV AH,9 INT 21H MOV AH,1 ;键入并回显键入并回显N INT 21H 查表法程序段如下:查表法程序段如下:MOV N,ALMOV AH,2 ;换行换行MOV DL,0AHINT 21HMOV DL,N ;将字符将字符N转化为数字转化为数字NAND DL,0FHMOV CL,2 ;确定立方表中的位置确定立方表中的位置 SHL DL,CLMOV DH,0ADD DX,OFFSET LFB;显示显示N的立方值的立方值 MOV AH,9INT 21H本节课要求n掌握乘除法指令n会编写简单的顺序程序本节课作业nP260:习题8.28.2 8.2 8.2 8.2 分支程序设计分支程序设计分支程序设计分支程序设计 分支程序通常是利用分支程序通常是利用条件转移指令,使程序条件转移指令,使程序执行到某一指令后,执行到某一指令后,根根据条件是否满足,据条件是否满足,来改来改变程序执行的次序。变程序执行的次序。它经常是先用比较指它经常是先用比较指令或数据操作及位检测令或数据操作及位检测指令来改变标志寄存器指令来改变标志寄存器各个标志位。然后用条各个标志位。然后用条件转移指令进行分支。件转移指令进行分支。图图1 1 分支程序结构流程图分支程序结构流程图通用格式:通用格式:Jcond short_lableJcond short_lable操作:若满足条件,则操作:若满足条件,则 将将short_lable short_lable OFFSETOFFSET IP,IP,实实现转移现转移;否则顺序执行否则顺序执行.short_lable short_lable 短标号,条件转移是相对转移指令,即从短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为当前地址到目标地址的偏移量为-128-128+127+127(从本指令则(从本指令则为为-126-126+129,+129,因为条件转移指令均为双字节指令),故因为条件转移指令均为双字节指令),故只能实现段内转移只能实现段内转移.8.2.1 8.2.1 8.2.1 8.2.1 条件转移指令条件转移指令条件转移指令条件转移指令仅判断仅判断一个标志位一个标志位实现转移实现转移.P205.P205 表表8-18-1PF=0PF=0奇转移奇转移JNP/JPOJNP/JPOPF=1PF=1偶转移偶转移 JP/JPEJP/JPEOF=0OF=0无溢出转移无溢出转移JNOJNOOF=1OF=1溢出转移溢出转移JOJOSF=0SF=0为正转移为正转移JNSJNSSF=1SF=1为负转移为负转移JSJSCF=0CF=0无进无进(借借)位转移位转移JNCJNCCF=1CF=1有进有进(借借)位转移位转移JCJCZF=0ZF=0不相等不相等/不等于不等于0 0转移转移JNE/JNZJNE/JNZZF=1ZF=1相等相等/等于等于0 0转移转移JE/JZJE/JZ标志设置标志设置功能功能指令助记符指令助记符1.简单条件转移指令2.无符号数条件转移指令 条件转移常依据两个数的关系来决定,两个数的关系除相条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确是符号数,否则答案不明确.如:如:0FFH00H?0FFH00H?视为无符号数视为无符号数 0FFH=2550FFH=25500H;00H;视为符号数视为符号数 0FFH=-100H.0FFH=-100H.所以,应将两种类型的数分开比较:所以,应将两种类型的数分开比较:对对无符号数无符号数使用术语:使用术语:低于低于/高于高于 B Below/elow/A Above;bove;对对带符号数带符号数使用术语:使用术语:小于小于/大于大于 L Less/ess/G Greaterreater 无符号数条件转移指令有无符号数条件转移指令有4 4条(条(P206P206,表,表8 82 2):):指令助记符指令助记符 功能功能 JB/JNAEJB/JNAE JNB/JAEJNB/JAE JA/JNBEJA/JNBE JNA/JBEJNA/JBE低于低于/不高于等于转移不高于等于转移不低于不低于/高于等于转移高于等于转移高于高于/不低于等于转移不低于等于转移不高于不高于/低于等于转移低于等于转移3.符号数条件转移指令 符号数条件转移指令有符号数条件转移指令有4 4条(条(P206P206,表,表8 83 3):):指令助记符指令助记符 功能功能 JL/JNGEJL/JNGE JNL/JGEJNL/JGE JG/JNLEJG/JNLE JNG/JLEJNG/JLE小于小于/不大于等于转移不大于等于转移 不小于不小于/大于等于转移大于等于转移大于大于/不小于等于转移不小于等于转移不大于不大于/小于等于转移小于等于转移格式:格式:JMP targetJMP target操作:将控制转向目的标号操作:将控制转向目的标号targettarget:targettarget在段内在段内:target:target的偏移地址的偏移地址IPIP target target在段外在段外:target:target的偏移地址的偏移地址IPIP target target的段基址的段基址CS CS 条件转移范围为条件转移范围为-128-128+127,+127,而无条件转移指令而无条件转移指令没有范围限制。在分支程序中往往需要它将各分支重没有范围限制。在分支程序中往往需要它将各分支重新汇集到一起新汇集到一起.1.无条件直接转移指令8.2.2 8.2.2 8.2.2 8.2.2 无条件转移指令无条件转移指令无条件转移指令无条件转移指令格式格式:JMP destJMP dest 操作操作:目的操作数为寄存器目的操作数为寄存器寄存器内容送寄存器内容送IPIP 目的操作数为字变量目的操作数为字变量字变量内容送字变量内容送IP IP 目的操作数为双字变量目的操作数为双字变量双字变量内容送双字变量内容送CSCS和和IP IP 如:如:JMP NEXT ;JMP NEXT ;无条件转移到无条件转移到NEXTNEXT NEXT:NEXT:如:如:JMP WORD PTRBX ;JMP WORD PTRBX ;即即BXBX IPIP JMP DWORD PTRBX;JMP DWORD PTRBX;即即BXBX IPIP ;BX+2 ;BX+2 CSCS 2.无条件间接转移指令 例例66 编程计算下面函数值编程计算下面函数值 (X,Y(X,Y均为字节符号数均为字节符号数)P207 P207 例例8.78.7X X、Y Y (1 1)分析题目:)分析题目:同同号号异异号号0000(2 2)绘制程序流程图:)绘制程序流程图:开始开始XYXY相异?相异?ALXALXX X0 0Z-1Z-1Z0Z0Z1Z1返回返回N NY YN NY YLP1LP1LP2LP2BACKBACK8.2.3 8.2.3 8.2.3 8.2.3 分支程序设计举例分支程序设计举例分支程序设计举例分支程序设计举例X DB-5X DB-5Y DB 20Y DB 20Z DB 0Z DB 0 MOV Z,0MOV Z,0 MOV AL,X MOV AL,X XOR AL,Y XOR AL,Y JS BACK JS BACK MOV Z,1 MOV Z,1 CMP X,0 CMP X,0 JNS BACK JNS BACK NEG Z NEG Z BACK:retBACK:ret;根据根据X X、Y Y的符号置的符号置SFSF,相同为,相同为0 0;相异为相异为1 1,X X、Y Y相异结束相异结束;Z;Z赋赋1 1;相同后,判断其中某数的符号相同后,判断其中某数的符号;大于等于大于等于0 0,结束,结束;小于小于0 0,求补得,求补得 1 1(3 3)程序设计:)程序设计:例例77无符号数字节变量无符号数字节变量X,X,判断其值是否在判断其值是否在1010和和2020之间,即之间,即10X10X2020。如果。如果M20M20,则送,则送0FFH0FFH给给ALHALH;如果;如果 M M1010,则送,则送00H00H给给ALAL;如果;如果10M10M20 20,则送,则送88H88H给给ALAL。(1 1)分析题目:)分析题目:10102020FFHFFH88H88H00H00H(2 2)绘制程序流程图:)绘制程序流程图:开始开始BL10BL10BLXBLXBLBL2020AL88HAL88HAL00HAL00HALFFHALFFH返回返回N NY YN NY YLP1LP1LP2LP2LP3LP3(3 3)编制的程序如下:)编制的程序如下:START:MOV BL,XSTART:MOV BL,X CMP BL,10;CMP BL,10;将将BLBL的内容和的内容和1010相比较相比较 JC LP1JC LP1;小于小于1010转转LP1LP1CMP BL,20;CMP BL,20;将将BLBL的内容和的内容和2020相比较相比较JNC LP2;JNC LP2;ALAL2020转转LP2LP2 MOV AL,88HMOV AL,88H;将将0FFH0FFH送入送入ALAL寄存器寄存器LP3:LP3:RET;RET;返回返回LP1:LP1:MOV AL,00MOV AL,00JMP LP3JMP LP3LP2:MOV AL,0FFHLP2:MOV AL,0FFH JMP LP3 JMP LP344 例例8 8 从键盘上从键盘上键入键入2 2位十六进制位十六进制数将其拼合成一个字节存数将其拼合成一个字节存入字节变量入字节变量SBSB中。中。P209 P209 例例8.98.9(1 1)思路:)思路:判断判断字符为字符为“0-9”“0-9”还是还是“A-F”,“A-F”,如是如是“0-9”“0-9”,则减去则减去30H30H,否,否则减去则减去37H37H,将,将字符变成数字。字符变成数字。(2 2)画流程图:)画流程图:(3 3)编写程序)编写程序开始开始ALAL1010键入键入2 2位位1616进制数进制数AHAH-7AHAH-7返回返回Y YLNSUB7LNSUB7HNSUB7HNSUB7两个字符送两个字符送AXAXALALAL-7HAL-7HAHAH1010AXAXAXAX-3030H-3030H将将AXAX中的数拼合成一个字节送中的数拼合成一个字节送SBSBY YN NN NIBUF DB 3,0,3 DUP(0)IBUF DB 3,0,3 DUP(0)SB DB 0 SB DB 0MOV DX,OFFSET IBUF MOV DX,OFFSET IBUF ;键入键入2 2位十六进制数位十六进制数MOV AH,10MOV AH,10INT 21HINT 21HMOV AX,WORD PTR IBUF+2MOV AX,WORD PTR IBUF+2 ;键入字符送键入字符送AXAXSUB AX,3030HSUB AX,3030H ;字符变为十六进制数字符变为十六进制数CMP AL,0AHCMP AL,0AHJB LNSUB7 JB LNSUB7 ;键入的字符为键入的字符为0-90-9SUB AL,7 SUB AL,7 ;键入的字符为键入的字符为A-FA-F LNSUB7:LNSUB7:CMP AH,0AHCMP AH,0AHJB HNSUB7JB HNSUB7SUB AH,7SUB AH,7HNSUB7:HNSUB7:MOV CL,4 MOV CL,4 ;将将AXAX中的数拼合成一个字节中的数拼合成一个字节SHL AL,CLSHL AL,CLOR AL,AHOR AL,AHMOV SBMOV SB,ALAL retret 例例99 某工厂的产品有某工厂的产品有8 8种不同的加工处理程序种不同的加工处理程序P0P0P7P7,根据键盘输入,做不同的处理,若是根据键盘输入,做不同的处理,若是0 07 7以外的键,则退以外的键,则退出加工处理出加工处理(1 1)分析:)分析:可以用两种方法实现可以用两种方法实现:u用逐一比较判断用逐一比较判断,逐次比较转移实现二叉分支、整体上逐次比较转移实现二叉分支、整体上实现多分支实现多分支;u另一种是跳转表法另一种是跳转表法,直接实现多分支。直接实现多分支。(2 2)编写程序)编写程序47方法一方法一逐一比较法逐一比较法.简单,条理清楚,易于实现,简单,条理清楚,易于实现,但转移但转移范围只能是:范围只能是:128128127127INPUT DB Input(0INPUT DB Input(07):$7):$AGAIN:MOV DX,OFFSET INPUT ;AGAIN:MOV DX,OFFSET INPUT ;显示提示显示提示 MOV AH,9 MOV AH,9 INT 21H INT 21H MOV AH,1 MOV AH,1 ;等待键入一个字符;等待键入一个字符 INT 21H INT 21H CMP AL,0 CMP AL,0;为;为0 0字符则转字符则转P0P0 JE P0 JE P0 CMP AL,1 CMP AL,1;为;为1 1字符则转字符则转P1P1 JE P1 JE P148 CMP AL,2CMP AL,2JE P2 JE P2 CMP AL,3CMP AL,3JE P3 JE P3 CMP AL,4 CMP AL,4 JE P4JE P4CMP AL,5CMP AL,5JE P5JE P5CMP AL,6CMP AL,6JE P6JE P6CMP AL,7CMP AL,7JE P7JE P7RETRET;不是不是0 07 7则退出程序则退出程序 P0:P0::JMP AGAIN JMP AGAINP1:P1::JMP AGAIN JMP AGAIN :P7:P7::JMP AGAIN JMP AGAIN49 方法二:方法二:跳转表法跳转表法 利用无条件的间接转移指令可实现远距离的多分支,间利用无条件的间接转移指令可实现远距离的多分支,间接跳转至不同分支的入口处。接跳转至不同分支的入口处。在数据区造一地址表,存放不同的分支入口地址;在数据区造一地址表,存放不同的分支入口地址;l设表的首地址为设表的首地址为PTABPTAB,每一个入,每一个入口地址占一个字单元,口地址占一个字单元,lPiPi的入口地址的入口地址PTABPTAB(2(2i)i)l若将若将(2(2i)i)BXBX,l则则JMP PTABBX JMP PTABBX l可转到可转到PiPi入口处入口处PTAB P0PTAB P02 P12 P14 P24 P250 INPUT DB INPUTINPUT DB INPUT(0 07 7):):$PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 ;定义地址表;定义地址表AGAIN:AGAIN:MOV DX,OFFSET INPUT MOV DX,OFFSET INPUT ;显示提示;显示提示 MOV AH,9 MOV AH,9 INT 21H INT 21H MOV AH,1 MOV AH,1 ;等待键入;等待键入0 07 7的数字的数字 INT 21HINT 21H CMP AL,0 CMP AL,0;检查输入数据,不是;检查输入数据,不是0 07 7则退出则退出 JB EXIT JB EXIT CMP AL,7 CMP AL,7 JA EXIT JA EXIT AND AX,0FH AND AX,0FH ;i i2 2BXBX ADD AX,AX ADD AX,AX MOV BX,AX MOV BX,AX JMP PTABBX JMP PTABBX ;(;(PTABPTAB2 2i i)PiPiIPIPEXIT:RETEXIT:RET51 P0:P0::JMP AGAIN JMP AGAINP1:P1::JMP AGAIN JMP AGAIN :P7:P7::JMP AGAIN JMP AGAIN 键入的键入的ASCASC码为无符号数,所以,用码为无符号数,所以,用JBJB、JAJA等指令而不能等指令而不能用用JGJG、JLJL等。等。?若为跨段标号,应修改哪些若为跨段标号,应修改哪些地方?地方?注:只需修改:注:只需修改:DWDWDDDD(存(存IPIP、CSCS)、)、i i2 2i i4 4即可即可52l分支实现的基本方法有两种,一种是利用分支实现的基本方法有两种,一种是利用比较转移指令比较转移指令实现分支,一种是利用实现分支,一种是利用跳转表实现跳转表实现分支。分支。l视比较对象,正确选择合适的转移指令。视比较对象,正确选择合适的转移指令。l要为每个分支安排正确出口。要为每个分支安排正确出口。l凡是可共用的部分,应尽量放在公共程序段中以使程序凡是可共用的部分,应尽量放在公共程序段中以使程序简短。简短。l在调试分支程序时,应使用多组数据,分别对各种分支在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试。进行反复测试。总结:分支程序设计时应注意的事项本节课要求n掌握无条件转移指令和条件转移指令n掌握分支程序的结构n会编制简单分支程序本节课作业n从键盘接收一个按键,如果为小写字母则输出L,是大写字母,则输出U,如果为数字则输出N,都不是则输出*。循环程序的四部分:循环程序的四部分:(1)(1)循环准备循环准备(循环(循环初始化)初始化)建地址指针、置计数初值、设置必要的常数、对工作寄建地址指针、置计数初值、设置必要的常数、对工作寄存器及工作单元置初值或清存器及工作单元置初值或清0 0等等.(2)(2)循环体循环体 重复执行的部分,循环的核心重复执行的部分,循环的核心.(3)(3)循环的修改循环的修改 修改计数器、寄存器、地址指针、恢复某些参数修改计数器、寄存器、地址指针、恢复某些参数.(4)(4)循环控制循环控制 判断控制循环是否结束或继续判断控制循环是否结束或继续.8.3 8.3 8.3 8.3 循环程序设计循环程序设计循环程序设计循环程序设计循环程序的具体结构流程有两种:循环程序的具体结构流程有两种:初始化初始化循环体循环体修改修改结束循环?结束循环?Y YN N(a a)先执行,后判断)先执行,后判断至少执行一次循环体至少执行一次循环体初始化初始化循环体循环体修改修改 进入循环?进入循环?Y YN N(b b)先判断,后执行)先判断,后执行可以不执行循环体可以不执行循环体8.3.1 8.3.1 8.3.1 8.3.1 循环程序的基本结构循环程序的基本结构循环程序的基本结构循环程序的基本结构如:编程统计字变量如:编程统计字变量W W中有多少位中有多少位1 1,并将结果存入字节变,并将结果存入字节变量量N N中。中。方法一:先执行,后判断方法一:先执行,后判断 MOV NMOV N,0 0 MOV CX MOV CX,1616LOP:SHL WLOP:SHL W,1 1 JNC NOINC JNC NOINC INC N INC NNOINC:DEC CXNOINC:DEC CX JNZ LOPJNZ LOP retret方法二:先判断,后执行方法二:先判断,后执行 MOV NMOV N,0 0LOP:CMP W,0LOP:CMP W,0 JZ DONE JZ DONE SHL WSHL W,1 1 JNC LOP JNC LOP INC NINC N JMP LOPJMP LOPDONE:retDONE:ret思路:思路:用移位指令将一位移入用移位指令将一位移入CF,CF=1,CF,CF=1,则则N+1N+1后移下一位,后移下一位,负责不加负责不加1 1,继续移下一位。,继续移下一位。循环控制方法最常见的有两种:循环控制方法最常见的有两种:计数控制计数控制 循环次数已知,故可用某个寄存器循环次数已知,故可用某个寄存器或单元作为计数器,或单元作为计数器,用计数器的值来控制循环的用计数器的值来控制循环的结束与否结束与否.如上例,方法一如上例,方法一 条件控制条件控制 循环次数未知,即循环次数与循环循环次数未知,即循环次数与循环体的执行情况有关,通过条件测试指令来测试是体的执行情况有关,通过条件测试指令来测试是否满足循环条件,以控制循环是否结束否满足循环条件,以控制循环是否结束.如上例,方法二如上例,方法二 LOOP指令格式:格式:LOOP short-lableLOOP short-lable操作:操作:CX-1CXCX-1CX,当当CX0CX0则转则转short-lable short-lable 所指指令所指指令;否则顺序执行否则顺序执行.注:注:l在使用在使用LOOPLOOP指令前,必须把循环次数送入指令前,必须把循环次数送入CXCX。lLOOP LOOP shotr-lableshotr-lable=l若若CX=0CX=0,则循环要进行,则循环要进行6553665536次。次。DEC CXDEC CXJNZ short-lableJNZ short-lable8.3.2 8.3.2 8.3.2 8.3.2 重复控制指令重复控制指令重复控制指令重复控制指令 LOOPZ/LOOPE指令格式:格式:LOOPZ/LOOPE short-lableLOOPZ/LOOPE short-lable操作:操作:CX-1 CX,CX-1 CX,当当CX0,CX0,且且ZF=1ZF=1则转移则转移;否则顺序执行否则顺序执行.l注:本指令注:本指令不影响不影响ZF,ZFZF,ZF由前面指令设定由前面指令设定.即即前面比较结果相等。前面比较结果相等。格式:格式:JCXZ short-lableJCXZ short-lable操作:操作:CX=0CX=0转移转移,否则顺序执行否则顺序执行.l注:指令本身注:指令本身不作减不作减操作,本指令一般用在循环操作,本指令一般用在循环的开始处,当的开始处,当CX=0,CX=0,则跳过循环则跳过循环.LOOPNZ/LOOPNE指令 JCXZ指令格式:格式:LOOPNZ/LOOPNE short-lableLOOPNZ/LOOPNE short-lable操作:操作:CX-1 CX,CX-1 CX,当当CX0,CX0,且且ZF=0ZF=0则转移则转移;否则顺序执行。否则顺序执行。此类指令的特点是:此类指令的特点是:l循环次数由循环次数由CXCX计数器控制。循环指令本身不影计数器控制。循环指令本身不影响标志。响标志。l同条件转移指令一样,重复控制指令也是相对同条件转移指令一样,重复控制指令也是相对转移指令,重复控制指令的目的地址必须在本转移指令,重复控制指令的目的地址必须在本指令地址的指令地址的-126126129129字节的范围之内。字节的范围之内。例例9 9 编写将某数据区十六进制数加密的程序。每个数字编写将某数据区十六进制数加密的程序。每个数字占一个字节。占一个字节。P216P216例例8.128.12 (1)(1)分析:分析:1616进制数的加密数和相应的解密数进制数的加密数和相应的解密数 十六数十六数:0 1 2 3 4 5 6 7 8 9 A B C D E F:0 1 2 3 4 5 6 7 8 9 A B C D E F 加密数加密数:A 9 8 E F 1 0 B 2 5 D 3 7 4 6 C:A 9 8 E F 1 0 B 2 5 D 3 7 4 6 C 解密数解密数:6 5 8 B D 9 E C 2 1 0 7 F A 3 4:6 5 8 B D 9 E C 2 1 0 7 F A 3 4 即发即发0 0,则发,则发A A;发;发3 3,则发,则发E E;发;发A A,则发,则发D D 解密规律解密规律解密数的位移量解密数的位移量=加密数的数值加密数的数值 如:解密数如:解密数0 0的位移量是的位移量是=0AH=0AH 如:解密数如:解密数4 4的位移量是的位移量是=0FH=0FH8.3.3 8.3.3 8.3.3 8.3.3 单重循环程序设计举例单重循环程序设计举例单重循环程序设计举例单重循环程序设计举例1.计数控制的循环程序开始开始定义待发数存区定义待发数存区返回返回统计待发数个数统计待发数个数CX0CX0给加密数分配存区给加密数分配存区Y YN N存加密表存加密表初始化:设置计数器、指针初始化:设置计数器、指针BLBL取待发数取待发数加密加密存加密数存加密数修改指针修改指针(2 2)说明)说明:CX:CX:计数器计数器 SI:SI:待发数和加密数待发数和加密数 存储器地址指针存储器地址指针 BX:BX:加密表地址指针加密表地址指针 AL:AL:累加器累加器(3 3)绘制程序流程图)绘制程序流程图(4 4)编写程序)编写程序加密程序如下加密程序如下:HEXS D
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!