版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微机原理、汇编与接口技术,第三章 程序设计的基本技术,3.1,3.2,3.3,3.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,3.4,串处理程序设计,3.6,宏功能程序设计,顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致,3.1 顺序程序设计,格式:MUL source IMUL source ;符号整数乘法,3.1.1 乘除法指令,1.乘法指令MUL和符号整数乘法指令IMUL,源操作数 source可以是字节、字或双字,可为寄存器或存储器操作数,不能为立即数 目的操作数是AL、AX或EAX,视source的类型属性决定是AL、AX还是EAX 在乘法指令之前必须将
2、目的操作数送AL(字节乘)或AX(字乘) 或EAX(双字乘),8位或16位乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示,AL,sourc8,AX,AX,sourc16,AX,DX,3.1.1 乘除法指令,32位乘法指令所执行的操作是EAX乘以source,乘积放回到EDX和EAX,如下图所示,EAX,sourc32,EAX,EDX,可用乘法运算将BCD数转换为二进制数,3.1.1 乘除法指令,例 将AX中的3位BCD数转换为二进制数存入字节变量SB中,M0V CH,10 MOV CL,4 MOV SB,AL ;暂存十位和个位 MOV AL,AH ;
3、百位存入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或EDX和EAX,2.除法指令DIV和符号整数除法指令IDIV,3.1
4、.1 乘除法指令,8位或16位除法指令所执行的操作如下图所示,AL,sourc8,AX,AX,sourc16,AH,DX,3.1.1 乘除法指令,32位除法指令所执行的操作如下图所示,EAX,sourc32,EDX,可用除法运算(除10取余)将二进制数转换为BCD数,3.1.1 乘除法指令,例 将AL中的8位无符号二进制数转换为BCD数放入AX中,MOV AL,7DH 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(十位数)
5、 SHL AH,CL OR BH,AH ; BCD数十位与个位合并 MOV AH,0 DIV BL ; AH中余数为BCD数百位 MOV AL,BH ;BCD数十位与个位送AL,“除10取余”法,如,用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如下图所示,3. 扩展指令CBW和CWD,要把一个8位二进制数除以另一个8位二进制数,要有一个16位二进制数在AX中,所以做8位除以8位的除法前先要把8位被除数扩展为16位。做16位除以16位的除法前要把16位被除数扩展为32位,做32位除以32位的除法前要把32位被除数扩展为64位。这种扩展对于无符号数除法只需将AH或DX或ED
6、X清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。,3.1.1 乘除法指令,指令都隐含操作数 在做8位除以8位、16位除以16位、 32位除以32位的符号整数除法之前,应先扩展AL或AX或EAX中的被除数。 扩展指令和符号整数除法仅对补码数适用。,格式:CBW ; AL的最高位扩展至AH CWD ; AX的最高位扩展至DX CWDE ;AX的最高位扩展至EAX的高16位 CDQ ;EAX的最高位扩展至EDX,3.1.1 乘除法指令,如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:,MOV SI,OFFSET ARRAY MOV AX,S
7、I CWD IDIV WORD PTR 2SI MOV 4SI,AX MOV 6SI,DX,3.1.1 乘除法指令,3.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
8、 对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果。,1.BCD数加法调整指令DAA和AAA,格式: DAA 功能:将AL中的和调整为正确的压缩BCD数 调整规则: (AL0FH)9或AF=1,则AL加6; (AL0F0H)90H或CF=1,则AL加60H.,3.1.2 BCD数调整指令,(1)压缩BCD数加法调整,注: 该指令操作数隐含为AL,即只能对AL中的操作数据进行调整 对结果调整时要用到CF和AF两个标志位,所以调整指令应紧跟BCD数加法指令 DAA指令会影响标志 如: MOV AX,3456H ADD AL,AH ;AL8AH,AF0,CF0
9、 DAA ;AL90H,3.1.2 BCD数调整指令,例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
10、;AL46H, CF=1 MOV SUM+1,AL ;存百位和千位 MOV SUM+2,0 ;处理向万位的进位 RCL SUM+2,1,格式: AAA 功能:将AL中的和调整为正确的非压缩BCD数送AX 调整规则: (AL0FH)9或AF=1,则 (AL+6)0FHAL ,AH+1AH ; 否则,AL0FH AL ,AH不变.,(2)非压缩BCD数加法调整,3.1.2 BCD数调整指令,注: 同DAA指令,AAA指令的操作数也隐含为AL,且要紧跟加法指令 AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中,故执行该指令前应注意AH是否清0。 如:将两个BCD数的AS
11、CII码相加,得到和的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.2 BCD数调整指令,例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 SU
12、M,AL ;存个位 MOV AL,BYTE PTR W1+1 ;AL08H ADC AL,BYTE PTR W2+1 ; AL0FH,AF=0 MOV AH,0 AAA ;AL05H,AH MOV WORD PTR SUM+1,AX ;存十位和百位,格式: DAS 功能:将AL中的差调整为正确的压缩BCD数 调整规则: (AL0FH)9或AF=1,则AL减6; (AL0F0H)90H或CF=1,则AL减60H.,如: MOV AX,5643H SUB AL,AH ;AL=DEH,有借位 DAS ;AL=78H,保持借位,即134-56,2.BCD数减法调整指令DAS和AAS,(1)压缩BCD数
13、减法调整,3.1.2 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数减法调整,3.1.2 BCD数调整指令,格式: AAM 功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX 调整规则: AL / 0AH AH(十位), AL MOD 0AH AL(个位),如: MOV AL,63H AAM ;AX=
14、0909H,3.非压缩BCD数乘除法调整指令AAM和AAD,(1)乘法调整,3.1.2 BCD数调整指令,例3.3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,并将它存储到JJ字节变量中的程序。 程序段如下: W DW 0307H B DB 9 JJ DB 3 DUP(0) MOV AL,BYTE PTR W;AL=07H MUL B;AX=003FH AAM;AX=0603H MOV WORD PTR JJ,AX MOV AL,BYTE PTR W+1;AL=03H MUL B;AX=001BH AAM;AX=0207H ADD AL,JJ+1;07H+06H=0DH,
15、即AL=0DH AAA;进位直接加入AH!AX=0303H MOV WORD PTR JJ+1,AX,格式: 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.1.2 BCD数调整指令,例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数,并分
16、别存放到字变量QUOT和字节变量REMA中。程序段如下: W DW 0909H B DB 5 REMA DB 0 QUOT DW 0 MOV AX,W AAD;0909H63H DIV B;63H5=13H4,AL=13H,AH=04H MOV REMA,AH AAM;13H0109H MOV QUOT,AX,例3.5 从键盘键入09的任一自然数N,求其立方值并将其送显示器显示.,INPUT DB Please Input N(09): LFB DB 0 1 8 27 64 DB 125216343512729 N DB 0 MOV DX,OFFSET INPUT MOV AH,9 INT 2
17、1H,可用乘法运算实现,也可用查表法实现。查表法程序段如下:,3.1.3 顺序程序设计举例,MOV AH,1INT 21HMOV N,ALMOV AH,2MOV DL,0AHINT 21HMOV DL,NAND DL,0FHMOV CL,2SHL DL,CLMOV DH,0ADD DX,OFFSET LFBMOV AH,9INT 21H,例3.6 编写两个32位无符号数的乘法程序 程序如下: .386 stack segment stack USE16 stack dw 32 dup (0) stack ends data segment USE16 AB DD 12345678H CD DD
18、 12233445H ABCD DD 2 DUP(0) data ends,code segment USE16start proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV EAX, AB MUL CD MOV ABCD,EAX MOV ABCD+4, EDX retstart endpcode ends end start,第三章 程序设计的基本技术,3.1,3.3,3.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,3.4,串处理程序设计,3.6
19、,宏功能程序设计,3.2,顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的。常用改变标志指令和转移指令实现分支。,3.2 分支程序设计,通用格式:Jcond short_lable 操作:若满足条件,则OFFSET short_lableIP,实现转移;否则顺序执行. short_lable 短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128127(从本指令则为-126+129,因为条件转移指令均为双字节指令),故只能实现段内转移.,3.2.1 条件转移指令,仅判断一个标志位实现
20、转移.,1.简单条件转移指令,3.2.1 条件转移指令,如: JZ/JE S_LAB为零/相等转移 操作:测试前面操作结果为0则转移,即判ZF=1转移. JZ , JE为等价助记符,任写一种均可,可根据程序设计意图选择. 如: MOV BX , 0FFFFH INC BX ; ZF=1 JZ NEXT ; 为0转移到NEXT NEXT: ,3.2.1 条件转移指令,如:MOV BL , 1 ; CMP BL , 5 ; ZF=0 JE NEXT ; 比较结果相等则转移到NEXT ;不相等顺序执行 NEXT: 注: 此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指
21、令前,一定有一条能正确影响标志的指令.,3.2.1 条件转移指令,2.无符号数条件转移指令,条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确.,如:0FFH00H ? 视为无符号数 0FFH=255 00H ; 视为符号数 0FFH= -1 00H . 所以,应将两种类型的数分开比较: 对无符号数使用术语:低于/高于 Below/Above; 对带符号数使用术语:小于/大于 Less/Greater,3.2.1 条件转移指令,无符号数条件转移指令有4条(P93,表32): 指令助记符 功能 JB/JNAE 低于/不高
22、于等于转移 JNB/JAE 不低于/高于等于转移 JA/JNBE 高于/不低于等于转移 JNA/JBE 不高于/低于等于转移,3.2.1 条件转移指令,3.符号数条件转移指令,符号数条件转移指令有4条(P94,表33): 指令助记符 功能 JL/JNGE 小于/不大于等于转移 JNL/JGE 不小于/大于等于转移 JG/JNLE 大于/不小于等于转移 JNG/JLE 不大于/小于等于转移,3.2.1 条件转移指令,格式:JMP target 操作:将控制转向目的标号target: target在段内: target的偏移地址IP target在段外: target的偏移地址IP target的
23、段首址CS,条件转移范围为-128+127,而无条件转移指令没有范围限制. 在分支程序中往往需要它将各分支重新汇集到一起.,3.2.2 无条件转移指令,1.无条件直接转移指令,格式: JMP dest 操作: 目的操作数为寄存器寄存器内容送IP 目的操作数为字变量字变量内容送IP 目的操作数为双字变量双字变量内容送CS和IP 如: JMP NEXT ;无条件转移转到NEXT NEXT: 如: JMP WORD PTRBX ;即( BX ) IP,2. 无条件间接转移指令,3.2.2 无条件转移指令,分支实现的基本方法有两种:一种是利用比较转移指令实现分支;一种是利用跳转表实现分支. 视比较对象
24、,正确选择合适的转移指令. 要为每个分支安排正确出口. 凡是可共用的部分,应尽量放在公共程序段中以使程序简短. 在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.,3.2.3 分支程序设计举例,例3.7 编程计算下面函数值 (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
25、,例3.8 从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。 用乘法运算求一个数的N次方值来编制该程序。由于都是乘2操作,故用逻辑左移实现。设其初值为1,键入的N值就是对该初值移位的位数。求得的徝是一个二进制数,为了输出还要将二进制数转换为十进制数的ASCII码。其最大值是2的9次方,29=512,最大值的ASCII码占3个单元,再加上回车、换行和$,所以输出数据区OBUF最多6个单元。程序段如下: OBUF DB 6 DUP(0) MOV AH,1 INT 21H AND AL,0FH;将N转换为N,MOV CL,AL MOV AX,1 SHL AX,CL MOV B
26、X,5 MOV OBUFBX,$ MOV CX,10;转换为十进制数的ASCII码 AGAIN:MOV DX,0 DIV CX OR DL,30H DEC BX MOV BX,DL AND AX,AX JNZ AGAIN SUB BX,2 MOV WORD PTRBX,0A0DH ;存入回车换行 MOV DX,BX ADD DX,OFFSET OBUF MOV AH,9 INT 21H,例3.9 从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。 IBUF DB 3,0,3 DUP(0) SB DB 0 MOV DX, OFFSET IBUF ;键入2位十六进制数 MOV AH,
27、 10 INT 21H MOV AX, WORD PTR IBUF+2;键入字符送AX SUB AX, 3030H;字符变为十六进制数 CMP AL,0AH JB LNSUB7 SUB AL,7 LNSUB7: CMP AH,0AH JB LNSUB7 SUB AH,7 HNSUB7: MOV CL, 4 ;将AX中的数拼合成一个字节 SHL AL ,CL OR AL, AH MOV SB,AL,例3.10 某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实
28、现多分支; 另一种是跳转表法,直接实现多分支.,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是: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 A
29、L ,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的
30、入口地址PTAB2i 4 P2 若将2iBX,则JMP PTABBX : 可转到Pi入口处,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 AND AX ,0FH ; i2BX ADD AX ,AX MOV BX ,AX JMP PTABBX ;(PTAB2i)PiIP EXIT
31、:RET,P0: MOV DL, 0 ;键入0则显示0以替代P0程序 JMP DOWN P1: MOV DL, 1 ;键入1则显示1以替代P1程序 JMP DOWN P7: MOV DL , 7 DOWN: MOV AH , 2 INT 21H JMP EXIT,键入的ASC码为无符号数, 所以,用JB、JA等指令而不能用JG、JL等.,请思考:若为跨段标号,应修改哪些地方? 注:只需修改:DWDD(存IP、CS)、i2i4即可,第三章 程序设计的基本技术,3.1,3.2,3.5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,3.4,串处理程序设计,3.6,宏功能程序设计,3.3,四部
32、分: 循环准备(循环初始化) 建地址指针、置计数初值、设置必要的常数、对工作寄存器及工作单元置初值或清0等. 循环体 重复执行的部分,循环的核心. 循环的修改 修改计数器、寄存器、地址指针、恢复某些参数. 循环控制 判断控制循环是否结束或继续.,3.3 循环程序设计,循环程序的具体结构流程有两种:,3.3.1 循环程序的基本结构,如:编程统计字变量W中有多少位1,并将结果存入字节变量N中,方法一:先执行,后判断 MOV N,0 MOV CX,16 LOP: SHL W,1 JNC NOINC INC N NOINC:DEC CX JNZ LOP ret,方法二:先判断,后执行 MOV N,0
33、LOP: CMP W,0 JZ DONE SHL W,1 JNC LOP INC N JMP LOP DONE: ret,DEC CX JNZ LOP,循环控制方法最常见的有两种: 计数控制 循环次数已知,故可用某个寄存器或单元作为计数器, 用计数器的值来控制循环的结束与否. 如上例,方法一 条件控制 循环次数未知,即循环次数与循环体的执行情况有关,通过条件测试指令来测试是否满足循环条件,以控制循环是否结束. 如上例,方法二,3.3.1 循环程序的基本结构,此类指令的特点是: 循环次数由 CX计数器控制.循环指令本身不影响标志. 同条件转移指令一样,重复控制指令也是相对转移指令,重复控制指令的
34、目的地址必须在本指令地址的126129字节的范围之内.,3.3.2 重复控制指令, LOOP指令,格式: LOOP short-lable 操作:CX1CX, 当CX0则转short-lable 所指指令; 否则顺序执行. 注: 在使用LOOP指令前,必须把循环次数送入CX. LOOP shotr-lable= 若CX=0,则循环要进行65536次.,3.3.2 重复控制指令, LOOPZ / LOOPE指令,格式: LOOPZ / LOOPE short-lable 操作:CX1 CX , 当CX0 ,且ZF=1则转移;否则顺序执行. 注:本指令不影响ZF,ZF由前面指令设定.即前面比较结果
35、相等.,3.3.2 重复控制指令,格式: LOOPNZ/LOOPNE short-lable操作:CX1 CX , 当CX0 ,且ZF=0则转移;否则顺序执行.,格式:JCXZ short-lable 操作:CX=0转移,否则顺序执行. 注:指令本身不作减操作,本指令一般用在循环的开始处,当CX=0,则跳过循环., LOOPNZ / LOOPNE指令, JCXZ指令,3.3.2 重复控制指令,(注意循环结构,防止死循环),下面通过几个例题介绍循环控制 计数控制 条件控制 计数与条件双重控制 对于某些问题,还有一些特殊控制,如:设开关变量等,可参其他教材.,3.3.3 单重循环程序设计举例,例3
36、.11 计算 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;清CF,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 编
37、写将某数据区十六进制数加密的程序.每个数字占一个字节,分析: 设加密数关系如下: 十六数: 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 ; 待发数 N EQU $ - HEXS ; 统计待发数个数 JMH DB N DUP(0) ; 存加密
38、数 JMB DB 0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CH MOV CX,N MOV BH,0 初始化 MOV SI,0 AGAIN: MOV BL,HEXSSI ; 取待发数 MOV AL,JMBBX ; BX+AL AL MOV JMHSI,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,0F
39、H,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 将字节变量SB中的8位二进数送显示器显示.,分析: 先将字节变量中的1位二进制数移入AH中,再将移入的二进制数变为ASCII码。为了避免通过CF来传递二进制数,先将SB中的8位二进制数送入AL中,再左移AX,将1位二进制数直接移入AH中。,SB DB 9AH OBUF DB 9 DUP(0),MOV CX, 8 MO
40、V 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,MOV AH,18H SHL AX,1,例3.14 将键入的十进制数(3276832767)转换为二进制数。,算法:十进制数二进制数: 反复10+Di循环体 D4D3D2D1D0=D4104D3103 D0 (010+D4)10+D3)10+D2)10+D1)10+D0 循环次数 输入负数输入字符个数1; 输入正数(不带
41、符号)输入字符个数 循环体中对其绝对值转换为二进制数,若为负数还应求补,BINARY DW 0 OBUF DB INPUT A DECIMAL(3276832767):$ IBUF DB 7,0 ,7 DUP(0) 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
42、;越过“-”指向数字 DEC CX ;实际字符数少1(“-”号),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 ;非0即为正数,则不求补 NEG AX ; 负数对其绝对值求补 NNEG: MOV BINARY ,AX ;存放结果,例3.15 对多个字符号数求和,结果不超出双字符号数,以十六进制数的形式显示
43、其结果。.386stacksegment stack USE16 stack dw 32 dup(0)stackendsdatasegment USE16NUMDW 1111H,2222H,3333H,4444H,5555HDW 6666H,7777H,8888H,9999HCOUNTEQU ($-NUM)/2RESULTDD 0OBUFDB 10 DUP(0)dataends,codesegment USE16beginproc farassume ss:stack,cs:code,ds:datapush dssub ax,ax push axmov ax,datamov ds,axMOV
44、CX,COUNTMOV EBX,0AGAIN1:MOVSX EAX,NUMEBX*2ADD RESULT,EAXINC EBXLOOP AGAIN1MOV DI,OFFSET OBUF,MOV CX,8 ;将十六进制数拆字符AGAIN2:ROL RESULT,4MOV AL,0FHAND AL,BYTE PTR RESULTADD AL,30HCMP AL,39HJNA NA7ADD AL,7NA7:MOV DI,ALINC DILOOP AGAIN2,MOV WORD PTRDI,$HMOV BX,OFFSET OBUF-1 ;去掉前面的0CONT: INC BXCMP BYTE PTR B
45、X,0JE CONTMOV DX,BXMOV AH,9INT 21Hretbeginendpcodeendsend begin,例3.19 将存储器中的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
46、;被除数扩展(无号符数扩展) 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),应如何修改程序? 键入(0FFFFH)将字符串变换为真值存入某单元转换输出. 2.若改为键入补码(8000H7FFFH,即3276832767的符号数),应如何修改程序? 键入(8000H7FFFH)将字符串变换为真值存
47、入某单元判符号(正、负) 对绝对值进行转换判正负输出,多重循环即循环体内再套有循环.,例3.22 对字节变量BUF中存放的n 个字节符号数排序,3.3.4 多重循环程序设计举例,将第1个单元中的数与其后n1个单元中的数逐个比较,每次比较之后总是把较大的数放在一个寄存器中,经过n1次比较之后得到n个数中的最大数,存入第1个单元。接着将第2个单元中的数与其后的n2个单元中的数逐个比较,经过n2次比较得到n1个数的最大数(亦即n个数中的第2大数)存入第2个单元.,BUF DB 20 ,19 ,250 COUNT EQU $-BUF MOV SI ,OFFSET BUF MOV DX ,COUNT-1
48、 ;外循环初始化 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,第三章 程序设计的基本技术,3.1,3.3,3.2,顺序程序设计,分支程序设计,循环程序设计,子程序设计,3.4,串处理程序设计,3.6,宏功能程序设计,3.5,对于大型的复杂
49、的程 序,往往是根据程序要实 现的若干主要功能将程 序化分为若干个相对独 立的模块。确定各模块 的入口及出口参数,为 各模块分配不同的名字 (入口地址),然后对每一模块编制独立的程序段子程序,最后将这些子程序根据调用关系连成一个整体,3.5 子程序设计,主程序调用子程序的程序 子程序调用进入子程序的操作,子程序运行结束又回到主程序即子程序返回,3.5.1 子程序的概念,子程序将某些重复的或经常要使用的程序段设计成可供反复调用的独立程序段,子程序的调用与返回,实质上就是控制程序的转移,但不能使用前面的转移指令转移指令转走后,不再回到原来的地方,但子程序必须回到原来地方(断点)继续执行.为此提供专
50、用的调用指令和返回指令,1.主程序与子程序间的转返,3.5.1 子程序的概念,参数主子程序互相传递的信息(可以是信息本身或信息的地址),分两类: 入口参数主程序提供给子程序以便加工处理的信息 原始数据. 出口参数经子程序加工处理后送回给主程序的信息处理结果. 传递方式为了传递参数,约定一种主子双方都能接受的参数传递方式:,2.主程序与子程序间的参数传递,3.5.1 子程序的概念,(1)寄存器法,主程序与子程序间传递的参数都在约定的寄存器中传递单元在CPU内部. 在调用子程序前主程序将入口参数送约定寄存器中,子程序直接从这些寄存器中取得参数进行计算处理,经加工处理后得到的结果(出口参数)也放在约
51、定寄存器中 ,返回主程序后,主程序直接到该寄存器中取得结果.该法简单直观,信息传递快,但寄存器个数有限,所以适用于参数较少的情况.,3.5.1 子程序的概念,入口和出口参数都放在堆栈中传递单元在SS段. 调用前,入口参数由主程序送入堆栈,子程序从堆栈中取得这些参数进行处理,处理后的结果又送到堆栈中.返回主程序后,主程序从堆栈取得结果.此法不占用公共寄存器,也无需另外开辟单元,但因为子程序的返回地址也在堆栈中,所以一定要小心计算参数与地址,否则出错.,(2)堆栈法,3.5.1 子程序的概念,入口出口参数存放在主程序的调用指令之后,即在CS段,书写指令时,用伪指令定义参数. 传递单元在CS段. 此
52、时一定要注意区分参数与代码. 参数可以是信息本身直接赋值法;若信息较多,可以是信息的地址 间接赋值法. 有时主子之间无参数传递,子程序只是完成一个特定动作无参数子程序. 以上参数的传递方法各有优缺点,采用哪种方法,具体问题具体分析,有时,几种方法混合使用.,(3)参数赋值法,3.5.1 子程序的概念,3主程序和子程序公用寄存器的问题,子程序要进行计算处理,自然要使用一些寄存器.子程序执行后,某些寄存器的内容会发生变化.如果主程序在这些寄存器中已经存放了有用信息,则子程序返回后,主程序的运行势必因原存放信息被破坏而出错,所以要保护寄存器中内容不被破坏保护现场;在子程序处理后,恢复寄存器的内容恢复
53、现场. 保护现场恢复现场的工作可以在主程序中完成,也可以在子程序中完成:,3.5.1 子程序的概念,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 ;恢复现场 子程序结构: 保护现
54、场取入口参数进行加工处理 存结果至指定单元(作出口准备)恢复现场返回,(2)在主程序中保护与恢复在调用前保护某些寄存器 的内容,返回后再恢复.,格式:CALL 子程序名 功能:将返回地址进栈,将程序控制转移到子程序 子程序名有类型属性:NEAR主子在同一段内,FAR主子在不同段.段内只改变IP,段间改变CS:IP,具体操作: 段内调用:IPSP-2,SP-2SP, OFFSET 子程序名IP 段间调用:CSSP-2,IPSP-4,SP-4SP SEG 子程序名CS,OFFSET 子程序名IP,3.5.2 子程序的调用指令与返回指令,1.直接调用指令,格式:CALL dest 功能:将返回地址进
55、栈,将目的操作数的内容送IP或CS:IP(转移) 段内操作:IPSP-2,SP-2SP, REG16/MEM16IP 段间操作:CSSP-2,IPSP-4,SP-4SP MEM32IP, MEM32+2CS,2.间接调用指令,3.5.2 子程序的调用指令与返回指令,不管是直接或间接调用,执行CALL指令后,堆栈内容均发生变化:,3.5.2 子程序的调用指令与返回指令,格式:RET N 功能:将程序控制返回到主程序. N一般可省,有N表示返回后,再将SP+NSP,即废除N/2个无用字. 段内返回: SPIP, SP+2SP 段间返回: SPIP, SP+2CS, SP+4SP,3.返回指令,3.5.2 子程序的调用指令与返回指令,在进行子程序设计时,一般应对子程序加以说
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026安仁县湖南郴州市花鼓戏保护传承中心招聘演职人员6人备考题库及答案详解(真题汇编)
- 2026广东云浮市招募就业见习人员299人备考题库完整答案详解
- 2026湖北黄石市华新医院招聘2人备考题库含答案详解(精练)
- 2026云南玉溪市中山医院第二批就业见习岗位招募12人备考题库附答案详解(a卷)
- 2026年济宁汶上县事业单位公开招聘工作人员(教育类)备考题库(52人)含答案详解(夺分金卷)
- 2026新疆兵团兴新职业技术学院面向高校毕业生招聘37人备考题库含答案详解(满分必刷)
- 2026贵州黔南州企事业单位人才引进268人备考题库含答案详解(满分必刷)
- 2026湖北民族大学附属民大医院招聘专业技术人员9人备考题库含答案详解(b卷)
- 2026四川宜宾市筠连县事业单位第一次引进高层次人才50人备考题库含答案详解
- 2026新疆博尔塔拉州博乐市新宏业汽车销售有限责任公司招聘5人备考题库含答案详解(达标题)
- 2026深圳中考历史考前冲刺卷含答案
- 2026哈尔滨兰兴资产运营管理有限公司公开招聘备考题库(含答案详解)
- 卫生院信用管理工作制度
- 2026年新疆投资发展集团有限责任公司校园招聘笔试备考试题及答案解析
- 2026四川省现代种业发展集团成都农业开发有限公司社会化招聘拟人员笔试历年典型考点题库附带答案详解
- 物流公司运输调度工作流程
- 血液内科三基三严考试题库及答案
- 【《中国智能手机出口现状分析概述》3000字】
- DB43-T 3447-2025 烟花爆竹生产企业对标改造技术指南
- 电力系统概述课件
- 道路桥梁建设进展调研报告
评论
0/150
提交评论