第三章 程序设计的基本技术_第1页
第三章 程序设计的基本技术_第2页
第三章 程序设计的基本技术_第3页
第三章 程序设计的基本技术_第4页
第三章 程序设计的基本技术_第5页
已阅读5页,还剩176页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章第三章 程序设计的基本技术程序设计的基本技术 同高级语言一样,汇编语言程序的基本结构有:顺序程序,分支程序,循环程序。 解题的基本步骤也基本相同。 3.1 顺序程序设计顺序程序设计 以直线方式一条指令接着一条指令顺序执行。常用的算术运算大多可用顺序程序来解决。所以先介绍乘除指令与十进制运算指令。一一. 乘除指令乘除指令 对加减运算,带符号数和不带符号数运算指令相同(只要字节够);对于无符号,关心 CF,可知结果正确与否;对带符号数,关心OF,SF 可知结果正确与否,且知正负。但乘除运算则不行,为此8088提供了带符号与不带符号的乘除指令。 1. 无符号数乘法无符号数乘法(MULtiply

2、) 格式:MUL SRC 2. 带符号数乘法(带符号数乘法(Signed Integer MULtiply) 格式: IMUL SRC 操作: 字节运算 AL (SRC) AX 字运算 AX (SRC) DX:AX 有一个操作数隐含,即被乘数和乘积都在规定的寄存器中,源操作数只能是寄存器或存储器,且类型明确,不能为立即数. 当 CF=OF=1 时,不表示进位和溢出,而表示乘积已不是8位或16位,即高位为有效位.例例 . IMUL BX ; AXBXDX:AX MUL 25 IMUL SI IMUL BYTE PTR SI ; AL(SI) AX 两指令的操作相同,只是操作数是否带符号,但对同一

3、操作数进行操作,结果不一致。应视操作对象 ,正确选择指令。 例例1 . MOV AL , 0B4H ; 视做带符号数 76 MOV BL , 11H ; 视做带符号数 17 IMUL BL ;AX=76*17=1292=0FAF4H 补码 ;CF=OF=1 表示AH内容为有效位例例2. MOV AL , 0B4H ; 视B4H为无符号180 MOV BL , 11H ; 视11H为无符号数 17 MUL BL ; ; AX=180*17=3060=0BF4H 实际上,对带符号数进行运算,可理解(内部过程),先对数求其绝对值,再进行二进制乘,再求补,得其补码结果。对无符号数乘则直接进行二进制运算

4、。 无符号数的乘法指令可用于多倍精度的乘法操作(由乘移位,加实现)。多倍精度的负数乘,则只能将它们的绝对值用无符号乘法实现后,再求补。 事实上,乘积的字长相对操作数来说总是加倍的 乘法不会产生溢出。 例、将AX中的3位BCD数转换为二进制数SB。D2102D110D0(D210D1)10D0SB DB ?MOV AX,0125HM0V CH,10MOV CL,4MOV SB,AL 暂存MOV AL,AHMUL CHMOV AH,SBSHR AH,CLADD AL,AHMUL CH (D210D1)10ALAND SB,0FHADD SB,ALD210ALD210D1AL(D210D1)10D0

5、SB7DH3. 无符号除法无符号除法 格式 :DIV SRC4. 带符号数除法带符号数除法 格式: IDIV SRC 商 AL 操作:字节运算 AX (SRC) 余数 AH 商 AX 字运算 DX:AX(SRC) 余数 DX被除数,商,余数均隐含; 源操作数类型明确。 对同一操作数进行两种运算结果不同。 除法运算可能产生溢出,但OF标志不能标志这种溢出(除法对状态标志未定义),而由溢出中断来指示,若溢出,则立即停止程序的执行。 MOV AX , 0F252H MOV BL,20H DIV BL MOV AX,0F252H MOV DX,0 ;无符号数扩展,高位直接送0即可。 MOV BX ,

6、20H ; DIV BX ; 应使用字运算才正确 例.计算无符号数 0F252H20H产生溢出,商255,AL存放不下例、将AL中的8位无符号数转换为压缩型BCD数AX。除10取余数便得BCD数。MOV AL,7DHMOV CL,4MOV BL,10MOV AH,0 扩展被除数为字类型DIV BL 商AL,余数AH(个位数)MOV BH,AH ;个位暂存MOV AH,0 ;再扩展被除数DIV BL 商AL(百位数),余数AH(十位数)SHL AH,CLOR BH,AHMOV AH,ALMOV AL,BH ;AX0125H合并十位与个位BH二二.带符号数的符号扩展指令带符号数的符号扩展指令1.将

7、字节扩展成字将字节扩展成字 格式:CBW 操作:将AL中的符号扩展至AH中。2.将字转换成双字将字转换成双字 格式:CWD 操作:将AX中符号扩展至DX中。两指令都是隐含寻址,即被扩展数在AL或AXAX 或 DX:AX MOV AX ,4001H;对带符号数一定使用符号扩展指令CWDMOV CX , 4IDIV CX ; 若用字节除则产生溢出例例. 实现单精度的四则混合运算实现单精度的四则混合运算 U(X*Y+Z540)/XAXDX, 已知已知U,X,Y,Z均为带符号数。均为带符号数。DATA SEGMENT U DW 7FFFH X DW 50 Y DW 1000 Z DW 80 DATA

8、ENDSMOV AX , XIMUL YMOV CX , AX XYBX:CXMOV BX , DXMOV AX,Z Z扩展DX:AXCWDADD CX , AX XYZBX:CXADC BX , DXSUB CX , 540 XYZ540BX:CXSBB BX , 0MOV AX , U U扩展DX:AXCWDSUB AX , CXSBB DX , BX U()/XAXDXIDIV X作业:P.164. 1.(2)(视为无符号数) (3)(视为带符号数)三三. BCD数调整指令数调整指令 BCD运算是逢十进一,而四位二进制数运算是逢16进一,而计算机总是按二进制规律运算,所以对BCD运算,要

9、进行调整,由调整指令来实现。(一)、压缩型一)、压缩型BCD数运算(一个字节存放两位数运算(一个字节存放两位十进制数)十进制数)1. 压缩型压缩型BCD加法调整加法调整格式: DAA操作:将AL中的和调整为BCD数AL调整规则: (AL AND 0FH)9或辅助进位AF=1,则AL加6;(AL AND 0F0H)90H或CF=1,则AL加60H.例例. 87+39=126AX XOR AH , AH MOV AL,87H ;ALC0H ADD AL,39H ;AF1,CF0 DAA ; CF1 RCL AH,1 ;AX0126H该指令操作数隐含为AL,即只能对AL调整,以AL为目的。调整时要用

10、到CF,AF标志,所以调整指令应紧跟ADD指令。DAA指令会影响标志。 1000 0111 0011 1001 1100 0000 0110 0110 1 0010 0110 格式:DAS操作:将AL中的差调整为BCD数AL调整规则:(AL AND 0FH)9或AF=1,则AL减6 (AL AND 0F0H)90H或CF=1,则AL减60H例例.4位压缩型位压缩型BCD数加减运算(设不向更高位产数加减运算(设不向更高位产生进位或借位)。生进位或借位)。 如:如: 3754+5219-4981=39922、压缩型、压缩型BCD减法调整减法调整DATA SEGMENTBCD1 DB 54H , 3

11、7HBCD2 DB 19H , 52HBCD3 DB 81H , 49HBCD DB ? , ?DATA ENDSMOV AL , BCD1ADD AL , BCD2DAAMOV BCD , ALMOV AL , BCD1+1ADC AL , BCD2+1DAAMOV BCD1,AL完成5419BCD单元完成3752BCD1单元MOV AL , BCDSUB AL , BCD3DASMOV BCD , ALMOV AL , BCD+1SBB AL , BCD3+1DASMOV BCD+1 , AL只能对AL调整 ,BCD运算只能是字节运算。注意算法即运算步骤:一个数运算完成后,才能运算第二个数

12、;先运算低字节,后运算高字节,高字节带进位加减。完成减81BCD完成减49BCD1(二)、非压缩型(二)、非压缩型BCD数运算指令(又称数运算指令(又称ASCII码码BCD运算运算) 压缩型BCD没有乘除调整, 找不到一种简便算法,要实现压缩型BCD乘除运算时,往往是先转换成等效的二进制数,再进行二进制乘除运算,然后再转换成压缩型BCD数。而非压缩型BCD数一个数字占一个字节,可进行加、减、乘、除运算.1.加法调整加法调整 格式:AAA 操作;将AL中的和调整为BCDAL, AH加调整时出现的一位BCD进位AH 调整原则:(AL AND 0FH)9或AF=1,则 (AL+6) AND 0FHA

13、L , AH+1AH , 且CF=1 , AF=1.此进位同时体现在CF调整后的存放规律可理解为调整后的十位数,即进位加到AH中,个位数AL 一般执行该指令前AH应为0(若原不为0,也是加上调整的进位)。调整时要用到标志, 应紧跟ADD指令.例例. 非压缩非压缩BCD运算,运算,如:如: 89+67=156BCD1 DW 0809HBCD2 DW 0607HBCD3 DB 3 DUP(?)MOV AL , BYTE PTR BCD1 ;AL09HADD AL , BYTE PTR BCD2 ; AL10H,AF=1AAA ; AL06H,CF=1 MOV BCD3 , AL ;存个位MOV A

14、L , BYTE PTR BCD1+1 ;AL08HADC AL , BYTE PTR BCD2+1 ; AL0FH,加低位CYAAA ;AL05H,CF1MOV BCD31,AL ;存十位MOV BCD32,0 RCL BCD32,1 ;存百位,(BCD3)010506BCD 调用AAA指令,因为进位既加到了AH中,又体现在CF中,所以对进位(高位)的处理有多种方法。 MOV AH,0 : MOV BCD3+2 , AH ; 进位AH即高位 MOV BCD3+2 , 0 ;进位CF即高位 RCL BCD3+2 , 1 MOV BCD3+2 , 0 ;进位CF即高位 ADC BCD3+2 ,

15、0 2. 减法调整减法调整格式:AAS操作:将AL中的差调整为BCDAL, AH减调整时产生的借位AH调整原则:若 (AL AND 0FH)9 或AF=1 则(AL-6) AND 0FHAL , AH-1AH , CF=1, AF=1同样应紧跟SUB或SBB指令.此借位同时体现在CF3. 乘法调整乘法调整格式:AAM操作:将AL中的积调整为BCDAX调整原则:AL/10 商AH 即十位 余数AL即个位两位非压缩型BCD数的max=9*9=81,对于AL中小于100=64H的二进制数都能调整为BCD,且与标志无关, 不一定紧跟MUL指令使用。例例. 9*8=72AXMOV AL , 9MOV B

16、L , 8MUL BL ;AX0048HAAM ; AX=0702BCD例例. MOV AX , 0FFH AAM MOV CL , AL MOV AL , AH AAM ; AH:AL:CL=020505BCDAAM即等效于10,凡是将字节数变换成BCD数均可用此指令来实现.4. 除法调整除法调整 格式: AAD操作:将AX中的BCD数变换成二进制数AL调整原则:AH*10+ALAL , 0AH此指令实际上是对被除数进行预调整,即将两位非压缩BCD数变换成二进制形式集中在AL中.例例. 773=252BCDW DW 0707H BCDB DB 03HR DB ?Q DW ?MOV AX ,

17、BCDW ; AX=0707HAAD ; AX=004DHDIV BCDB ; AX=0219HMOV R , AH ;存余数AAM ; AX=0205HMOV Q , AX ;存商四四. 顺序程序设计举例顺序程序设计举例例例1. 非压缩型非压缩型BCD乘法运算,如乘法运算,如: 29*9=261,并显示并显示 结果。结果。参见参见P、82 例例3、3 算法: 29 9 81 18 261 W DW 0209H B DB 9 JJ DB 3 DUP(?) JJS DB 3 DUP(?), MOV AL , BYTE PTR WMUL BAAMMOV JJ , ALMOV JJ+1 , AHMO

18、V AL , BYTE PTR W+1MUL BAAMADD AL , JJ+1AAAMOV JJ1,AL ;存十位数MOV JJ2,AH ;存百位数 十位AHJJ199 个位ALJJ 百位AH29 十位AL十位合并,调整时的进位自动加在AH中MOV AL , JJADD AL , 30HMOV JJS+2 , ALMOV AL , JJ+1ADD AL , 30HMOV JJS+1 , ALMOV AL , JJ+2ADD AL , 30HMOV JJS , ALLEA DX ,JJSMOV AH , 9INT 21HRET个位数ASCII存显示区的最低位十位数ASCII存显示区的次低位百位

19、数ASCII存显示区的最高位显示结果:261注注:光标只能从左到右移动,光标只能从左到右移动, 数字字符应从高到低存放数字字符应从高到低存放。教材中例题均可增加显示,在DOS下运行直观显示结果.如何将运算结果(数值),ASCII字符显示的方法可参见实验教材第二章。例2、(教材P85、例3、6)从键盘键入09的任一数,求其立方值并显示。INPUT DB Please Input N(09): LFB DB 0 1 8 27 64125 DB 216 343512729 N DB ? MOV DX,OFFSET INPUT MOV AH,9 INT 21H MOV AH,1 INT 21H MOV

20、 N,AL MOV AH,2 MOV DL,0AH INT 21H显示提示信息键入一个数N输出换行AND DL,0FHMOV CL,2SHL DL,CLMOV DH,0ADD DX,OFFSET LFBMOV AH,9INT 21H查表技术是最常用的算法,凡是难以找到简便的数学方法的时候,都可以用查表法来实现。作业:P164. 2.(2),(4) P165. 3. 4. 5. 8. * *9.N4DX显示(LFB4N)单元的内容,直到结束3.2 分支程序设计 顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支。汇编中的分支的条件往往是通过标志的不同状态而

21、反映的。常用判断标志指令和转移指令实现分支。一一.条件转移指令条件转移指令通用格式:Jcond S_LAB操作:若满足cond条件,则将S_LAB标号的偏移地址IP,即转移,否则顺序执行。cond条件是:判5个条件标志ZF,SF,OF,PF,CF成立/不成立,可以判单个标志,也可以判多个标志 ,因而有多条指令。S_LAB短距离标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128+127(从本指令则为-126+129,因为条件转移指令均为双字节指令), 只能在段内转移。(一)一).简单条件转移简单条件转移仅判断一个标志转移,5种条件标志,成立/不成立,有10种状态,有10种指令

22、。 参见教材:P88、表31例例. JZ/JE S_LAB为零为零/相等转移相等转移操作:操作:测试前面操作结果为测试前面操作结果为0则转移则转移,即判,即判ZF=1转移,即转移,即A=B转移转移 。 JZ , JE为等价助记符,任写一种均可,可根据为等价助记符,任写一种均可,可根据程序设计意图选择。程序设计意图选择。例例. MOV BX , 0FFFFH 0 INC BX ; ZF=1 ;ZF=0 JZ NEXT ; 为0转移到NEXT ; 不为0顺序执行 NEXT: 例例. MOV BL , 1 ; 5 CMP BL , 5 ; ZF=0 ;ZF=1 JE NEXT ; 比较结果相等则转移

23、到NEXT ;不相等顺序执行NEXT: 此类指令,均指测试前面的操作结果所设标志,本指令不影响标志 在条件转移指令前,一定有一条能正确影响标志的指令。(二二). 无符号数条件转移指令无符号数条件转移指令 条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是带符号数,否则答案不明确。如: 0FFH0FH ? 视为无符号数 0FFH=255 0FH=15 成立; 视为带符号数 0FFH= -1 0FH=15 不成立。 应将两种类型的数分开比较,提供两类指令:对无符号数使用术语: 低于/高于 Below/Above.判CF,ZF对带符号数使用术语:

24、小于/大于 Less/Greater,判SF,OF,ZF无符号数条件转移指令(P89,表32):JB/JNAE S_LAB,判两个无符号数A B转移,CF=0且ZF=0转JAE/JNB S-LAB,判两个无符号数AB转移,CF=0且ZF=1转 (三)(三).带符号数条件转移指令(带符号数条件转移指令(P89,表,表33) 这类指令的判断依据是这类指令的判断依据是SF,OF,ZF。JL/JNGE S_LAB,判两个带符号数AB转移。JGE/JNL S_LAB,判两个带符号数A B转移。 注意:一定要注意:一定要视操作对象,正确使用指令,比较指令本视操作对象,正确使用指令,比较指令本身并不区分对象

25、是否带符号,它只设标志,要由条件转身并不区分对象是否带符号,它只设标志,要由条件转移指令来区分比较对象。移指令来区分比较对象。例:MOV AL , -12 ;ALF4H CMP AL , 20H JA NEXT ; NEXT: 一般由题意给定是否带符号数,如地址,ASCII码,循环次数,多倍精度数的低位等都被视为无符号数。当用JA时,视AL=F4H为无符号数20H条件成立,转移; 当用JG时,视AL=F4H为带符号数20H不成立, 顺序执行。二二. 无条件转移指令无条件转移指令无条件地使CPU转移到某目的地址处执行。它虽然不能构成分支,但在分支程序中往往需要它将各分支的出口重新汇集到一起时使用

26、。.无条件直接转移无条件直接转移格式:JMP LAB操作:直接转到LAB处: LAB在段内: LAB的偏移地址IP LAB在段外: LAB的偏移地址IP LAB的段地址CS 2.2. 无条件间接转移无条件间接转移格式格式: JMP DSP 通过各种寻址方式通过各种寻址方式 获得获得转转移地址。移地址。操作操作: 目的操作数为寄存器目的操作数为寄存器寄存器内容寄存器内容IP 目的操作数为字变量目的操作数为字变量字变量内容字变量内容IP 目的操作数为双字变量目的操作数为双字变量双字变量内容双字变量内容CS:IP 条件转移范围条件转移范围-128128+127,127,而而JMPJMP可在可在32K

27、32K或跨段转或跨段转移。移。例例. JMP NEXT ; 无条件转移转到NEXT NEXT: 例. JMP WORD PTRBX ;即( BX ) IP三三.分支程序设计举例分支程序设计举例 分支实现的基本方法有两种分支实现的基本方法有两种:一种是利用比较转一种是利用比较转转移指令实现分支;一种是利用跳转表实现分支。转移指令实现分支;一种是利用跳转表实现分支。 视视比较对象,正确选择合适的转移指令。比较对象,正确选择合适的转移指令。 要为每个分支安排正确出口。要为每个分支安排正确出口。 凡是可共用的部分,应尽量放在公共程序段中凡是可共用的部分,应尽量放在公共程序段中以使程序简短。以使程序简短

28、。 在调试分支程序时,应使用多组数据,分别对在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试。各种分支进行反复测试。例1、2个字节变量相减,以16进制形式显示其结果。A DB 0C5HB DB 37HD DB ?MOV AL,ASUB AL,BMOV D,ALMOV DL,DAND DL,0F0HMOV CL,4SHR DL,CLCMP DL,0AHJB NAD7ADD DL,7NAD7:ADD DL,30H MOV AH,2 INT 21H MOV DL,D AND DL,0FH CMP DL,0AH JB ND7 ADD DL,7ND7: ADD DL,30H MOV AH,2

29、 INT 21H MOV DL,H INT 21H A-BD显示高位字“8“显示低位字“E“显示“H“例例2: 显示显示“ContinuanceContinuance(Y/NY/N)?)?$”$”, 回答回答Y Y,则显示:,则显示:“Continuance Continuance !”, 回答回答N N,则显示:,则显示:“Stop !”Stop !”比较对象为字符,只比较相等否,比较对象为字符,只比较相等否,选用简单条件转选用简单条件转移指令即可。移指令即可。此例此例利用比较转移指令实现分支。利用比较转移指令实现分支。OBUF DB ContinuanceOBUF DB Continuan

30、ce(Y/N)Y/N)?$ $ CONT DB Continuance CONT DB Continuance !$STOP DB Stop STOP DB Stop ! AGAIN: LEA DX,OBUFLEA DX,OBUF MOV AH ,9 MOV AH ,9 INT 21H INT 21H MOV AH ,1MOV AH ,1 INT 21H INT 21H PUSH AXPUSH AX ; MOV DL ,0AHMOV DL ,0AH MOV AH ,2 MOV AH ,2 INT 21H INT 21H MOV DL ,0DHMOV DL ,0DH MOV AH ,2 MOV

31、AH ,2 INT 21H INT 21H POP AXPOP AX ; 保护输入字符保护输入字符AL,以免后面以免后面INT 21H调用会破坏调用会破坏AL输入输入Y/N显示Continuance(YN)?输出换行输出回车恢复输入的AL值 CMP AL , y CMP AL , y JE YES JE YES CMP AL , Y CMP AL , Y JE YES JE YES CMP AL , n CMP AL , n JE NO JE NO CMP AL , N CMP AL , N JE NO JE NO JMP AGAIN JMP AGAIN ; YES: LEA DX ,CONT

32、YES: LEA DX ,CONT JMP EXIT JMP EXITNO: LEA DX ,STOP NO: LEA DX ,STOP ;EXIT: MOV AH , 9EXIT: MOV AH , 9 INT 21H INT 21H RET RET判断是否Y字符判断是否N字符输入Y或N方能退出程序,否则一直循环输入Y则显示Continuance !输入N则显示Stop !例例3. (P91、例、例3、9)某工某工厂的产品有厂的产品有8种不同种不同的加工处理程序的加工处理程序P0P0P7P7,根据键盘输入,做不同,根据键盘输入,做不同的处理,若是的处理,若是0 07 7以外的键,则退出加工处

33、理以外的键,则退出加工处理。 此例可以用两种方法实现此例可以用两种方法实现: :一种是用一种是用逐一比较逐一比较判断判断, ,逐次比较逐次比较转移实现二叉分支、整体上实现转移实现二叉分支、整体上实现多分支多分支; 另一种是另一种是跳转表法跳转表法,直接实现多分支。直接实现多分支。方法一方法一逐一比较法逐一比较法。INPUT DB Input( 0INPUT DB Input( 07): $7): $ LEA DX , INPUT LEA DX , INPUT MOV AH , 9 MOV AH , 9 INT 21H INT 21H MOV AH , 1MOV AH , 1 INT 21H I

34、NT 21H CMP AL , 0 CMP AL , 0 JE P0 JE P0 CMP AL , 1 CMP AL , 1 JE P1 JE P1 CMP AL , 2 CMP AL , 2 JE P2 JE P2 CMP AL , 3 CMP AL , 3 JE P3 JE P3 CMP AL , 4 CMP AL , 4 JE P4 JE P4 CMP AL , 5 CMP AL , 5 JE P5 JE P5 显示提示等待键入一个字符为0字符则转P0为1字符则转P1 CMP AL , 6 CMP AL , 6 JE P6 JE P6 CMP AL , 7 CMP AL , 7 JE P

35、7 JE P7 JMP DOWNJMP DOWN ;不是;不是0 07 7则退出程序则退出程序P0: MOV DL , 0 P0: MOV DL , 0 JMP EXIT JMP EXITP1: MOV DL , 1 P1: MOV DL , 1 JMP EXIT JMP EXIT P7: MOV DL , 7 P7: MOV DL , 7 JMP EXIT JMP EXITEXIT: MOV AH ,2EXIT: MOV AH ,2 INT 21H INT 21HDOWN: RET DOWN: RET ;分支程序一定要注意汇合到结束处;分支程序一定要注意汇合到结束处 键入0则显示0以替代P0

36、程序键入1则显示1以替代P1程序方法一简单,条理清楚,易于实现,但转移范方法一简单,条理清楚,易于实现,但转移范围只能是:围只能是:128128127127。方法二:方法二:跳转表法跳转表法。 利用无条件的间接转移指令可实现远距离的多分支利用无条件的间接转移指令可实现远距离的多分支( (间接间接跳转至不同分支的入口处跳转至不同分支的入口处) ) 。 在数据区造一地址表、存放不同的分支入口地址;在数据区造一地址表、存放不同的分支入口地址; 设表的首地址为设表的首地址为PTABPTAB,每一个,每一个 PTAB P0PTAB P0入口地址占一个字单元,入口地址占一个字单元, 2 2 P1P1PPi

37、 i的入口地址的入口地址PTABPTAB2 2i i 4 P24 P2若将若将2 2i iBXBX,则,则JMP PTABBXJMP PTABBX : 可转到可转到P Pi i入口处。入口处。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 ;定义地址表;定义地址表 LEA DX , INPUT LEA DX , INPUT MOV AH , 9 MOV AH , 9 INT 21H INT 21H MOV AH , 1 MOV A

38、H , 1 INT 21H INT 21H CMP AL , 0 CMP AL , 0 JB EXIT JB EXIT CMP AL CMP AL , 7 7 JA EXIT JA EXIT AND AX AND AX ,0FH0FH ADD AX ADD AX ,AX AX MOV BX MOV BX ,AXAX JMP PTABBXJMP PTABBX ;EXITEXIT:RETRET 显示提示等待键入07的数字检查输入数据,不是07则退出i2BX(PTAB2i)PiIPP0P0: MOV DLMOV DL, 0 0 JMP DOWN JMP DOWNP1: MOV DLP1: MOV D

39、L, 11 JMP DOWN JMP DOWN P7: MOV DL , 7 P7: MOV DL , 7 DOWN: MOV AH , 2DOWN: MOV AH , 2 INT 21H INT 21H JMP EXITJMP EXIT键入0则显示0以替代P0程序键入1则显示1以替代P1程序 键入的键入的ASCASC码为无符号数;码为无符号数; 用用JBJB、JAJA等指令而不能用等指令而不能用JGJG、JLJL等。等。 请思考请思考:若为跨段标号,应修改哪些地方?:若为跨段标号,应修改哪些地方? 注:只需修改注:只需修改DWDWDDDD定义、(存定义、(存IPIP、CSCS)、)、 i i

40、2 2i i4 4 即可。即可。作业:作业:P166. 10. 11. P166. 10. 11. 12. 12. * *13. 14.13. 14.3 33 3 循环程序设计循环程序设计 循环 按照一定规律,多次重复执行一串指令。一、循环程序的结构一、循环程序的结构 和高级语言一样,循环程序一般由四部分组成: 循环准备 初始化,为保证循环能正常进行而做的必要的准备。 主要包括:建立地址指针,置计数初值,设置某些必要的常数,对工作寄存器及工作单元置初值或清0等。 循环体 重复执行的部分,循环的核心。 循环的修改 为下一轮循环作准备,包括修改计数 器、寄存器、地址指针、恢复某些参数。循环控制循环

41、控制 控制循环正常结束,判断循环是否结束,控制循环正常结束,判断循环是否结束, 或继续。或继续。任何循环都包括上述四部分,但各部分界线并不很清楚。任何循环都包括上述四部分,但各部分界线并不很清楚。具体结构流程和高级言一样有两种:具体结构流程和高级言一样有两种:直到型、当型。直到型、当型。 N N Y Y N N Y Y 初始化初始化修改修改初始化初始化循环体循环体修改修改循环体循环体循环结束吗?循环结束吗?循环继续?循环继续?二二 、循环控制方法、最常见的有两种、循环控制方法、最常见的有两种: 计数控制计数控制 循环次数已知循环次数已知,故可用某个寄存器,故可用某个寄存器或单元作为计数器,或单

42、元作为计数器, 用计数器的值来控制循环用计数器的值来控制循环的结束与否。的结束与否。 条件控制条件控制 循环次数未知循环次数未知,即循环次数与循环,即循环次数与循环体的执行体的执行 情况有关,通过条件测试指令来测试情况有关,通过条件测试指令来测试是否满足循环条件,以控制循环是否结束。是否满足循环条件,以控制循环是否结束。 三、重复控制指令三、重复控制指令(循环控制循环控制指令)指令) 计数型控制是最常见,为此提供了专用计数型控制是最常见,为此提供了专用指令。此类指令的特点是:指令。此类指令的特点是:循环次数由循环次数由 CX计数器控制。循环指令本身不影响标志计数器控制。循环指令本身不影响标志。

43、 循环循环指令指令 格式:格式: LOOP SLOOP SLABLAB 操作:操作:CXCX1CX1CX,当,当CX0CX0则循环转移,则循环转移, 否则顺序执行。否则顺序执行。 注:本指令不影响标志,注:本指令不影响标志,CXCX1 1操作不影响操作不影响ZFZF 标志标志, ,不判不判ZFZF标志标志。 为零为零/ /等于循环等于循环 格式:格式: LOOPZ/LOOPE SLOOPZ/LOOPE SLABLAB操作:操作:CXCX1 CX ,1 CX ,当当CX0 ,CX0 , 且且ZF=1ZF=1则循环转移,否则顺序执行。则循环转移,否则顺序执行。注:本指令不影响注:本指令不影响ZF,

44、ZFZF,ZF由前面指令设定。由前面指令设定。即前面比较结果相等。即前面比较结果相等。 非零非零/ /不等循环不等循环 格式: LOOPNZ/LOOPNE SLAB 操作:CX1 CX , 当CX0 ,且ZF=0则循环转移;否则顺序执行。 CX CX为零转移为零转移 格式:JCXZ SLAB(特殊的转移指令) 操作:CX=0转移,否则顺序执行。 注:指令本身不作减操作,本指令一般用在循环的开始处,当CX=0,则跳过循环。 注:以上指令的转移范围128127。四、单重循环程序设计举例四、单重循环程序设计举例 ( (注意循环结构注意循环结构, ,防止死循环)防止死循环)下面通过几个例题介绍循环控制

45、。下面通过几个例题介绍循环控制。计数控制计数控制条件控制条件控制计数与条件控制计数与条件控制对于某些问题,还有一些特殊控制,如对于某些问题,还有一些特殊控制,如:设开关变量等,可参其他教材。设开关变量等,可参其他教材。例例 N N个字节无符号字节数求和(设和为字数据)。个字节无符号字节数求和(设和为字数据)。 X DB 22H,9FH,0F4H,55H N EQU $-X ;统计数据个数SUM DW ? MOV CX , N MOV AX , O 初始化 LEA SI , XADLOP: ADD AL,SI ADC AH,0 循环体 INC SI LOOP ADLOP 修改,控制 MOV SU

46、M , AX ;循环结束处理例例2、2 2字节数相减字节数相减(A(ABD)(BD)(设不产生借位),设不产生借位),以二进形式显示结果以二进形式显示结果。 如如: : 0C5H 0C5H 37H = 8EH ,37H = 8EH ,显示显示: 1000 1110: 1000 1110B B A DB 0C5H A DB 0C5H B DB 37H B DB 37H D DB ? D DB ? N EQU 8 N EQU 8 MOV AL,A SUB AL,B MOV D,AL MOV CX,N MOV BL,D若修改为字若修改为字相减,则计相减,则计数改为数改为16NEXT: MOV DL,

47、0NEXT: MOV DL,0 SHL BL,1 SHL BL,1 RCL DL,1 RCL DL,1 ADD DL,30H ADD DL,30H MOV AH,2 MOV AH,2 INT 21H INT 21H LOOP NEXT LOOP NEXT MOV DL,B MOV DL,B MOV AH,2 MOV AH,2 INT 21H INT 21H ABD初始化逐位显示0或1显示“B“例例3 3、(、(P97P97、例、例3 3、1010)计算)计算 X + YZX + YZ,X X、Y Y 为无符号双字变量。为无符号双字变量。结果和为结果和为5 5字节数字节数。X DD 723456

48、78HY DD 90ABCDEFHZ DB 5 DUP(?)N EQU 4 MOV CX,N MOV SI,0 初始化 AND AX,AX清清CFAGAIN: MOV AL,BYTE PTR XSI ADC AL,BYTE PTR YSI MOV ZSI,AL INC SI LOOP AGAIN MOV ZSI,0 RCL ZSI,1X+YZ指向下一个字节处理更高位进位作业:P165. 6. 例例4 4、(、(P98.P98.例例3.113.11)加密程序。为保密)加密程序。为保密, ,对数据对数据 加密加密, ,对方再解密对方再解密。 设加密数关系如下设加密数关系如下: :十六数: 0 1

49、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 ,0 ,则发则发A;A;发发3 ,3 ,则发则发E E;发;发A A,则发,则发D D。解密规律解密规律解密数的位移量解密数的位移量= =加密数表的数值。加密数表的数值。 如:解密数如:解密数0 0的位移量是的位移量是 = = 0AH0AH 如:解密数如:解密数4 4的位移量是的位移量是 = = 0FH0FHHEXS DB 4 ,3 ,2 ,1 ,0 ; 待发数 N EQU $

50、- HEXS ; 统计待发数个数JMH DB N DUP(?) ; 存加密数JMB DB 0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CH MOV CX,N MOV BX, OFFSET JMB 初始化 MOV SI,0AGAIN: MOV AL,HEXSSI ; 取待发数 XLAT JMB ; (BX+AL) AL MOV JMHSI,AL ; 存加密数 INC SI ; 指向下一数 LOOP AGAIN 或等效MOV AH,0ADD BX,AXMOV AL,BX加密表同样可以编写解密程序解密程序如下:JMH DB 0FH JMH DB 0FH ,0EH

51、 0EH ,8 8 ,9 9 ,0AH 0AH ; ( (设加密数)设加密数)N EQU N EQU JMH JMH ;统计加密数个数;统计加密数个数KMB DB KMB DB 6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,46,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4KMH DB N DUPKMH DB N DUP(?)(?) ;(存解密数);(存解密数) MOV CX MOV CX ,N N MOV BX MOV BX ,OFFSET KMBOFFSET KMB MOV SI MOV SI ,0 0NEXTNE

52、XT: MOV AL MOV AL ,JMHSIJMHSI XLAT KMB XLAT KMB MOV KMHSI MOV KMHSI ,ALAL INC SI INC SI LOOP NEXT LOOP NEXT解密表解密表初始化查表解密例5、 (P100、例3、13)将键入的十进制数(3276832767)转换为二进数,并以十六进制形式显示结果。算法:算法:. .十进制数十进制数二进制数:二进制数: 反复反复1010+D+Di i循环体循环体 D D4 4D D3 3D D2 2D D1 1D D0 0=D=D4 410104 4D D3 310103 3 D D0 0 (0(010+D1

53、0+D4 4) )10+D10+D3 3) )10+D10+D2 2) )10+D10+D1 1) )+D+D0 0 输入负数输入负数输入字符个数输入字符个数1 1; 循环次数循环次数 输入正数(不带符号)输入正数(不带符号)输入字符个数。输入字符个数。 循环体中对其绝对值转换为二进制数,若为负数还循环体中对其绝对值转换为二进制数,若为负数还应求补。应求补。 欲显示、可将结果的欲显示、可将结果的1616进制数逐位转进制数逐位转换成换成ASCASC字符,用字符,用2 2号功能逐位显示、号功能逐位显示、先高位后低位。先高位后低位。 1616进制变换成进制变换成ASCASC字符:字符: 0 0 9

54、9则则+30+30H H A A F F则则+37+37H H(41H41H46H46H) 键入十进制数键入十进制数转换初始化转换初始化跳过跳过“”AA转换AX10DiAX转换结束吗?为负数吗为负数吗?1为负数吗为负数吗?1求补显示回车换行及显示初如化取一位十六进制数ASCII显示一位十六制数四位显示完吗?RET22NYNYNYYNBINARY DW ?OBUF DB INPUT A DECIMAL(3276832767):$IBUF DB 7,? ,7 DUP(?) LEA DX ,OBUF MOV AH , 9 提示输入 INT 21H MOV DX , OFFSET IBUF MOV A

55、H ,10 键入十进制数 INT 21H MOV CL ,IBUF+1 MOV CH ,0 计数 CX LEA SI ,IBUF+2 ;设地址指针 CMP BYTE PTRSI, PUSHF JNE SININC INC SI DEC CXSININC: MOV AX ,0AGAIN: MOV BX,10 MUL BX MOV DL ,SI AND DL ,0FH ADD AL ,DL ADC AH ,0 INC SI ;指向下一位 LOOP AGAIN ;计数循环 为负数则跳过“AX10DiAX POPFPOPF JNZ AXNNEG JNZ AXNNEG NEG AX NEG AX 为负数

56、,则求补,使结果为负数,则求补,使结果AXNNEG: MOV BINARY ,AXAXNNEG: MOV BINARY ,AX 为补码表示为补码表示 MOV AH ,2MOV AH ,2 MOV DL ,0DH MOV DL ,0DH INT 21H INT 21H 换行换行, ,回车回车 MOV DL ,0AHMOV DL ,0AH INT 21H INT 21H MOV DL , = MOV DL , = INT 21H INT 21H 输出输出“=”=” MOV BX ,BINARYMOV BX ,BINARY MOV BP ,4 MOV BP ,4 循环初始化循环初始化 MOV CL

57、,4MOV CL ,4 NEXT: NEXT: ROL BX ,CLROL BX ,CL MOV DL ,BL MOV DL ,BL 将将BXBX高四位移至底四位高四位移至底四位 AND DL ,0FHAND DL ,0FH CMP DL ,0AH CMP DL ,0AH JC NOADD7 JC NOADD7 取一位十六进制数取一位十六进制数字符字符 ADD DL ,7ADD DL ,7NOADD7: ADD DL ,30HNOADD7: ADD DL ,30H MOV AH ,2MOV AH ,2 INT 21H INT 21H 显示一位十六进制数显示一位十六进制数 DEC BP DEC

58、BP 计数循环控制,计数循环控制,4 4位显示完吗?位显示完吗? JNZ NEXT JNZ NEXT 计数循环可用其他寄存器或单元计数循环可用其他寄存器或单元 MOV DL , H MOV DL , H MOV AH ,2 MOV AH ,2 显示十六进制数标志显示十六进制数标志 INT 21HINT 21H ret ret 运行:运行: 100 100 =0064H =0064H -32768 IBUF -32768 IBUF =8000H =8000H 1 1 32767 32767 2 2 =7FFFH =7FFFH 如输入:如输入:125125 FF83HFF83H内存分配内存分配07

59、070404-1122550D0D作业:P165. 7. P166. 15. * * 16.(6FF1H28657) 17.例例6.6.(P108P108、例、例3 3、1818)将存储器中的)将存储器中的1616位无符位无符号二进制数转换成十进制数,并显示结果。号二进制数转换成十进制数,并显示结果。 算法:N10取其余数,则为十进制数,重复直到商 为0.它是次数未知的循环。为条件控制循环。 将余数字符,送显示缓冲区,用9号功能显示即可。BINARY DW 0FFFFHOBUF DB 5 DUP(?), $ MOV BX ,OFFSET OBUF+5 初始化,BX指 MOV AX ,BINAR

60、Y 向低位字符地 MOV CX ,10 址AGAIN: MOV DX ,0 被除数扩展(无号符数扩展) 一定放在循环体中 DIV CX 余数DX,商AX ADD DL ,30H DEC BX 修改地址指针,指向更高位, MOV BX ,DL 存十进制数字串 OR AX ,AX 商为0? JNZ AGAIN MOV DX ,BX MOV AH ,9 显示结果 INT 21H ret思考思考 :若改为键入(若改为键入(0 0FFFFH) FFFFH) 即即0 065535 65535 无符号无符号数,应如何修改程序?数,应如何修改程序?键入(键入(0 0FFFFHFFFFH)将字符串变换为将字符串

温馨提示

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

评论

0/150

提交评论