[工学]汇编语言与接口技术第四章.ppt_第1页
[工学]汇编语言与接口技术第四章.ppt_第2页
[工学]汇编语言与接口技术第四章.ppt_第3页
[工学]汇编语言与接口技术第四章.ppt_第4页
[工学]汇编语言与接口技术第四章.ppt_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言与接口技术,主讲教师 张玉琢,第四章 程序设计的基本技术,.1,.2,.3,.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致,4.1 顺序程序设计,格式:MUL source IMUL source ;符号整数乘法,4.1.1 乘除法指令,1.乘法指令MUL和符号整数乘法指令IMUL,源操作数 source可以是字节或字,可为寄存器或存储器操作数,不能为立即数 目的操作数是AL或AX,视source的类型属性决定是AL还是AX 在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘),乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示,AL,sourc8,AX,AX,sourc16,AX,DX,可用乘法运算将BCD数转换为二进制数,例 将AX中小于256大于0的3位BCD数转换为二进制数,存入字节变量SB中 思路:用(百位10+十位)10+个位的方法将BCD数转换为二进制数 如将BCD数255H转换为二进制数11111111B,运算的过程为:,将AX中的3位BCD数转换为二进制数存入字节变量SB中,M0V CH,10 MOV CL,4 MOV SB,AL ;暂存十位和个位 MOV AL,AH ; 百位存入AL中 MUL CH ;百位10AX MOV AH,SB SHR AH,CL ;取十位 ADD AL,AH ;百位10 + 十位AL MUL CH ;(百位10 + 十位)10 AX AND SB,0FH ;取个位 ADD SB,AL ;(百位10 + 十位)10 +个位SB,N2102N110N0 (N210N1)10N0,程序段如下:,格式: DIV source IDIV source ;符号整数除法 注: 源操作数source(除数)可以是字或字节,可为REG或MEM,不能为立即数。 目的操作数是AX或DX和AX(被除数),2.除法指令DIV和符号整数除法指令IDIV,除法指令所执行的操作如下图所示,AL,sourc8,AX,AX,sourc16,AH,DX,可用除法运算(除10取余)将二进制数转换为BCD数,例 将AL中的8位无符号二进制数转换为BCD数放入AX中,MOV AL,0FFH MOV CL,4 MOV BL,10 MOV AH,0 ; 将8位二进制数扩展为16位 DIV BL ; 商AL,余数AH(个位数) MOV BH,AH ;个位暂存 MOV AH,0 DIV BL ; 商AL,余数AH(十位数) SHL AH,CL OR BH,AH ; BCD数十位与个位合并 MOV AH,0 DIV BL ; AH中余数为BCD数百位 MOV AL,BH ;BCD数十位与个位送AL,“除10取余”法,3. 扩展指令CBW和CWD,要把一个8位二进制数除以一个8位二进制数,要有一个16位被除数放在AX中。所以在做8位除以8位的除法之前先要把8位被除数扩展为16位,在做16位除以16位的除法之前要把16位被除数扩展为32位。这种扩展对于无符号数除法只需将AH或DX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。,两指令都隐含操作数,即被扩展数在AL或AX,扩展至AX 或 DX:AX 在做8位除以8位和16位除以16位的除法之前,应先扩展AL或AX中的被除数 扩展指令和符号整数除法仅对补码数适用,格式:CBW ; AL中的最高位扩展至AH CWD ; AX中的最高位扩展至DX,如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:,MOV SI,OFFSET ARRAY MOV AX,SI CWD IDIV WORD PTR 2SI MOV 4SI,AX MOV 6SI,DX,4.1.2 BCD数调整指令,用二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如: 0000 0011B+0000 1001B= 0000 1100B 0000 1001B+0000 0111B= 0001 0000B 第一个结果是非BCD数;第二个结果是不正确的BCD数。 若再加上6,就可以得到正确的BCD数: 0000 1100B+0000 0110B= 0001 0010B 0001 0000B+0000 0110B= 0001 0110B 对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果,1.BCD数加法调整指令DAA和AAA,格式: DAA 功能:将AL中的和调整为正确的压缩BCD数 调整规则: (AL0FH)9或AF=1,则AL加6; (AL0F0H)90H或CF=1,则AL加60H.,4.1.2 BCD数调整指令,(1)压缩BCD数加法调整,注: 该指令操作数隐含为AL,即只能对AL中的操作数据调整 对结果调整时要用到CF,AF标志,所以调整指令应紧跟BCD数加法指令 DAA指令会影响标志 如: MOV AX,3456H ADD AL,AH ;AL8AH,AF0,CF0 DAA ;AL90H,格式: AAA 功能:将AL中的和调整为正确的非压缩BCD数送AX 调整规则: (AL0FH)9或AF=1,则 (AL+6)0FHAL ,AH+1AH ; 否则,AL0FH AL ,AH不变.,(2)非压缩BCD数加法调整,注: 同DAA,AAA的操作数也隐含为AL,且要紧跟加法指令 AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中.故执行该指令前AH应清0 如:将两个BCD数的ASCII码相加,得到和的ASCII码: MOV AL,35H ; 5 ADD AL,39H ; 9,AL=6EH MOV AH,0 AAA ;AX=0104H OR AX,3030H ; AX=3134H 即14,例3.1 求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。 如:8931+5678=14609,W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(0) MOV AL , BYTE PTR W1 ;AL31H ADD AL , BYTE PTR W2 ; ALA9H,CF=0,AF=0 DAA ;AL09H,CF=1 MOV SUM , AL ;存个位和十位 MOV AL , BYTE PTR W1+1 ;AL89H ADC AL , BYTE PTR W2+1 ; ALE0H, CF=0,AF=1 DAA ;AL46H, CF=1 MOV SUM+1,AL ;存百位和千位 MOV SUM+2,0 ;处理向万位的进位 RCL SUM+2,1,例3.2 求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。 如:89+67=156,W1 DW 0809H W2 DW 0607H SUM DB 3 DUP(0) MOV AL , BYTE PTR W1 ;AL09H ADD AL , BYTE PTR W2 ; AL10H,AF=1 AAA ;AL06H,AH=01H MOV SUM , AL ;存个位 MOV AL , BYTE PTR W1+1 ;AL08H ADC AL , BYTE PTR W2+1 ; AL0FH,AF=0 MOV AH ,0 AAA ;AL05H,AH01H MOV WORD PTR SUM+1,AX ;存十位和百位,格式: DAS 功能:将AL中的差调整为正确的压缩BCD数 调整规则: (AL0FH)9或AF=1,则AL减6; (AL0F0H)90H或CF=1,则AL减60H.,如: MOV AX,5634H SUB AL,AH ;AL=DEH,有借位 DAS ;AL=78H,保持借位,即134-56,2.BCD数减法调整指令DAS和AAS,(1)压缩BCD数减法调整,格式: AAS 功能:将AL中的差调整为正确的非压缩BCD数送AX 调整规则: (AL0FH)9或AF=1,则 (AL-6)0FHAL ,AH-1AH ; 否则,AL0FH AL ,AH不变.,如: MOV AX,0806H SUB AL,07H ;AX=08FFH AAS ;AX=0709H,(2)非压缩BCD数减法调整,格式: AAM 功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX 调整规则: AL / 0AH AH(十位), AL MOD 0AH AL(个位),如: MOV AL,63H AAM ;AX=0909H,3.非压缩BCD数乘除法调整指令AAM和AAD,(1)乘法调整,格式: AAD 功能:将AX中的两位非压缩BCD数变换成二进制数集中在AL中,如: MOV AX,0906H MOV DL,06H AAD ;AX=0060H DIV DL ;AL=10H,AH=0 MOV DL,AH ;存余数 AAM ;AX=0106H,(2)除法调整,注: 此指令可对被除数进行预调整 加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行.,例3.4 字变量W和字节变量B中分别存放着两个非压缩BCD数,求两者的商和余数,分别存入字变量Q和字节变量R中。,分析: 先将W中的非压缩BCD数取到AX中,用AAD指令调整为二进制数,二进制的除法之后,再用AAM指令将结果调整为非压缩BCD数。 如, (W)=0909H,(B)=5, 63H5=13H4 (Q)=0109H,(R)=04H,W DW 0909H B DB 05H R DB 0 Q DW 0 MOV AX , W AAD ; 0909H63H DIV B ; AL=13H,AH=04H MOV R , AH ;存余数 AAM ; 13H0109H MOV Q , AX ;存商,例3.5 (P97)从键盘键入09的任一自然数N,求其立方值并显示.,INPUT DB Please Input N(09): LFB DB 0 1 8 27 64125 DB 216343512729 N DB 0 MOV DX,OFFSET INPUT MOV AH,9 INT 21H,方法:可用乘法运算实现,也可用查表法实现.,4.1.3 顺序程序设计举例,MOV AH,1 INT 21H MOV N,AL MOV AH,2 MOV DL,0AH INT 21H MOV DL,N AND DL,0FH MOV CL,2 SHL DL,CL MOV DH,0 ADD DX,OFFSET LFB MOV AH,9 INT 21H,第四章 程序设计的基本技术,.1,.3,.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,.2,某些程序在运行时,计算机根据不同的条件自动作出选择判别,条件满足,执行相应的程序段;条件不满足,执行另外的程序段,这样的程序,指令执行的顺序与指令存储的顺序失去了完全的一致性。,4.2 分支程序设计,通用格式:Jcond short_lable 操作:若满足条件,则OFFSET short_lableIP,实现转移;否则顺序执行.,4.2.1 条件转移指令,short_lable 短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128127(从本指令则为-126+129,因为条件转移指令均为双字节指令),故只能实现段内转移.,9个标志位,其中6个状态标志,3个控制标志,3.状态标志寄存器(status flags),仅判断一个标志位实现转移.参见教材:P100表31,1.简单条件转移指令,如: JZ/JE S_LAB为零/相等转移 操作:测试前面操作结果为0则转移,即判ZF=1转移. JZ , JE为等价助记符,任写一种均可,可根据程序设计意图选择.,如: MOV BX , 0FFFFH INC BX ; ZF=1 JZ NEXT ; 为0转移到NEXT NEXT: ,如: MOV BL , 1 ; CMP BL , 5 ; ZF=0 JE NEXT ;比较结果相等则转移到NEXT Action-1: ;不相等顺序执行 NEXT: .,注: 此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指令前,一定有一条能正确影响标志的指令,2.无符号数条件转移指令,条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确.,如:0FFH00H ? 视为无符号数 0FFH=255 00H ; 视为符号数 0FFH= -1 00H . 所以,应将两种类型的数分开比较: 对无符号数使用术语:低于/高于 Below/Above; 对带符号数使用术语:小于/大于 Less/Greater,无符号数条件转移指令有4条(P100,表32): 指令助记符 功能 JB/JNAE 低于/不高于等于转移 JNB/JAE 不低于/高于等于转移 JA/JNBE 高于/不低于等于转移 JNA/JBE 不高于/低于等于转移,例 已知AL中有一十六进制数的ASCII码,将它转换为十六进制数,CMP AL,A JB NS7 SUB AL,7 NS7: SUB AL,30H ,3.符号数条件转移指令,符号数条件转移指令有4条(P101,表33): 指令助记符 功能 JL/JNGE 判AB转移 JNG/JLE 判A B转移,格式:JMP target 操作:将控制转向目的标号target: target在段内: target的偏移地址IP target在段外: target的偏移地址IP target的段首址CS,条件转移范围为-128+127,而无条件转移指令没有范围限制. 在分支程序中往往需要它将各分支重新汇集到一起.,4.2.2 无条件转移指令,1.无条件直接转移指令,如: JMP NEXT ;无条件转移转到NEXT NEXT: ,格式: JMP dest 操作: 目的操作数为寄存器寄存器内容送IP(段内转移) 目的操作数为字变量字变量内容送IP 目的操作数为双字变量双字变量内容送CS和IP (段间转移) 如: JMP WORD PTRBX ;即( BX ) IP,2. 无条件间接转移指令,分支实现的基本方法有两种:一种是利用比较转移指令实现二路分支;一种是利用跳转表实现多路分支. 视比较对象,正确选择合适的转移指令. 要为每个分支安排正确出口. 凡是可共用的部分,应尽量放在公共程序段中以使程序简短. 在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.,4.2.3 分支程序设计举例,例3.8 编程计算下面函数值 (X,Y均为字节符号数),X DB -5 Y DB 20 Z DB 0,MOV Z,0 MOV AL,X XOR AL,Y ;根据X、Y的符号置S标志,相同为0 JS BACK ;相异为1,X、Y相异结束 MOV Z,1 ;Z赋1 CMP X,0 ;相同后,判断其中某数的符号 JNS BACK ;大于等于0,结束 NEG Z ;小于0,求补得1 BACK:ret,例3.10 (教材P96)某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支; 另一种是跳转表法,直接实现多分支.,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:128127 INPUT DB Input( 07): $ MOV DX , OFFSET INPUT ;显示提示 MOV AH , 9 INT 21H MOV AH , 1 ;等待键入一个字符 INT 21H CMP AL , 0 ;为0字符则转P0 JE P0 CMP AL , 1 ;为1字符则转P1 JE P1,CMP AL ,2 JE P2 CMP AL ,3 JE P3 CMP AL ,4 JE P4 CMP AL ,5 JE P5 CMP AL ,6 JE P6 CMP AL ,7 JE P7 JMP DOWN ;不是07则退出程序,P0: MOV DL , 0 ;键入0则显示0以替代P0程序 JMP EXIT P1: MOV DL , 1 ;键入1则显示1以替代P1程序 JMP EXIT P7: MOV DL , 7 JMP EXIT EXIT: MOV AH ,2 INT 21H DOWN: RET ;分支程序一定要注意汇合到结束处,方法二:跳转表法 利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处) 在数据区造一地址表,存放不同的分支入口地址; 设表的首地址为PTAB,每一个 PTAB P0 入口地址占一个字单元, 2 P1 Pi的入口地址PTAB2i 4 P2 当键入i时,将2iBX, 则JMP PTABBX可转到Pi入口处:,AND AX ,0FH ; i2BX ADD AX ,AX MOV BX ,AX JMP PTABBX ;(PTAB2i)PiIP EXIT:RET,INPUT DB INPUT(07):$ PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 ;定义地址表,LEA DX , INPUT ;显示提示 MOV AH , 9 INT 21H,MOV AH , 1 ;等待键入07的数字 INT 21H,CMP AL , 0 ;检查输入数据,不是07则退出 JB EXIT CMP AL , 7 JA EXIT,P0: MOV DL, A ;键入0则显示A以替代P0程序 JMP DOWN P1: MOV DL, 1 ;键入1则显示B以替代P1程序 JMP DOWN P7: MOV DL , 7 DOWN: MOV AH , 2 INT 21H JMP EXIT,键入的ASC码为无符号数, 所以,用JB、JA等指令而不能用JG、JL等.,第四章 程序设计的基本技术,.2,.1,.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,.3,四部分: 循环准备(循环初始化) 建地址指针、置循环次数初值、设置必要的常数、对工作寄存器及工作单元置初值或清0等. 循环体 重复执行的部分,循环的核心. 循环的修改 修改计数器、寄存器、地址指针、恢复某些参数. 循环控制 判断控制循环是否结束或继续.,4.3.1 循环程序的结构,循环程序的具体结构流程有两种:,如:编程统计字变量W中有多少位1,并将结果存入字节变量N中 W DW 1999H N DB 0,方法一:先执行,后判断 MOV N,0 MOV CX,16 LOP: SHL W,1 JNC NOINC INC N NOINC:DEC CX JNZ LOP ret,方法二:先判断,后执行 MOV N,0 LOP: CMP W,0 JE DONE SHL W,1 JNC LOP INC N JMP LOP DONE: ret,循环控制方法最常见的有两种: 计数控制 循环次数已知,故可用某个寄存器或单元作为计数器, 用计数器的值来控制循环的结束与否. 如上例,方法一 条件控制 循环次数未知,即循环次数与循环体的执行情况有关,通过条件测试指令来测试是否满足循环条件,以控制循环是否结束. 如上例,方法二,此类指令的特点是: 循环次数由 CX计数器控制.循环指令本身不影响标志. 同条件转移指令一样,循环控制指令也是相对转移指令,转移范围128127.,4.3.2 循环控制指令, LOOP指令,格式: LOOP short-lable 操作:CX1CX, 当CX0则转short-lable 所指指令执行; 否则顺序执行. 注: 在使用LOOP指令前,必须把循环次数送入CX. LOOP shotr-lable= 若CX=0,则循环要进行65536次., LOOPZ / LOOPE指令,格式: LOOPZ / LOOPE short-lable 操作:CX1 CX , 当CX0且ZF=1(两数相等)则转short-lable处执行; 否则顺序执行. 注:本指令不影响ZF,ZF由前面指令设定.即前面比较结果相等.,格式: LOOPNZ/LOOPNE short-lable 操作:CX1 CX , 当CX0 ,且ZF=0(两数不相等)则转移;否则顺序执行.,格式:JCXZ short-lable 操作:CX=0转移,否则顺序执行. 注:指令本身不作减操作,本指令一般用在循环的开始处,当CX=0,则跳过循环., LOOPNZ / LOOPNE指令, JCXZ指令,(注意循环结构,防止死循环),下面通过几个例题介绍循环控制 计数控制 条件控制 计数与条件双重控制 对于某些问题,还有一些特殊控制,如:设开关变量等,可参其他教材.,4.3.3 单重循环程序设计举例,例3.10 (教材P102)计算 Z=X +Y,X、Y 为双字变量.,X DD 72345678H Y DD 90ABCDEFH Z DB 5 DUP(0) MOV CX,4 ;设计数初值 MOV SI,0 ;地址指针 AND AX,AX;清AX,AGAIN: MOV AL,BYTE PTR XSI ADC AL,BYTE PTR YSI MOV ZSI,AL INC SI ;指下一个字节 LOOP AGAIN;计数控制 MOV ZSI,0 ;处理向 RCL ZSI,1 万位进位,分析:按照由低到高字节相加.最后的和可能占5个字节. 用一个双字变量所占的字节数4作为循环体的控制条件,为计数控制.,例3.12 (教材P110)编写将某数据区十六进制数加密的程序.每个数字占一个字节,分析: 设加密数关系如下: 十六数: 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 解密数: 6 5 8 B D 9 E C 2 1 0 7 F A 3 4,若发0 ,则实质发A;若发3 ,则实质发E;若发A,则实质发D,解密规律解密数的位移量=加密数表的数值 如:解密数0的位移量是 = 0AH 如:解密数4的位移量是 = 0FH,HEXS DB 1,2,0EH ; 待发数 NUMBER EQU $ - HEXS ; 统计待发数个数 JMB DB 0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CH JMHEX DB NUMBER DUP(0) ; 存加密数,加密表,MOV CX,NUMBER MOV BH,0 初始化 MOV SI,0 AGAIN: MOV BL,HEXSSI ; 取待发数 MOV AL,JMBBX ; BX+JMB AL MOV JMHEXSI,AL ; 存加密数 INC SI ;指向下一数 LOOP AGAIN ;计数控制,同样,可以编写解密程序如下:,JMH DB 0FH ,0EH ,8 ,9 ,0AH ;设加密数 N EQU JMH ;统计加密数个数 KMB DB 6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4 KMH DB N DUP(0) ;存解密数,解密表,MOV CX ,N MOV BX ,OFFSET KMB MOV SI ,0,NEXT: MOV AL ,JMHSI XLAT KMB MOV KMHSI ,AL INC SI LOOP NEXT,例3.13 (教材P111)在显示器显示字节变量SB中的8位二进数.,分析: 先将字节变量中的1位二进制数移入AH中,再将移入的二进制数变为ASCII码。为了避免通过CF来传递二进制数,先将SB中的8位二进制数送入AL中,再左移AX,将1位二进制数直接移入AH中。,SB DB 9AH OBUF DB 9 DUP(0),MOV CX, 8 MOV BX,0 MOV AL,SB AGAIN: MOV AH, 0 SHL AX,1 ADD AH,30H MOV OBUFBX,AH INC BX LOOP AGAIN MOV 0BUFBX,$ MOV DX,OFFSET OBUF MOV AH,9 INT 21H ret,例3.14 (教材P112)将键入的十进制数(3276832767)转换为二进数.,算法:十进制数二进制数: 上一次转换结果10+Di循环体 D4D3D2D1D0=D4104D3103 D0 (010+D4)10+D3)10+D2)10+D1)10+D0 循环次数 输入负数输入字符个数1; 输入正数(不带符号)输入字符个数 循环体中对其绝对值转换为二进制数,若为负数还应求补,屏幕输入程序的设计多位数的输入,MOV DX , OFFSET IBUF ;键入十进制数 MOV AH ,10 INT 21H MOV CL ,IBUF+1 ;十进制数位数(含“-”)送CX MOV CH ,0 MOV SI ,OFFSET IBUF+2 ;指向键入的第一个字符 CMP BYTE PTRSI, ;判是否为负数 PUSHF ;保护零标志 JNE SININC ;正数跳转至SININC INC SI ;越过“-”指向数字 DEC CX ;实际字符数少1(“-”号),BINARY DW 0 OBUF DB INPUT A DECIMAL(3276832767):$ IBUF DB 7,0 ,7 DUP(0),SININC:MOV AX ,0 ;开始十二 AGAIN: MOV DX,10 ;(010+a4)10+)10+a0 MUL DX AND BYTE PTRSI,0FH;十进制数ASC十进制数 ADD AL ,SI ADC AH ,0 INC SI ;指向下一位 LOOP AGAIN ;计数循环 POPF ;恢复零标志 JNZ NNEG ;ZF=0即为正数,则不求补 NEG AX ; 负数对其绝对值求补 NNEG: MOV BINARY ,AX ;存放结果 ret,例3.19(教材P119)将存储器中的16位无符号二进制数转换成十进制数,并显示结果,分析: N10取其余数,则为十进制数,重复直到商为0. 它是次数未知的循环.为条件控制循环. 将余数 ASC ,送显示缓冲区,用9号功能显示即可. BINARY DW 55H OBUF DB 6 DUP(0),屏幕输出程序的设计,MOV BX ,OFFSET OBUF+5 ; BX指向低位字符地址 MOV BYTE PTRBX,$ MOV AX ,BINARY MOV CX ,10 AGAIN: MOV DX ,0 ;被除数扩展(无号符数扩展) DIV CX ;余数DX,商AX ADD DL ,30H ;十进制数转换为ASC DEC BX ;修改地址指针 MOV BX ,DL ;存十进制数字串 OR AX ,AX ;商为0? JNZ AGAIN MOV DX ,BX ;显示 MOV AH ,9 INT 21H ret,思考 :,1.若改为键入16位无符号数(0FFFFH,即065535),若要让这16位无应符号数参加某运算,并显示运算结果,应如何修改程序? 键入(0FFFFH)将字符串变换为真值参加该运算,存结果入某单元转换输出. 2.若改为键入补码(8000H7FFFH,即3276832767的符号数),应如何修改程序? 键入(8000H7FFFH)将字符串变换为真值参加该运算,存结果入某单元判符号(正、负) 对绝对值进行转换判正负输出,无符号数的输入,从键盘输入一个无符号数,以回车作为数据输入的结束符号,将该数据转换为二进制后存入变量in中。,MOV BX,0 INPUT :MOV AH,01H ;从键盘输入一个数字字符 INT 21H CMP AL,0DH ;判断输入的字符是回车吗? JZ WRITE,SUB AL,30H ; ;数字字符转换为数字 CMP AL,0AH JB LOW10,MOV AX,BX ; AX*10+Di MOV BX,0AH MUL BX MOV BX,AX ADD BX,CX JMP INPUT,WRITE: MOV IN,BX ;转换的结果放入IN中,SUB AL,07 LOW10: MOV CL,AL, MOV CH,00,多重循环即循环体内再套有循环.,例3.21 (教材P115)对N个字节符号数排序.降序排列 N-1轮 2 3 1 4 4 2 1 33次 外计数 4 3 1 22次 DX 4 3 2 -11次,内循环CX,4.3.4 多重循环程序设计举例,采用逐一比较法,即将第一个数与其后的N-1个数逐一比较,将最大数放在第一个单元;第二轮从第二个数开始比较,将次大数放在第二个单元;经N-1轮比较,便已排序.在每一轮的比较中总是将maxAL.内循环次数依赖于外循环.,BUF DB 2 ,3 ,-1 ,4,0,5 COUNT EQU $-BUF MOV SI ,OFFSET BUF MOV DX ,COUNT-1 ;外循环初始化 OUTSID: MOV CX ,DX ; 内循环初始化 PUSH SI ;保存第一个数地址 MOV AL ,SI ;取第一个数 INSIDE:INC SI CMP AL ,SI JNC NEXCHG XCHG SI ,AL NEXCHG:LOOP INSIDE ;内循环修改控制 POP SI MOV SI ,AL ;存max至第一单元 INC SI DEC DX ;外循环修改控制 JNZ OUTSID ret,【例3.23 】已知mn矩阵的元素aij(80H和-7FH,字节符号数)按行序存放在存储区中,试编写求程序每行元素之和i,A DB 11H,12H,13H,14H,15H N EQU $-A DB 21H,22H,23H,24H,25H DB 31H,32H,33H,34H,35H DB 41H,42H,43H,44H,45H M EQU($-A)/N S DW M DUP(0),MOV SI,OFFSET A MOV DI,OFFSET S OUTSID:MOV CX,N MOV DX,0 INSIDE:MOV AL,SI ;元素每行之和 CBW ADD DX,AX INC SI LOOP INSIDE,MOV DI,DX ADD DI,2 DEC M JNZ OUTSID,【例如3.26 】 用串操作指令编写将source-string传送到dest-string的程序,Data segment SSTRING DB *FGDHFJGU# COUNT EQU $-SSTRING Data ends DATAE SEGMENT DSTRING DB COUNT DUP(0) DATAE ENDS,MOV AX,DATA MOV DS,AX MOV AX,DATAE ;将附加段的段地址送ES MOV ES,AX,MOV SI,OFFSET SSTRING MOV DI,OFFSET DSTRING MOV CX,COUNT CLD REP MOVSB,【例如3.28 】编制判断两个串长相等的字符串STRING1和STRING2是否相同的程序。若不同,将不同处的偏移地址送DIFF字变量,否则将-1送DIFF。,STRING1 DB SDFASDGDHHFJH COUNT EQU $-STRING1 STRING2 DB WRFERGHRHTYJU DIFF DW 0 ,MOV AX,DATA MOV DS,AX MOV ES,AX,MOV SI,OFFSET STRING1 MOV DI,OFFSET STRING2 MOV CX,COUNT CLD,REPE CMPS STRING1,STRING2 MOV DIFF,-1 JE SAME DEC SI MOV DIFF,SI SAME: ret,第四章 程序设计的基本技术,.2,.1,.3,顺序程序设计,分支程序设计,循环程序设计,子程序设计,.,对于大型的复杂的程 序,往往是根据程序要实 现的若干主要功能将程 序化分为若干个相对独 立的模块。确定各模块 的入口及出口参数,为 各模块分配不同的名字 (入口地址),然后对每一模块编制独立的程序段子程序,最后将这些子程序根据调用关系连成一个整体,4.5 子程序设计,主程序(调用程序)调用子程序的程序 子程序(被调用程序)调用进入子程序的操作。 子程序返回子程序运行结束又回到主程序,4.5.1 子程序的概念,1.子程序将某些重复的或经常要使用的程序段设计成可供反复调用的独立程序段,子程序的调用与返回,实质上就是控制程序的转移,但不能使用前面的转移指令转移指令转走后,不再回到原来的地方,但子程序必须回到原来地方(断点)继续执行. 为此提供专用的调用指令和返回指令,2.主程序与子程序间的转返,参数主子程序互相传递的信息(可以是信息本身或信息的地址),分两类: 入口参数主程序提供给子程序以便加工处理的信息 原始数据. 出口参数经子程序加工处理后送回给主程序的信息处理结果. 传递方式为了传递参数,约定一种主子双方都能接受的参数传递方式:,3.主程序与子程序间的参数传递,(1)寄存器法,主程序与子程序间传递的参数都在约定的寄存器中传递单元在CPU内部. 在调用子程序前主程序将入口参数送约定寄存器中,子程序直接从这些寄存器中取得参数进行计算处理,经加工处理后得到的结果(出口参数)也放在约定寄存器中 ,返回主程序后,主程序直接到该寄存器中取得结果.该法简单直观,信息传递快,但寄存器个数有限,所以适用于参数较少的情况.,入口和出口参数都放在堆栈中传递单元在SS段. 调用前,入口参数由主程序送入堆栈,子程序从堆栈中取得这些参数进行处理,处理后的结果又送到堆栈中.返回主程序后,主程序从堆栈取得结果.此法不占用公共寄存器,也无需另外开辟单元,但因为子程序的返回地址也在堆栈中,所以一定要小心计算参数与地址,否则出错.,(2)堆栈法,入口出口参数存放在主程序的调用指令之后,即在CS段,书写指令时,用伪指令定义参数. 传递单元在CS段. 此时一定要注意区分参数与代码. 参数可以是信息本身直接赋值法;若信息较多,可以是信息的地址 间接赋值法. 有时主子之间无参数传递,子程序只是完成一个特定动作无参数子程序. 以上参数的传递方法各有优缺点,采用哪种方法,具体问题具体分析,有时,几种方法混合使用.,(3)参数赋值法,4主程序和子程序公用寄存器的问题,子程序要进行计算处理,自然要使用一些寄存器.子程序执行后,某些寄存器的内容会发生变化.如果主程序在这些寄存器中已经存放了有用信息,则子程序返回后,主程序的运行势必因原存放信息被破坏而出错,所以要保护寄存器中内容不被破坏保护现场;在子程序处理后,恢复寄存器的内容恢复现场. 保护现场恢复现场的工作可以在主程序中完成,也可以在子程序中完成:,PUSH AX PUSH BX 保护现场 PUSH CX 子程序工作部分 POP CX POP BX 恢复现场(注:先进后出) POP AX RET,如:某子程序要用到AX BX CX,可用进栈出栈实现保护与恢复现场.,(1)子程序中保护(一般用此法)在子程序开始,将子程序用到的所有寄存器的内容保护起来,在返回之前恢复这些寄存器的内容.,如:调用DEF子程序,主、子程序中均要使用AX,可用以下方法保护: PUSH AX ;保护现场 CALL DEF POP AX ;恢复现场 子程序结构: 保护现场取入口参数进行加工处理 存结果至指定单元(作出口准备)恢复现场返回,(2)在主程序中保护与恢复在调用前保护某些寄存器 的内容,返回后再恢复.,格式:CALL 子程序名 功能:将返回地址进栈,将程序控制转移到子程序 子程序名有类型属性:NEAR主子在同一段内,FAR主子在不同段.段内只改变IP,段间改变CS:IP,具体操作: 段内调用:IPSP-2,SP-2SP, OFFSET 子程序名IP 段间调用:CSSP-2,IPSP-4,SP-4SP SEG 子程序名CS,OFFSET 子程序名IP,4.5.2 子程序的调用指令与返回指令,1.直接调用指令,格式:CALL dest 功能:将返回地址进栈,将目的操作数的内容送IP或CS:IP(转移) 段内操作:IPSP-2,SP-2SP, REG16/MEM16IP 段间操作:CSSP-2,IPSP-4,SP-4SP MEM32IP, MEM32+2CS,2.间接调用指令,不管是直接或间接调用,执行CALL指令后,堆栈内容均发生变化:,格式:RET N 功能:将程序控制返回到主程序. N一般可省,有N表示返回后,再将SP+NSP,即废除N/2个无用字. 段内返回: SPIP, SP+2SP 段间返回: SPIP, SP+2CS, SP+4SP,3.返回指令,在进行子程序设计时,一般应对子程序加以说明,一般说明以下内容: 子程序名: 子程序功能: 入口参数: 出口参数:,4.5.3 子程序及其调用程序设计举例,例3.30 编制将键入的十进制数(065535)的ASCII码转换为16位二进制数的子程序,;子程序名:ABCDCB ;功能:将十

温馨提示

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

评论

0/150

提交评论