收藏 分享(赏)

杨富华 第3章 程序设计的基本技术2.ppt

上传人:hyngb9260 文档编号:8118862 上传时间:2019-06-09 格式:PPT 页数:60 大小:245KB
下载 相关 举报
杨富华 第3章 程序设计的基本技术2.ppt_第1页
第1页 / 共60页
杨富华 第3章 程序设计的基本技术2.ppt_第2页
第2页 / 共60页
杨富华 第3章 程序设计的基本技术2.ppt_第3页
第3页 / 共60页
杨富华 第3章 程序设计的基本技术2.ppt_第4页
第4页 / 共60页
杨富华 第3章 程序设计的基本技术2.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、1,3.3 顺序程序设计 3.4 分支程序设计 3.5 循环程序设计 3.7 子程序设计,2,3.3 顺序程序设计,3,stack segment stack stackdw 32 dup(?)stack endsdata segmentW1 DW 15000W2 DW 500W3 DW 800W4 DW 30000W5 DW 4000W6 DW 2 DUP(0)data endscode segmentstart proc farassume ss:stack,cs:code,ds:data,例3.5 编程计算(W1-(W2*W3+W4-5000)/W5W6。式中Wi=16)均为带符号数字变

2、量。,4,push dssub ax,axpush axmov ax,datamov ds,axMOV AX,W2IMUL W3MOV BX,AXMOV CX,DXMOV AX,W4CWDADD BX,AX ADC CX,DXSUB BX,5000SBB CX,0MOV AX,W1,5,CWDSUB AX,BXSBB DX,CXIDIV W5MOV W6,AXMOV W6+2,DXretstart endpcode endsend start,6,例3.6 从键盘上键入09中任一自然数N,将其立方值送显示器显示。 求一个数的立方值可以用乘法运算实现,也可以用查表法实现。查表法运算速度比较快,是

3、常用的计算方法。因只要送显示,故将09的立方值的ASCII码按顺序造一立方表。立方值最大值为729,需三个单元存放它的ASCII码,表的每项的单元数相同,再在每项之后加一个$,所以立方表的每项均占4个字节。根据这种存放规律可推知,表的偏移首地址与自然数N的4倍之和,正是N的立方值和$的ASCII码的存放单元的偏移首地址。程序如下: stack segment stack stackdw 32 dup(?) stack ends,7,data segmentINPUT DB PLEASE INPUT N(0-9):$LFB DB xx0$xx1$xx8$x27$x64$DB 125$216$34

4、3$512$729$N DB ?data endscode segmentstart proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds,axMOV DX,OFFSET INPUT ;显示提示信息MOV AH,9INT 21H,8,MOV AH,1 ;键入并回显N(1号功能调)INT 21HMOV N,ALMOV AH,2 ;换行(2号功能调用)MOV DL,0AHINT 21HMOV DL,NAND DL,0FH ;将 N转换为NMOV CL,2 ;将N乘以4SHL DL,CLMOV

5、DH,0 ;8位4N扩展为16位ADD DX,OFFSET LFB ;4N+表的偏移地址MOV AH,9INT 21Hretstart endpcode endsend start,9,例3.7 编制两个32位无符号数的乘法程序。,8086/8088只有16位运算指令,所以该问题无法直接用乘法指令实现,但可以用16位乘法指令做四次乘法,然后把部分积相加,如图3-3所示。,10,stack segment stack stackdw 32 dup (?)stack endsdata segmentAB DD 12345678HCD DD 12233445HABCD DD 2 DUP(?)data

6、 endscode segmentstart proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds,ax,11,MOV BX,OFFSET AB MOV AX, BX+4 ;dAX,AX=3445H MUL WORD PTR BX ;db MOV BX+8, AX ;存d b的低16位 MOV BX+10, DX ;存d b的高16位 MOV AX, BX+4 ;dAX; AX=3445H MUL WORD PTR BX+2 ;da ADD BX+10, AX ;da的低16位加上db的高

7、16位 ADC DX, 0 ;上述加法若有进位,则加入da的高16位中 MOV BX+12, DX ;存da的高16位 MOV AX, BX+6 ;cAX; AX=1223H MUL WORD PTR BX ;cb ADD BX+10, AX ;cb的低16位加入 ADC BX+12, DX ;cb的高16位加入存放单元,12,ADC BYTE PTR BX+14, 0 ;cb的高16位加入时产生的进位存入 MOV AX, BX+6 ;cAX; AX=1223H MUL WORD PTR BX+2 ;ac ADD BX+12, AX ;ac的低16位加入 ADC BX+14, DX ;ac的高

8、16位加入 ret start endp code endsend start,13,3.4 分支程序设计,14,无条件转移指令 条件转移指令 分支程序设计举例,转移指令的实质:改变IP(或CS)的内容。 所有转移指令不会影响标志位。 分为无条件转移和条件转移两种。,15,(1) 无条件转移指令 - JMP 本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令分成4种情况。 段内直接转移:指令中给出的8/16位的位移量加到IP。CS保持不变。 段内间接转移:REG/MEM中的16位偏移地址送IP。CS保持不变。 段间直接转移指令中给出的16位的段和

9、16位的偏移地址送到CS和IP。 段间间接转移MEM中给出的16位的段和16位的偏移地址送到CS和IP。,16,转移的目标地址由指令直接给出。位移量 转移范围 汇编语言中格式8位 -128+127 JMP SHORT OPRD16位 -32768+32767 JMP NEAR PTR OPRD 例:JMP 0120H ;直接转向0120H JMP SHORT LPI ;转向LPIJMP NEAR PTR BBB ;转向BBB 由于是段内转移,故转移后CS内容保持不变, 段内直接转移,17,段内间接转移 转移的目标地址由寄存器或存储单元的内容给出。例1:JMP SI 若指令执行前(SI)=120

10、0H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处执行。注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。,18,例2:JMP BX+DI 设指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H; 则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:JMP WORD PTRBX+DI 表示所取得的目标地址是一个字。,19,段间直接转移 在指令中直接给出要转移到的目的段地址和偏移地址。例:JMP 2000:1000H 执行时,(IP)1000H,(CS)20

11、00H注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FAR PTR。例:JMP FAR PTR far_label 其中的far_label为远类型的标号。,20,转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如:JMP DWORD PTRSI 设指令执行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H 则指令执行后:(IP)=1000H,(CS)=4A00H 于是转到4B000H处开始执行指令。 例中的DWORD PTR表示转移地址是一个双字。,段间间接转移,21,4000,1212,+),41212,DS

12、,SI,00,10,00,4A,41212 41213 41214 41215,1000,4A00,IP,CS,段间间接转移操作示意图,11111111,11101100,JMP DWORD PTR SI的机器码,DS:SI,22,条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是否进行分支转移。 格式: JXX label ;xx为条件名称缩写 指令的转移范围为-128+127字节。,(2)条件转移指令 - JXX,23, 根据单个标志位设置的条件转移指令 JB/JC ;低于,或CF=1,则转移 JNB/JNC/JAE ;高于或等于,或CF=0,则转移 JP/JPE ;

13、奇偶标志PF=1(偶),则转移 JNP/JPO ;奇偶标志PF=0(奇),则转移 JZ/JE ;结果为零(ZF=1),则转移 JNZ/JNE ;结果不为零(ZF=0),则转移 JS ;SF=1,则转移 JNS ;SF=0,则转移 JO ;OF=1,则转移 JNO ;OF=0,则转移,24,条件转移指令常根据比较指令比较两个数的关系的结果来实现转移。两个数的关系除了相等与否外,还有两个数中哪一个比较大。但这就有一个有趣的问题,如8位二进制数11111111大于00000000吗? 答案既可肯定又可否定。因为若视这两个二进制数为无符号数,11111111 当然大于00000000;若视这两个二进制

14、数为符号数(补码),11111111为1,就比0小了。为此要使用两种术语来区分无符号数和符号数的这种关系。如果把数作为符号数来比较,就使用术语“小于”和“大于”;如果把数作为无符号数来比较,就使用术语“低于”和“高于”。因此8位二进制数11111111高于00000000,小于00000000,而00000001既高于又大于00000000。所以8086/8088设置了符号数的条件转移指令和无符号数的条件转移指令。,25,这类指令主要用来判断两个数的大小。判断无符号数的大小 JA 高于则转移条件为: CF=0ZF=0,即AB JNA/JBE 低于或等于则转移条件为: CF=1ZF=1,即AB,

15、 根据组合条件设置的条件转移指令,26,JG ;大于则转移(AB)条件为: (SFOF=0)ZF=0 JGE ;大于或等于则转移(AB)条件为: (SFOF=0)ZF=1 JLE ;小于或等于则转移(AB)条件为: (SFOF=1)ZF=1 JL ;小于则转移(AB)条件为: (SFOF=1)ZF=0,判断有符号数的大小,27,(3)分支程序设计举例 例3-8:以十六进制数形式显示字变量W中的内容。,stack segment stack stackdw 32 dup(?)stack endsdata segmentW DW 3F64Hdata endscode segmentstart pr

16、oc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush ax mov ax,datamov ds,ax,28,MOV BX, W ; BX3F64HMOV CH, 4 ; CH做循环计数器 ROT: MOV CL, 4 ; CL做移位计数器ROL BX, CL ; 将最高4位移到低4位MOV AL, BLAND AL, 0FH ; 取出低4位ADD AL, 30H ; 转换为ASCII码CMP AL, 39H ; 与 9 比较JBE DISP ; 若(AL)9, 则转显示ADD AL, 7 ; 若(AL)9, 再加7转为A-F DIS

17、P: MOV DL, AL ; (DL)字符MOV AH, 2INT 21H ; 显示输出DEC CH ; 4个十六进制数显示完否?JNZ ROT ; 没有, 循环,29,MOV DL, 48H ; HMOV AH, 2INT 21H ; 最后显示Hret start endp code endsend start,30,例3-9:某工厂的产品共有8种加工处理程序P0P7,而某产品应根据不同情况,作不同的处理,其选择由键入的值07来决定。若键入07以外的键,则退出该产品的加工处理程序。,方法1:利用比较转移指令实现分支 stack segment stack stackdw 32 dup(?)

18、stack endsdata segmentINPUT DB INPUT(07):$ data endscode segmentstart proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush ax,31,mov ax,datamov ds,axAGAIN: MOV DX,OFFSET INPUTMOV AH,9INT 21HMOV AH,1INT 21HCMP AL,0JE P0CMP AL,1JE P1CMP AL,7JE P7RET,32,P0: JMP AGAINP7: JMP AGAINstart endpcode e

19、ndsend start,33,利用比较转移指令实现分支,每次比较转移实现二叉分支。这种方法编程条理清楚,容易实现。但各处理程序不能太长,且分支不能太多。因为分叉进入各处理程序所用的指令均是条件转移指令(此例为JE Pi),条件转移指令所允许的转移范围为128+127,若各处理程序较长或者分支再多一些,就会超过条件转移指令所允许的范围。为了解决这个问题,可以利用跳转表法来实现这种多叉分支。 方法2:跳转表法,34,跳转表法实现分支的具体做法是,在数据区中开辟一片连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址。,35,stack segment stack stackdw 32 d

20、up(?)stack endsdata segmentINPUT DB INPUT(0-7):$PTAB DW P0,P1,P2,P3,P4,P5,P6,P7data endscode segmentstart proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds,ax,36,AGAIN: MOV DX,OFFSET INPUTMOV AH,9INT 21HMOV AH,1INT 21HCMP AL,0JB EXITCMP AL,7JA EXITAND AX,0FHADD AL,ALMOV

21、 BX,AXJMP PTABBXEXIT: RET,37,P0: JMP AGAINP7: JMP AGAINstart endpcode endsend start,38,3.5 循环程序设计,循环程序一般有4部分: (1)循环准备。 亦称循环初始化,它为循环作必要的准备。这部分的主要工作是建立地址指针,置计数器,设置些必要的常数,将工作寄存器或工作单元清0等。 (2)循环体。 完成循环的基本操作,是循环程序的实质所在 (3)循环的修改。 修改或恢复某些内容,为下一轮循环做好必要的准备。修改的内容一般包括计数器、寄存器和基址或变址寄存器。 (4)循环的控制。 修改计数器,判断控制循环的继续或

22、终止。任何循环程序一般都应有这4部分,但各部分的界限并不是很清楚的。有时为设计方便或为了节省存储空间或为了控制简单等原因,这4部分形成相互包含、相互交叉的情况,很难分出某条或某几条指令究竟属于哪一部分。,39,循环程序的基本结构有两种。一种是“先执行,后判断”,这种结构的循环先执行一次循环体,后判断循环是否结束。这种结构的循环至少执行一次循环体。另一种是“先判断,后执行”,这种结构的循环首先判断是否进入循环,再视判断结果,决定是否执行循环体。这种结构的循环,如果一开始就满足循环结束的条件,会一次也不执行循环体,即循环次数可以为0。,40,例,编程统计字变量 W 中有多少位1。 这个程序最好采用

23、“先判断,后执行”的结构。先将W送AX,判AX是否为0,如果AX=0,则不必做统计工作了;如果AX0,则将AX左移或者右移1位,通过判移出位是1还是0,决定字节变量N是否加1来统计W中1的位数。 stack segment stack stackdw 32 dup(?)stack endsdata segmentW DW 1999HN DB ?data endscode segmentstart proc farassume ss:stack,cs:code,ds:data,41,push dssub ax,axpush axmov ax,datamov ds,axMOV N,0MOV AX,

24、W LOP: AND AX,AXJZ DONESHL AX,1JNC NOINCINC N NOINC: JMP LOP DONE: retstart endpcode endsend start,42,例,编程统计字变量 W 中有多少位1。 当然,也可以采用“先执行,后判断”的结构。 stack segment stack stackdw 32 dup(?)stack endsdata segmentW DW 1999HN DB ?data endscode segmentstart proc farassume ss:stack,cs:code,ds:data push dssub ax,

25、axpush ax,43,mov ax,datamov ds,axMOV N,0MOV CX,16 LOP: SHL W,1JNC NOINCINC N NOINC: DEC CXJNZ LOPretstart endpcode endsend start,44,(2)循环控制指令,用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。 转移的目标应在距离本指令-128+127的范围之内。 循环控制指令不影响标志位。,45,1.LOOP指令 指令格式 LOOP short-lable 指令的意义是先将CX减1,然后判断CX是否等于0。若CX0,则控制程序转移到short-lable所指

26、的指令,否则顺序执行下一条指令。 使用LOOP指令之前,必须把循环次数送入CX寄存器中,一条LOOP short-lable指令,相当于DEC CX和JNZ short-lable两条指令。,46,2.LOOPZ/LOOPE指令 指令格式: LOOPZ short-lable 指令格式: LOOPE short-lable 指令的意义是先将CX减1,然后判断CX是否等于0和ZF是否为1。若CX0且ZF=1,则控制程序转移到short-lable所指的指令,否则顺序执行下一条指令。 使用LOOPZ/LOOPE指令之前,必须把循环次数送入CX寄存器中。,47,3.LOOPNZ/LOOPNE指令 指

27、令格式: LOOPNZ short-lable 指令格式: LOOPNE short-lable 指令的意义是先将CX减1,然后判断CX是否等于0和ZF是否为0。若CX0且ZF=0,则控制程序转移到short-lable所指的指令,否则顺序执行下一条指令。 使用LOOPNZ/LOOPNE指令之前,必须把循环次数送入CX寄存器中。 4.JCXZ指令 指令格式 JCXZ short-lable 指令意义是若CX=0,则将程序转移到short-lable所指的指令,否则顺序执行。,48,1.计数控制的循环程序 此类循环程序的特点是循环次数已知,故可用某个寄存器或存储单元作为计数器,用计数器的值来控制

28、循环的结束。 例3.10 计算 Z=X+Y 其中X和Y是双字变量。 双字变量占4个字节,故其和可能占5个字节,字节相加的程序如下: stack segment stack stackdw 32 dup (?) stack ends data segment X DD 752028FFH Y DD 9405ABCDH Z DB 5 DUP(?) data ends,3.3.3单重循环程序设计举例,49,code segment start proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds

29、,axMOV CX,4MOV SI,0AND AX,AX ;清CF,即CF为0 AGAIN: MOV AL,BYTE PTR XSIADC AL,BYTE PTR YSIMOV ZSI,ALINC SILOOP AGAINMOV ZSI,0RCL ZSI,1 ;进位CF存入和值Z的第5字节ret start endp code endsend start,50,* 例 3.11,51,(4)条件控制的循环程序举例,4. 将存储器中16位无符号二进制数转换成十进制数,送显示器显示出来。,data Segment BINARY DW 55H OBUF DB 6 DUP (?) data ends,

30、52,53,(5)双重控制的循环程序举例 5. 已知字节变量BUF存储区中存放着以0DH(回车的ASCII码)结束的十进制数的ASCII码。编程检查该字节变量存储区中有非十进制数,若有显示“ERROR”;若无则统计十进制数的位数(小于100)并送显示器显示。,data segment BUF DB 345678 , 0DH OBUF DB 3 DUP (?) ERR DB ERROR $ data endsMOV AX,0MOV BX,0 AGAIN: CMP BUFBX,0DHJE DONE,CMP BUFBX ,0JB ERRORCMP BUFBX, 9JA ERRORINC ALAAAI

31、NC BXJMP AGAIN,54,DONE: OR AX, 3030HMOV OBUF + 1 ,ALMOV OBUF,AHMOV OBUF + 2, $MOV DX, OFFSET OBUFMOV AH, 9INT 21HRET ERROR:MOV DX, OFFSET ERRMOV AH, 9INT 21Hret,55,56,(6)多重循环程序设计举例 6. 编制将字节变量BUF存储区中存放的n个无符号数排序的程序。,data segment BUF DB 20,19, ,250 COUNT EQU $-BUF data ends,57,MOV SI, OFFSET BUFMOV DX,

32、COUNT- 1 OUTSID: MOV CX, DXPUSH SIMOV AL, SI INSIDE: INC SICMP AL, SIJNC NEXCHGXCHG SI ,AL NEXCHG:LOOP INSIDEPOP SIMOV SI ,ALINC SIDEC DXJNZ OUTSIDret,逐一比较法 :,58,MOV DX, COUNT- 1MOV AH,1 OUTSID MOV SI, OFFSET BUFMOV CX,DX INSIDE. MOV AL, SI INC SICMP AL, SIJNC NXCHGXCHG AL, SIMOV SI- 1 ,ALMOV AH,2 N

33、XCHG: LOOP INSIDEDEC DXDEC AHJNZ OUTSIDret,两两比较法 :,59,7. 已知mn矩阵A的元素aij按行序存放在存储区中,试编写程序求每行元素之和Si。,data segment A DB 11H, 12H, 13H, 14H, 15H N EQU $ - ADB 21H, 22H, 23H, 24H, 25HDB 31H, 32H, 33H, 34H, 35HDB 41H,42H,43H,44H,45H M DB ($-A)/N S DW M DUP(?) data ends,MOV SI ,OFFSET AMOV DI, OFFSET S OUTSID: MOV CX,NMOV DX,0 INSIDE: MOV AL, SICBWADD DX, AXINC SILOOP INSIDEMOV DI ,DXADD DI,2DEC MJNZ OUTSIDret,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报