1、.startupshuru:开始输入月份编号 lea dx,msg1 mov ah,09h int 21h ;显示提示信息 lea dx,buffer mov ah,0ah输入月份数值 cmp actlen,0 ;若没有输入月份则转出错处理 je shuruerr;以下判断输入月份是否合法 lea di,string cmp actlen,2 je da10 ;若输入的是2位数月份值则转到da10标号处执行 mov al,string ;若只输入1位数字月份值,则读出该值 and al,0fh ;把ASCII码转换为对应数字 jmp jisuanda10: mov al,string把月份数值
2、十位的ASCII码转换为对应数字(如12月的1字) mov bl,10 mul bl and string1,0fh ;把月份数值个位的ASCII码转换为对应数字 add al,string1 ;十位加上个位 (如12月)jisuan:以下计算偏移地址 cmp al,1 ;比1小是非法月份 jb shuruerr ;若月份值小于1则转出错处理 cmp al,12 ja shuruerr ;比12大也是非法月份 sub al,1 ;月份值减1 shl al,1 shl al,1 ;月份再乘4对应了MON字符串中从首地址开始的字符相对位置 xor ah,ah ;1月份从0位置开始即JAN,.5月份
3、从位置16开始即MAY lea si,mon ;找到被显示月份字符的位置 add si,ax mov cx,3output: mov dl,si ;输出对应月份英文缩写 mov ah,2 int 21h inc si loop output .exit 0shuruerr: lea dx,msg2 ;输入出错时提示出错,并转到程序起始处重新执行 mov ah,09h jmp shuruend2、程序汇编通过后,运行程序察看输出结果。3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。实验六 分支与循环混合结构程序设计1、掌握利用.IF语句实现分支程序的设计方法;2、掌
4、握利用.REPEAT语句实现循环程序的设计方法;3、掌握DIV指令的使用特点;4、掌握地址表的定义和使用方法。实现成绩单的分等级统计功能,在数据段中有成绩单的定义,并包含有若干个分数,程序根据成绩单数据的个数循环分别统计个分数段成绩的个数,最后输出个等级段的分数个数。要求:成绩单数据少于100字节,输出的每个档次统计值按两位数显示。HAN DB 42,62,68,70,79,82,85,90,95,99,66,88,78,90,98,200 ;成绩单count equ $-han ;记录数据个数MEM DB 6 dup(0) ;分别用于存放各分数段成绩的个数scoree db 10,13,Sc
5、ore E count is:定义各分数段的提示信息scored db 10,13,Dscorec db 10,13,Cscoreb db 10,13,Bscorea db 10,13,Ascoreo db 10,13,Othertable dw scoreo,scoree,scored,scorec,scoreb,scorea ;定义地址表 MOV CX,count mov si,0begin:统计各个分数段的成绩个数 .if hansi=60 & hansi=69 add mem2,1=70 &=79 add mem3,1=80 &=89 add mem4,1=90 &=99 add me
6、m5,1 .else add mem0,1 .endif loop begin mov cx,6 .repeat ;开始循环 mov si,cx dec si add si,si ;计算地址表中对应地址项与提示信息的对应关系 mov dx,tablesi mov ah,9 xor ah,ah mov si,cx MOV al,memsi-1 ;读出统计好的一个数值(此处只能处理99以下的) mov bl,10 div bl ;ax/10 mov memsi-1,ah ;AH为余数是个位,暂时存放回该内存单元 mov dl,AL ;al为商是十位 add dl,30h ;转换为ASCII码 MO
7、V AH,2 INT 21H ;以十进制形式显示十位 mov dl,memsi-1 add dl,30h再显示个位 .untilcxz ;CX自动减1,减到0结束循环END3、修改成绩单的内容再重新汇编和运行程序,观察程序的结果变化情况。把数据修改为22,32,48,50,69,72,85,40,75,89,66,58,48,70,78,200 4、利用DEBUG工具的U命令反汇编可执行程序,观察.IF语句及.REPEAT语句所对应的汇编指令情况。5、利用MASM的命令行,汇编源文件并生成.LST列表文件,查看列表文件内容。由:masm /l + 文件名 生成 lst注:实际上高级程序结构控制
8、语句在汇编时,都转换成相应的比较指令和条件转移指令了。高级程序结构控制语句使得程序设计、理解都变得非常方便。生成list文件为Microsoft (R) Macro Assembler Version 6.15.8803 06/07/11 19:36:336.asm Page 1 - 1 .model small .stack 0000 .data 0000 16 20 30 32 45 48 HAN DB 22,32,48,50,69,72,85,40,75,89,66,58,48,70,78,200 ; 55 28 4B 59 42 3A 30 46 4E C8 0010 = 0010 c
9、ount equ $-han ; 0010 0006 MEM DB 6 dup(0) ; 00 0016 0A 0D 53 63 6F 72 scoree db 10,13, ; 65 20 22 45 22 20 63 6F 75 6E 74 20 69 73 3A 24 002C 0A 0D 53 63 6F 72 scored db 10,13, 65 20 22 44 22 20 0042 0A 0D 53 63 6F 72 scorec db 10,13, 65 20 22 43 22 20 0058 0A 0D 53 63 6F 72 scoreb db 10,13, 65 20
10、22 42 22 20 006E 0A 0D 53 63 6F 72 scorea db 10,13, 65 20 22 41 22 20 0084 0A 0D 53 63 6F 72 scoreo db 10,13, 65 20 22 4F 74 68 65 72 22 20 63 6F 75 6E 74 20 69 73 3A 24 009E 0084 R 0016 R 002C R table dw scoreo,scoree,scored,scorec,scoreb,scorea ; 0042 R 0058 R 006E R 0000 .code .startup 0017 B9 00
11、10 MOV CX,count 001A BE 0000 mov si,0 001D begin: .if hansi 0039 80 06 0012 R 01 add mem2,1 004E 80 06 0013 R 01 add mem3,1 0063 80 06 0014 R 01 add mem4,1 0078 80 06 0015 R 01 add mem5,1 .else 007F 80 06 0010 R 01 add mem0,1 .endif 0084 46 inc si 0085 E2 96 loop begin 0087 B9 0006 mov cx,6 .repeat
12、; 008A 8B F1 mov si,cx 008C 4E dec si 008D 03 F6 add si,si ; 008F 8B 94 009E R mov dx,tablesi 0093 B4 09 mov ah,9 0095 CD 21 int 21h ; 0097 32 E4 xor ah,ah 0099 8B F1 mov si,cx 009B 8A 84 000F R MOV al,memsi-1 ; 009F B3 0A mov bl,10 00A1 F6 F3 div bl ; 00A3 88 A4 000F R mov memsi-1,ah ;AH为余数是个位,暂时存放
13、回该内存单元 00A7 8A D0 mov dl,AL ; 00A9 80 C2 30 add dl,30h ; 00AC B4 02 MOV AH,2 00AE CD 21 INT 21H ; 00B0 B4 02 MOV AH,2 00B2 8A 94 000F R mov dl,memsi-1 00B6 80 C2 30 add dl,30h 00B9 CD 21 INT 21H ; .untilcxz ;CX自动减1,减到0结束循环 .exit 0 END6.asm Symbols 2 - 1Segments and Groups: N a m e Size Length Align
14、Combine ClassDGROUP . . . . . . . . . . . . . GROUP_DATA . . . . . . . . . . . . . 16 Bit 00AA Word Public DATASTACK . . . . . . . . . . . . . 16 Bit 0400 Para Stack STACK_TEXT . . . . . . . . . . . . . 16 Bit 00C2 Word Public CODESymbols: N a m e Type Value AttrCodeSize . . . . . . . . . . . Number
15、 0000h DataSize . . . . . . . . . . . Number 0000h Interface . . . . . . . . . . . Number 0000h Model . . . . . . . . . . . . . Number 0002h Startup . . . . . . . . . . . . L Near 0000 _TEXT code . . . . . . . . . . . . . Text _TEXTdata . . . . . . . . . . . . . Text DGROUPfardata? . . . . . . . . .
16、 . . Text FAR_BSSfardata . . . . . . . . . . . . Text FAR_DATAstack . . . . . . . . . . . . . Text DGROUPHAN . . . . . . . . . . . . . . Byte 0000 _DATA MEM . . . . . . . . . . . . . . Byte 0010 _DATA begin . . . . . . . . . . . . . L Near 001D _TEXT count . . . . . . . . . . . . . Number 0010h scor
17、ea . . . . . . . . . . . . . Byte 006E _DATA scoreb . . . . . . . . . . . . . Byte 0058 _DATA scorec . . . . . . . . . . . . . Byte 0042 _DATA scored . . . . . . . . . . . . . Byte 002C _DATA scoree . . . . . . . . . . . . . Byte 0016 _DATA scoreo . . . . . . . . . . . . . Byte 0084 _DATA table . .
18、. . . . . . . . . . . Word 009E _DATA 0 Warnings 0 Errors4-6.确定自变量wordX中的1的最低位数(015),并将结果存于变量byteY中;若wordX中没有1的位,则将-1存入byteY。实验源程序: .model small .stack .datawordX dw 56byteY db ? .code .startup mov ax,wordX mov cx,16 mov dl,-1again: inc dl test ax,1 ror ax,1 loope again je notfound mov byteY,dl jmp donenotfound: mov byteY,-1done: mov ah,02h mov bl,byteY End运行结果:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1