微原上机作业
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主程序
开始
程序一
开始
显示提示字符 串,即跳转表
输入字符串,放 入 BUFFER 中
输入一个字符
取出串长,即 CX=BUFFER+1
字符=5?
是 跳转到相应的 子程序
执行该程序 按键 ESC
否 是
结束
将指针指向字符串开 始,即 SI=BUFFER+2
字符 ASCII 码 ≥61H
否
否
是
ACSII 码值减 20H SI=SI+1
LP2: MOV Ax,[SI] CMP Ax,[SI-2] JAE NOXCHG XCHG Ax,[SI-2] MOV [SI],Ax
NOXCHG: DEC SI DEC SI LOOP LP2
CALL DISPAX CALL KONG CALL ZUO CALL XUHAO CALL YOU CALL DISPCR POP SI POP CX LOOP LP1 mov ax, 4c00h ; exit to operating system. int 21h
微原上机作业
作业说明:
前 12 页为作业流程框图、心得体会、结果截图;后面为作业的程序编写
姓名:曹延琴 学号:13140120087 班级:1314012
4.18 从键盘上读一个正整数 N(0≤N≤65535),转换成十六进制数存入 AX,并在屏幕上显 示出来。
开始
键盘输入十进制数 (调用 INT 21H AH=09H)
CX=0?
是
输出转化后的字符串
否
按键 ESC 是
返回主菜单
程序二
开始
输入字符串,放 在 BUFFER 中
取出字符串长, 即 CX=BUFFR+1
将指针指向第 一个字符,即 SI=BUFFER+2
SI≥SI+1
否
是
[SI]与[SI+1]交换内容
SI=SI+1
否 CX=0? 是
将百度文库SI]放入 DL
AH=02H,调用 INT21H 显示
下图为运行结果: 0000 表示变换结果正确,即输入的正整数在 0~65535 之间; FFFF 表示输入的正整数超出了范围。
4.37 编写程序实现,将缓冲区 BUFFER 中的 100 个字按递增排序,并按下列格式顺序显 示:
数据 1 <原序号> 数据 2 <原序号>……
开始
在 BUFFER 中产生 100 个字, 复制一份放在 OUTPUT 中
DISPAL ENDP CHANGE PROC NEAR
CMP AL,10 JNGE CHANG1
ADD AL,7 CHANG1:
ADD AL,30H RET CHANGE ENDP DISPAX PROC NEAR XCHG AL,AH CALL DISPAL XCHG AH,AL CALL DISPAL RET DISPAX ENDP DISPCR PROC NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,0AH INT 21H
2.程序一
程序二 程序三 程序四:
程序五:
4.18
data segment KEYBUFFER DB 100 DB ? DB 100 DUP(?) STRING1 DB 'Please input decimal data:$'
data ends
stack segment STACK'STACK' DW 100H DUP(?)
POP DX POP AX RET DISPCR ENDP TRANS10TO16 PROC NEAR PUSH CX PUSH DX PUSH SI XOR AX,AX XOR CX,CX MOV CL,[SI] INC SI MOV AL,[SI] INC SI SUB AL,30H DEC CX JCXZ TRANSF2 MOV BX,10 TRANSF1: MUL BX JC TRANSF_ERR MOV DL,[SI] INC SI SUB DL,30H ADD AL,DL ADC AH,0 JC TRANSF_ERR LOOP TRANSF1 MOV BX,0 TRANSF2:
Total <总人数> A: <人数 1> B: <人数 2> C: <人数 3> D: <人数 4> E: <人数 5> F: <人数 6>
开始
用同余法产生 225 个随机数
每个数加 50
按顺序每 5 个数求平均 值,循环 45 次,得到 45 个同学的平均成绩
CX=45
成绩≥90 是
A 人数+1
(1)按数字键 1,完成将字符串的小写字母变换成大写字母。用户输入由英文大写字母或
数字 0~9 组成组成的字符串(以回车结束),变换后在屏幕上显示:
<原字符串> 例如:abcdgyt0092
<新字符串>
ABCDGTY0092
按任意键重;按 ESC 键返回主菜单。
(2)按数字键 2,完成在字符串中找最大值。用户输入由英文小写字母或数字 0~9 组成的
4.38 按同余法产生一组随机数 N(1<N≤50),并按 N+50 赋给 45 名同学的 5 门课程成绩, 要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班同学的成绩各等级的人数 (A:90~100, B:80~89; C:70~79; D:66~69; E:60~65; F:60 以下),按下列要求显示:
环时循环 5 次,求出每个同学的 5 门成绩之和,大循环是在求平均数 45 次。 3. 比较每个同学的成绩,利用条件跳转到相应的等级,在对应的等级加 1,这
样得出了每个等级的人数。 4. 在编程中,没有定义临时存储单元,导致无法显示。在数据段定义存储单
元后,解决了该问题。
运行结果:
4.39 编写程序实现下列 5 项功能,通过键盘输入 1~5 进行菜单式选择:
现场保护 (保护 CX,SI)
将指针指向最后一个数,并 将最后一个数放在 AX 中
AX>[SI-1]
f否 是
将 AX 与[SI-1]互换 否
SI=SI-1 CX=CX-1
CX==0?
是 在 AX 中得到最小的数
CX 不为 0
将 AX 中的数与 OUTPUT 中的数相 比较,相同时得到原序号
调用子程序显示 弹出 CX,SI
DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX MOV CL,4 SHR AL,CL CALL CHANGE MOV AH,02 MOV DL,AL INT 21H POP AX AND AL,0FH CALL CHANGE MOV AH,02 MOV DL,AL INT 21H POP DX POP CX POP AX RET
TOP LABEL WORD stack ends
code segment ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
start: mov ax, data mov ds, ax mov es, ax mov ax,STACK mov ss,ax lea sp,TOP
否
成绩≥80 否 是
B 人数+1
否
成绩≥70 否 是
C 人数+1
否
成绩否≥66 是
D 人数+1
否 否
成绩≥60 否 是
E 人数+1
F 人数+1
CX=0? 是
调用显示子程序显 示各等级的人数
结束
心得体会: 1.用重复宏产生了随机数列,加强了重复宏的应用。 2.在给每个成绩加 50 和求平均数时,运用了循环嵌套。小循环是在每次大循
JMP TRANSF_OK TRANSF_ERR:
MOV BX,-1 TRANSF_OK:
POP SI POP DX POP CX RET TRANS10TO16 ENDP
code ends end start
4.37
N=100 data segment BUFFER DW N DUP(?) OUTPUT DW N DUP(?) DECIMAL DB 5 DUP(?) data ends
否 按键 ESC
是
返回主菜单
程序三
开始
输入数值串,并回显 统计数据个数,并 存入 CX
依次比较两个数的大小
前一个大于 后一个数
否
是
否
两个数调换次序
CX=0? 是
将排好序的数值串转 化为十六进制
调用 DISPAX 显示
否
按键 ESC
是 返回主菜单
程序四
开始 显示提示字符串 输入 1、2 位数值
输入 4、5 位数值
LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER INT 21H LEA SI,KEYBUFFER+1 CALL TRANS10TO16 CALL DISPCR CALL DISPAX CALL DISPCR MOV AX,BX CALL DISPAX MOV AH,4CH MOV AL,0 int 21h
字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:
<原字符串>
The maximum is <最大值>
按任意键重做;按 ESC 键返回主菜单。
(3)按数字键 3,完成输入数组的排序。用户输入一组十进制数值(小于 255),然后变换
成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:
<原数值串>
结束
心得体会: 1. 此程序主要是采用冒泡排序法实现的,采用双重循环的排序:从后往前,每 两个数据相比较,当前者大于后者,两者交换位置,否则不变,这样,经过 N-1 次, 就将最小的数取出来。对剩下的 N-1 的数据,重复上面的步骤,将次小值 放到了第二个位置,依次类推,进行 N-1 次比较,可将数据从小到大排列好。 2. 原序号的显示。未排序前将原序列复制一份放在另一个存储单元 OUTPUT 中, 每次内循环结束后,将取得的数与 OUTPUT 中的数循环比较,相同时,可得其序 号为 N+1-CX,这样就得出了排序后的数在排序前的序号。 3. 采用了尖括号显示,空格显示,回车显示等子程序。 4. 在编程中,采用例 4.5 时,没有将字节换成字,导致不匹配,无法正常排序。 下图为运行结果:(以十个数为例)
将十进制转换为十六进制 (调用子程序 TRANS10TO16)
(例题 4.12)
显示十六进制内容 (调用子程序 DISPAX)
(例题 3.14)
结束
心得体会:
1. 该题的主要思路就是将十进制数转化为十六进制数,并显示出来,所以可以 用到例 4.12 和例 3.14 的子程序,又另外加了光标换行子程序 DISPCR,调用 INT 21H 就可实现。 2.十进制变换十六进制的算法为 y=10 x (10 x (10 x (10 x X5+X4)+X3)+X2)+X1, X1 为最低位,X5 为最高位,据此可以编写出子程序 TRANS10TO16。 3. 在调试过程中,出现了子程序入口参数和出口参数和主程序对不上,经过 single step 调试,解决了这一问题。
MOV CX,N LEA SI,BUFFER LEA DI,OUTPUT L0: MOV AX,[SI] ADD SI,2 MOV [DI],AX ADD DI,2 LOOP L0
MOV CX,N+1 DEC CX
LEA SI,OUTPUT MOV DX,N-1 SHL DX,1 ADD SI,DX LP1: PUSH CX PUSH SI
stack segment DW 100H dup(0)
stack ends
code segment start:
mov ax, data mov ds, ax mov es, ax
MOV CX,N LEA SI,BUFFER MOV AX,1234H
LP: MOV [SI],AX SUB AX,1 INC SI INC SI LOOP LP
<新数值串>
按任意键重做;按 ESC 键返回主菜单。
(4)按数字键 4,完成时间显示。首先提示用户对时,即改变系统的定时器 HH:MM:SS(以
冒号间隔,回车结束),然后在屏幕的右上角显示出时间:HH:MM:SS。
按任意键重新对时;按 ESC 键返回主菜单。
(5)按数字键 5,结束程序的运行,返回操作系统。
输入 7、8 位数值
重置系统时间
输出系统时间
否
按键 ESC
是
返回主菜单
心得体会: 1. 该程序共有五个功能,是利用跳转表实现的(例 4.25)。再通过调用各个功能 的子程序,来跳转实现功能。执行完后,根据选择来决定重新执行还是退出程序。 2. 由于总程序的功能较多,所以要申请好地址空间,避免重复,无法显示。 3. 在字符串显示时,未在其后加”$”符号,导致显示出错。 4. 在执行功能四时,由于电脑系统时间无法改变,导致显示出错。 运行结果: 1. 主程序:
开始
程序一
开始
显示提示字符 串,即跳转表
输入字符串,放 入 BUFFER 中
输入一个字符
取出串长,即 CX=BUFFER+1
字符=5?
是 跳转到相应的 子程序
执行该程序 按键 ESC
否 是
结束
将指针指向字符串开 始,即 SI=BUFFER+2
字符 ASCII 码 ≥61H
否
否
是
ACSII 码值减 20H SI=SI+1
LP2: MOV Ax,[SI] CMP Ax,[SI-2] JAE NOXCHG XCHG Ax,[SI-2] MOV [SI],Ax
NOXCHG: DEC SI DEC SI LOOP LP2
CALL DISPAX CALL KONG CALL ZUO CALL XUHAO CALL YOU CALL DISPCR POP SI POP CX LOOP LP1 mov ax, 4c00h ; exit to operating system. int 21h
微原上机作业
作业说明:
前 12 页为作业流程框图、心得体会、结果截图;后面为作业的程序编写
姓名:曹延琴 学号:13140120087 班级:1314012
4.18 从键盘上读一个正整数 N(0≤N≤65535),转换成十六进制数存入 AX,并在屏幕上显 示出来。
开始
键盘输入十进制数 (调用 INT 21H AH=09H)
CX=0?
是
输出转化后的字符串
否
按键 ESC 是
返回主菜单
程序二
开始
输入字符串,放 在 BUFFER 中
取出字符串长, 即 CX=BUFFR+1
将指针指向第 一个字符,即 SI=BUFFER+2
SI≥SI+1
否
是
[SI]与[SI+1]交换内容
SI=SI+1
否 CX=0? 是
将百度文库SI]放入 DL
AH=02H,调用 INT21H 显示
下图为运行结果: 0000 表示变换结果正确,即输入的正整数在 0~65535 之间; FFFF 表示输入的正整数超出了范围。
4.37 编写程序实现,将缓冲区 BUFFER 中的 100 个字按递增排序,并按下列格式顺序显 示:
数据 1 <原序号> 数据 2 <原序号>……
开始
在 BUFFER 中产生 100 个字, 复制一份放在 OUTPUT 中
DISPAL ENDP CHANGE PROC NEAR
CMP AL,10 JNGE CHANG1
ADD AL,7 CHANG1:
ADD AL,30H RET CHANGE ENDP DISPAX PROC NEAR XCHG AL,AH CALL DISPAL XCHG AH,AL CALL DISPAL RET DISPAX ENDP DISPCR PROC NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,0AH INT 21H
2.程序一
程序二 程序三 程序四:
程序五:
4.18
data segment KEYBUFFER DB 100 DB ? DB 100 DUP(?) STRING1 DB 'Please input decimal data:$'
data ends
stack segment STACK'STACK' DW 100H DUP(?)
POP DX POP AX RET DISPCR ENDP TRANS10TO16 PROC NEAR PUSH CX PUSH DX PUSH SI XOR AX,AX XOR CX,CX MOV CL,[SI] INC SI MOV AL,[SI] INC SI SUB AL,30H DEC CX JCXZ TRANSF2 MOV BX,10 TRANSF1: MUL BX JC TRANSF_ERR MOV DL,[SI] INC SI SUB DL,30H ADD AL,DL ADC AH,0 JC TRANSF_ERR LOOP TRANSF1 MOV BX,0 TRANSF2:
Total <总人数> A: <人数 1> B: <人数 2> C: <人数 3> D: <人数 4> E: <人数 5> F: <人数 6>
开始
用同余法产生 225 个随机数
每个数加 50
按顺序每 5 个数求平均 值,循环 45 次,得到 45 个同学的平均成绩
CX=45
成绩≥90 是
A 人数+1
(1)按数字键 1,完成将字符串的小写字母变换成大写字母。用户输入由英文大写字母或
数字 0~9 组成组成的字符串(以回车结束),变换后在屏幕上显示:
<原字符串> 例如:abcdgyt0092
<新字符串>
ABCDGTY0092
按任意键重;按 ESC 键返回主菜单。
(2)按数字键 2,完成在字符串中找最大值。用户输入由英文小写字母或数字 0~9 组成的
4.38 按同余法产生一组随机数 N(1<N≤50),并按 N+50 赋给 45 名同学的 5 门课程成绩, 要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班同学的成绩各等级的人数 (A:90~100, B:80~89; C:70~79; D:66~69; E:60~65; F:60 以下),按下列要求显示:
环时循环 5 次,求出每个同学的 5 门成绩之和,大循环是在求平均数 45 次。 3. 比较每个同学的成绩,利用条件跳转到相应的等级,在对应的等级加 1,这
样得出了每个等级的人数。 4. 在编程中,没有定义临时存储单元,导致无法显示。在数据段定义存储单
元后,解决了该问题。
运行结果:
4.39 编写程序实现下列 5 项功能,通过键盘输入 1~5 进行菜单式选择:
现场保护 (保护 CX,SI)
将指针指向最后一个数,并 将最后一个数放在 AX 中
AX>[SI-1]
f否 是
将 AX 与[SI-1]互换 否
SI=SI-1 CX=CX-1
CX==0?
是 在 AX 中得到最小的数
CX 不为 0
将 AX 中的数与 OUTPUT 中的数相 比较,相同时得到原序号
调用子程序显示 弹出 CX,SI
DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX MOV CL,4 SHR AL,CL CALL CHANGE MOV AH,02 MOV DL,AL INT 21H POP AX AND AL,0FH CALL CHANGE MOV AH,02 MOV DL,AL INT 21H POP DX POP CX POP AX RET
TOP LABEL WORD stack ends
code segment ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
start: mov ax, data mov ds, ax mov es, ax mov ax,STACK mov ss,ax lea sp,TOP
否
成绩≥80 否 是
B 人数+1
否
成绩≥70 否 是
C 人数+1
否
成绩否≥66 是
D 人数+1
否 否
成绩≥60 否 是
E 人数+1
F 人数+1
CX=0? 是
调用显示子程序显 示各等级的人数
结束
心得体会: 1.用重复宏产生了随机数列,加强了重复宏的应用。 2.在给每个成绩加 50 和求平均数时,运用了循环嵌套。小循环是在每次大循
JMP TRANSF_OK TRANSF_ERR:
MOV BX,-1 TRANSF_OK:
POP SI POP DX POP CX RET TRANS10TO16 ENDP
code ends end start
4.37
N=100 data segment BUFFER DW N DUP(?) OUTPUT DW N DUP(?) DECIMAL DB 5 DUP(?) data ends
否 按键 ESC
是
返回主菜单
程序三
开始
输入数值串,并回显 统计数据个数,并 存入 CX
依次比较两个数的大小
前一个大于 后一个数
否
是
否
两个数调换次序
CX=0? 是
将排好序的数值串转 化为十六进制
调用 DISPAX 显示
否
按键 ESC
是 返回主菜单
程序四
开始 显示提示字符串 输入 1、2 位数值
输入 4、5 位数值
LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER INT 21H LEA SI,KEYBUFFER+1 CALL TRANS10TO16 CALL DISPCR CALL DISPAX CALL DISPCR MOV AX,BX CALL DISPAX MOV AH,4CH MOV AL,0 int 21h
字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:
<原字符串>
The maximum is <最大值>
按任意键重做;按 ESC 键返回主菜单。
(3)按数字键 3,完成输入数组的排序。用户输入一组十进制数值(小于 255),然后变换
成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:
<原数值串>
结束
心得体会: 1. 此程序主要是采用冒泡排序法实现的,采用双重循环的排序:从后往前,每 两个数据相比较,当前者大于后者,两者交换位置,否则不变,这样,经过 N-1 次, 就将最小的数取出来。对剩下的 N-1 的数据,重复上面的步骤,将次小值 放到了第二个位置,依次类推,进行 N-1 次比较,可将数据从小到大排列好。 2. 原序号的显示。未排序前将原序列复制一份放在另一个存储单元 OUTPUT 中, 每次内循环结束后,将取得的数与 OUTPUT 中的数循环比较,相同时,可得其序 号为 N+1-CX,这样就得出了排序后的数在排序前的序号。 3. 采用了尖括号显示,空格显示,回车显示等子程序。 4. 在编程中,采用例 4.5 时,没有将字节换成字,导致不匹配,无法正常排序。 下图为运行结果:(以十个数为例)
将十进制转换为十六进制 (调用子程序 TRANS10TO16)
(例题 4.12)
显示十六进制内容 (调用子程序 DISPAX)
(例题 3.14)
结束
心得体会:
1. 该题的主要思路就是将十进制数转化为十六进制数,并显示出来,所以可以 用到例 4.12 和例 3.14 的子程序,又另外加了光标换行子程序 DISPCR,调用 INT 21H 就可实现。 2.十进制变换十六进制的算法为 y=10 x (10 x (10 x (10 x X5+X4)+X3)+X2)+X1, X1 为最低位,X5 为最高位,据此可以编写出子程序 TRANS10TO16。 3. 在调试过程中,出现了子程序入口参数和出口参数和主程序对不上,经过 single step 调试,解决了这一问题。
MOV CX,N LEA SI,BUFFER LEA DI,OUTPUT L0: MOV AX,[SI] ADD SI,2 MOV [DI],AX ADD DI,2 LOOP L0
MOV CX,N+1 DEC CX
LEA SI,OUTPUT MOV DX,N-1 SHL DX,1 ADD SI,DX LP1: PUSH CX PUSH SI
stack segment DW 100H dup(0)
stack ends
code segment start:
mov ax, data mov ds, ax mov es, ax
MOV CX,N LEA SI,BUFFER MOV AX,1234H
LP: MOV [SI],AX SUB AX,1 INC SI INC SI LOOP LP
<新数值串>
按任意键重做;按 ESC 键返回主菜单。
(4)按数字键 4,完成时间显示。首先提示用户对时,即改变系统的定时器 HH:MM:SS(以
冒号间隔,回车结束),然后在屏幕的右上角显示出时间:HH:MM:SS。
按任意键重新对时;按 ESC 键返回主菜单。
(5)按数字键 5,结束程序的运行,返回操作系统。
输入 7、8 位数值
重置系统时间
输出系统时间
否
按键 ESC
是
返回主菜单
心得体会: 1. 该程序共有五个功能,是利用跳转表实现的(例 4.25)。再通过调用各个功能 的子程序,来跳转实现功能。执行完后,根据选择来决定重新执行还是退出程序。 2. 由于总程序的功能较多,所以要申请好地址空间,避免重复,无法显示。 3. 在字符串显示时,未在其后加”$”符号,导致显示出错。 4. 在执行功能四时,由于电脑系统时间无法改变,导致显示出错。 运行结果: 1. 主程序: