1 / 55

第四章 程序设计

第四章 程序设计. 4-1 顺序结构程序 4-2 分支结构程序 4-3 循环结构程序 4-4 子程序结构 第 4 章 小结、思考题. 程序设计方法 顺序结构程序 分支结构程序 循环结构程序 子程序结构. 重点 :. 1. 分析问题 2. 建立数学模型 3. 确定算法 4. 绘制程序流程图 5. 内存分配 6. 编制程序 7. 程序调试. 程序设计步骤. 例 4-1 :自然数 0~15 的平方表,存在内存 TABLE 开始的连续 16 个单元中,现 XAD 单元存有任意一自然数( 0  X<15 ),查表求 X 的平方,存入 YAD 单元中。

jenny
Download Presentation

第四章 程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 程序设计 4-1顺序结构程序 4-2分支结构程序 4-3循环结构程序 4-4子程序结构 第4章 小结、思考题

  2. 程序设计方法 顺序结构程序 分支结构程序 循环结构程序 子程序结构 重点:

  3. 1.分析问题 2.建立数学模型 3.确定算法 4.绘制程序流程图 5.内存分配 6.编制程序 7.程序调试 程序设计步骤

  4. 例4-1:自然数0~15的平方表,存在内存TABLE开始的连续16个单元中,现XAD单元存有任意一自然数(0 X<15),查表求X的平方,存入YAD单元中。 解:X2的值的地址: TABLE表的首地址 + X 4-1顺序结构程序

  5. data segment table db 0,1,4,9,16,25,36,49,56,81 db 100,121,144,169,196,225 xad db 3 yad db ? data ends satack segment sta db 50 dup (?) top equ length sta stack ends

  6. code segment assume: cs:code,ds:data,ss:stack start proc far push ds ;将DS入栈 mov ax,0000h ;AX置零 push ax ;将0入栈 mov ax ,data ;初始化DS mov ds ,ax mov bx ,offset table ;表的首址送BX mov ah ,0 ;AH送0 mov al ,xad ;将X送AL

  7. add bx , ax ;求X平方值的地址 mov al , [bx] ;X平方值送AL mov yad , al ret start endp code ends end

  8. 例4-2:两个十六进制数相乘。 DATA SEGMENT M1 DW 00FFH M2 DW 00FFH P1 DW ? P2 DW ? DATA ENDS STACK SEGMENT ST DB 100 DUP(?) TOP EQU LENGTH ST STACK ENDS

  9. CODE SEGMENT ASSUME CS;CODE,DS:DATA,SS:STACK START :MOV AX,DATA MIOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV BX,OFFSET M1 MOV AX,[BX] MOV DX,0000H MOV BX,OFFSET M2 MUL WORD PTR [BX]

  10. MOV BX,OFFSET P1 MOV [BX],AX MOV BX,OFFSET P2 MOV [BX],DX CODE ENDS END

  11. 4-2、分枝结构程序 条件 程序段2 程序段1

  12. 例4-3:从内存ADR单元开始,连续存放出1000个学生的某门课成绩.例4-3:从内存ADR单元开始,连续存放出1000个学生的某门课成绩. 统计90~100, 70~79, 60~69, 60以下各段人数. 解: 设 CX: 计数器, BX: 数据指针. 定义: S5, S6 ,S7 ,S9 单元 存放各分数段 的人数. AX: 待查分数.

  13. 初始化CX、BX、S5、S6、S7、S9 Y Ai < 60? N Y S5+1 Ai < 70? S6+1 N Y Ai >=90 S9+1 N 修改地址 N CX=0? Y 结束

  14. DATA SEGMENT ADR DW 56,71,83,90,…. S5 DW ? S6 DW ? S9 DW ? DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE, DS:DATA START: PUSH DS MOV AX, 0 PUSH AX

  15. MOV AX , DATA MOV DS , AX MOV CX, 1000 MOV BX, OFFSET ADR COMPARE: MOV AX ,[BX] ;取成绩 CMP AX , 60; J L MS5 CMP AX,70 J L MS6 CMP AX,90 JGE MS9 JMP N-ADDRESS

  16. MS9: INC S9 JMP N-ADDRESS MS6: INC S6 JMP N-ADDRESS MS5: INC S5 JMP N-ADDRESS N-ADDRESS: ADD BX,2 LOOP COMPARE RET MAIN ENDP CODE ENDS END START

  17. 例4-4:用DOS系统功能调用INT 21H的08H功能接收键盘字符(AL=字符),若是 F,显示“This is the first word string.’,若是S,显示“This is the second word string.’,否则退出。 提示:用INT 21H 的09H功能显示字符串,字符串地址=DS:DX。

  18. 开始 接收字符 Y 是F? N Y 是S? N 显示2 显示1 结束

  19. data segment str1 db ‘this is the first word string.’,’$’ str2 db ‘this is the second word string.’,’$’ data ends satack segment sta db 50 dup (?) top equ length sta stack ends code segment assume: cs:code, ds:data, ss:stack

  20. start proc far push ds ;将DS入栈 mov ax, 00h ;AX置零 push ax ;将0入栈 mov ax , data ;初始化DS mov ds , ax mov ah, 08h ; 接收键盘字符 int 21h ;字符在AL中 cmp al, ’f’ ;是F? jz disp1 ;是F,转显示 cmp al,’s’ ;是S? jz disp2 ;是S,转显示 jmp do1 ;否则,退出

  21. disp1: mov dx,offset str1 ;显示字符串 mov ah,09h int 21h jmp do1 disp2: mov dx,offset str2 ;显示字符串 mov ah,09j int 21h do1: mov ax, 4c00h ;返回DOS int 21h main endp code ends end start

  22. 1、先判断条件,然后执行循环体。 4-3、循环结构程序设计 开始 赋初值 条件 Y N 循环体 修改

  23. 2、先执行循环体,然后判断条件。 特点:至少执行一次循环体。 开始 赋初值 循环体 修改 Y 条件? N

  24. 例4-5:统计一个数据块中负数的个数。 设CX:计数器,AX:存负数, BX:数据指针,DX:存负数个数 初始化CX、BX、DX Y Ai 0? N DX+1 BX+1、CX—1 N CX=0? Y NUM DX

  25. DATA SEGMENT DTM DB -1,-3,5,6,-2,… NUM DW ? DATA ENDS STACK SEGMENT ST DB 100 DUP(?) TP EQU LENGTH ST STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK SATRT PROC FAR MOV AX, DATA MOV DS, AX

  26. MOV AX, STACK MOV SS, AX ;初始化堆栈段 MOV BX, OFFSET DTM MOV CX, SIZE DTM MOV DX, 0 LP: MOV AX, [BX] TEST AX, 8000H JZ US ;正数转移 INC DX ;负数个数加一 US: INC BX ; 指向下一个数 LOOP LP ;未查完,继续 MOV NUM, DX ;存负数个数 MOV AH , 4CH ;返回DOS INT 21H START ENDP CODE ENDS END START

  27. 例4-6:求和Y=A1 + A2 + …. + A100设CX:计数器,BX:数据指针,AX:存和。 初始化CX、BX、AX AX = AX +Ai BX= BX+2 CX=CX-1 N CX=0? Y YAD=AX

  28. DATA SEGMENT TABLE DW 12,3,45,.. YAD DW ? DATA ENDS ………. MIAN PROC FAR PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX

  29. MOV AX, 0 ;清AX MOV BX, OFFSET TABLE MOV CX, 100 LP: ADD AX, [BX] ;求和 INC BX INC BX ; 指向下一个数 LOOP LP ;未加完,继续 MOV YAD, AX ;存和 RET MAIN ENDP

  30. 例4-7、 实现4字节非组合BCD码相加的程序. 1325+9839=? 编程提示: 1.两个数据以BCD(或ASCII)码方式顺序放在数据段的DAT1和DAT2 中 2.采用BCD码运算,用带进位位的指令ADC, 后面要跟加法校正AAA 3.计算结果转换成ASCII码显示,因此结果的 高四位要拼成3,用INT 21H 的02H功 能(DL=显示字符)显示结果。

  31. DATA SEGMENT DAT1 DB 01H,03H,02H,05H ; 1325 DAT2 DB 09H,08H, 03H,09H ; 9839 SUM DB 20 DUP (?) DATA ENDS STACK SEGMENT ST1 DB 100 DUP (‘SA’) TOP1 EQU ST1 LENGTH ST1 STACK ENDS

  32. CODE SEGMENT ASUMME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR START: MOV AX, DATA ;初始化数据段 MOV DS, AX MOV AX, STACK ;初始化堆栈段 MOV SS, AX MOV AX, TOP1 MOV SP, AX MOV CX, 4 ;计算4次 MOV BX, OFFSET DAT1-3 ;取数据地址 MOV SI , OFFSET DAT2-3 ;取数据地址 MOV DI , OFFSET SUM ;取结果地址 MOV AH, 00H ;将暂存标志的AH清0

  33. MOV AL, [BX] ; 取第一个数 SAHF ;将AH中的标志送标志寄存器 ADC AL, [DI] ;与第二个数带进位加 AAA ;十进制校正 LAHF ;将标志寄存器内容送AH OR AL, 30H ;计算值拼成ASCII码 MOV [DI], AL ;存结果的ASCII码 DEC BX ;指向第一个数的下一位 DEC SI ;指向第二个数的下一位 INC DI ;指向结果单元的下一位 LOOP DON1 ;未计算完,继续 AND AH, 01H ;将最高位的进位标志送AH OR AH, 30H ;最高位的进位位拼成ASCII码 MOV [DI], AH ;存结果的最高位

  34. MOV AH, 02H ;调用DOS的02H功能显示 MOV CX, 05H ;显示数据的位数 DON2: MOV DL,[DI] ;显示数据送DL INT 21H ;显示 DEC DI ;显示数据所在存储单元加一 LOOP DON2 ;未显示完,继续 MOV AH, 4CH ;返回DOS INT 21H RET MAIN ENDP CODE ENDS END START

  35. 子程序:相对主程序而言,是被主程序调用 的程序. 子程序调用示意图: 4-4 子程序 主 主 子1 子 子 子2

  36. 1、调用程序和子程序在同一代码段 子程序的类型应为NEAR cod1 segment ……… CALL SUB1 ….. SUB1 PROC NEAR ……. RET SUB1 ENDP cod1 ends

  37. 2、调用程序和子程序不在同一代码段子程序 的类型应为FAR 子程序SUB1的类型是FAR,可段间调用,也可 段内调用. CODE1 SEGMENT ……… CALL FAR PTR SUB1 …….. CODE1 ENDS CODE2 SEGMENT …….. SUB1 PROC NEAR ……. RET SUB1 ENDP …….. CALL SUB1 ……. CODE2 ENDS

  38. CODE2 SEGMENT …….. SUB1 PROC NEAR ……. SUB1 ENDP …….. CALL SUB1 ;段内调用 ……. CODE2 ENDS 子程序SUB1的类型是FAR,可段间调用,也可 段内调用.

  39. 例4-8:多子节BCD码相加程序。 解:1)SI:指向第一个数,BX:指向 第二个数,DI:指向结果单元。 2)用串操作LODSB传送第一个加 数,STOSB传送结果。 3)用子程序编写加法程序.

  40. DATA SEGMENT FIT DB 11,22,33,44 SEC DB 55,66,77,88 SUM DB 20 DUP(?) DATA ENDS ……... MOV S I ,OFFSET FIR ;指向第一个数 MOV DI ,OFFSET SUM;指向结果单元 MOV BX,OFFSET SEC ;指向第二个数 MOV CX,04H CLD CLC

  41. ADT: CALL ADSUB LOOP ADT …….. ADSUB PROC NEAR ;加法子程序 LODSB ;AL [SI],SI  SI+1 ADC AL, [BX] DAA STOSB ;[DI]AL,DI DI+1 INC BX RET ADSUB ENDP CODE ENDS

  42. 例4-9:编程序将AX中的十六进制数,转换成ASCII码, 存于ADR开始的四个单元中。 解:1)、AX中的数从左到右,转换成ASCII码,用循环左移ROL和AND指令, 把十六进制数置BL中; 2)、0 ~ 9 的ASCII码:30 ~ 39H A ~ F 的ASCII码:41H ~ 46H。 先把每个数加30H,判断是否为数字0 ~ 9?若是A ~ F,再加07H,得字母的ASCII码。

  43. DI指向结果单元,CX=4 HEXCH BL 一个16进制数 BL=BL+30H N < 3AH? BL=BL+07H Y 存ASCII码 CX CX-1 N CX=0? Y 存ASCII码

  44. HEX16 PROC FAR PUSH CX PUSH BX PUSH DI MOV DI,OFFSET ADR MOV CX,4 HEXCH: PUSH CX MOV CL, 4 ROL AX, CL MOV BL, AL AND BL, 0FH

  45. ADD BL,30H CMP BL,3AH JL H1 ADD BL,07H H1 : MOV [DI],BL INC DI INC DI POP CX LOOP HEXCH POP DI POP BX POP CX RET HEX16 ENDP

  46. RET MAIN ENDP CODE ENDS END START

  47. 1、用换码指令实现格雷码往ASCII码的转换。 2、多字节十进制BCD相加,结果存被加数单元. 3、 用串操作指令实现:先将100H个数从2170H单元处搬到1000H1单元处,然后从中检索等于AL中字符的单元,并将此单元换成空格字符. 4、从60H个元素中寻找一个最大的值,并 放到AL中. 假设这60个元素防在DATA1开始的单元中. 5、在DS段有一个从TABLE开始的由160个字符组成的链表,设计一个程序,实现对此表进行搜索,找到第一个非零元素后,将此单元和下一个单元清零. 第4章 习题与思考题

  48. 题1: GNE DB 00H,01H,03H,02H,06H,07H,05H,04H DB 0CH,0DH ASC DB ‘0’,‘1’,‘2’ ,‘3’ ,‘4’ ,‘5’ ,‘6’ DB ‘7’ ,‘8’ ,‘9’ MOV BX, OFFSET ASC MOV DI, OFFSET XAD MOV CX, 10 DON: MOV AL,[BX] ;送ASCII码 XLAT ;AL  [BX+AL] MOV [DI],AL ;格雷转换成ASSCI码 INC BX INC DI LOOP DON

  49. 题2:多字节十进制BCD相加,结果存被加数单元. 定义数据(将数据段与附加段定义成一个段ES): X1 DB 01H,02H,… ;反序存放第一个16位BCD数 X2 DB 03H,05H,… ;反序存放第二个16位BCD数 用带进位位的加法指令ADC实现累加, 用十进制校正AAA. MOV CX, 16 ;十六个数 MOV DI,OFFSET X1 ;指向第一个数的最低位 MOV S I ,OFFSET X2 ;指向第二个数的最低位 CLC ; 清进位 CLD ;清方向标志 DON: LODSB ; AL [SI],SI  SI+1

  50. ADC AL,[DI] AAA ;十进制校正 STOSB ;AL  [DI],DI DI+1 LOOP DON1 LAHF ;取标志到AH AND AH, 01H ;保留进位标志CF JNZ NON2 ;无进位,转 MOV [DI], AH ;存和的最高位 DON2: HLT

More Related