汇编语言上机试验报告
1) 掌握利用跳转表法进行多级程序设计
2) 掌握汇编语言程序综合设计能力
3) 掌握利用DEBUG进行汇编语言调试的基本方法
内容: 编写程序实现下列5项功能(任选3项),通过从键盘输入1~5进行菜单式选择:
1. 按数字键“<chmetcnv unitname="”" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on"><span lang="EN-US">1</span><span style="font-family: 宋体;">”</span></chmetcnv>,完成将字符串中的小写字母变换成大写字母。用户输入有英文大小写字母或数字0~9组成的字符串(以回车符结束)。变换后按以下格式在屏幕上显示:
<原字符串>例如:abcdgyt0092
<新字符串> ABCDGYT0092
按任意键重作,按Esc键返回主菜单。
2. 按数字键“2”,完成在字符串中找最大值。用户输入用英文大小写字母和数字0~9组成的字符串(以回车符结束)。找出最大值后按以下格式在屏幕上显示:
<元字符串>
The maximum is <最大值>.
按任意键重作,按Esc键返回主菜单。
3. 按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255),然后转换成十六进制数,并按递增方式排序,按以下格式在屏幕上显示:
<原数值串>
<新数值串>
按任意键重作,按Esc键返回主菜单。
4. 按数字键“4”,完成时间的显示。首先提醒用户对时,即改变系统的定时器HH:MM:SS(以冒号间隔,回车结束),然后在屏幕上实时显示时间:
HH:MM:SS
按任意键重作,按Esc键返回主菜单。
5. 按数字键“5”,结束程序的运行,返回操作系统。
程序设计:
采用将各子功能设计为子程序,用主程序调用各个子程序完成各项功能。利用跳转表来调用子程序。
设计完成了功能1、2、4和5。
;*******************************
STRDISP MACRO _STRING ;显示字符串的宏
LEA DX,_STRING
MOV AH,09H
INT 21H
ENDM
;************************* MAIN FUNCTION ***************************
STACK SEGMENT STACK
DW 0FFH DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
MAINMENU DB 0DH,0AH,'PLEASE SELECT:',0DH,0AH,
'1.TRANSFORM LOWER TO UPPER',0DH,0AH,
'2.FIND THE MAX',0DH,0AH,
'3.TRANSFORM DEC TO HEX AND SORT(UNDONE)',0DH,0AH,
'4.CHANGE TIME',0DH,0AH,
'5.EXIT',0DH,0AH,
'INPUT YOUR CHOICE:$'
STRSUB1 DB 0DH,0AH,'PLEASE INPUT STRING:',0DH,0AH,'$'
STRSUB2 DB 'PRESS Esc TO EXIT,PRESS ANYHEY TO CONTINUE...','$'
STRBUF DB 40H DUP(?)
TABLE DW PROC1 ;跳转表
DW PROC2
DW PROC3
DW PROC4
DW PROC5
CLRF DB 0DH,0AH,'$'
DATA ENDS
CODEM SEGMENT
ASSUME CS:CODEM,DS:DATA,SS:STACK,ES:DATA
<place w:st="on"><span lang="EN-US">MAIN</span></place>: MOV AX,DATA
MOV DS,AX
AGAIN:strdisp mainmenu ;显示主菜单
MOV AH,01H ;读入用户选择
INT 21H
SUB AL,30H ;将字符转换为数字
CMP <place w:st="on"><state w:st="on">AL</state></place>,1
JB AGAIN
CMP <place w:st="on"><state w:st="on">AL</state></place>,5
JA AGAIN
SUB <place w:st="on"><state w:st="on">AL</state></place>,1
SHL <place w:st="on"><state w:st="on">AL</state></place>,1
CBW
MOV BX,AX
JMP TABLE[BX]
PROC1:CALL FAR PTR UPPER ;CALL PROC1
JMP AGAIN
PROC2:CALL FAR PTR MAXIMUM ;CALL PROC2
JMP AGAIN
PROC3:NOP ;CALL PROC3
JMP AGAIN
PROC4:CALL FAR PTR SETTIME ;CALL PROC4
JMP AGAIN
PROC5:JMP EXIT
EXIT: MOV AH,4CH
INT 21H
CODEM ENDS
;**************************** SUBFUNCTION 1 ****************************
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA
<place w:st="on"><span lang="EN-US">UPPER PROC</span></place> FAR
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH SI
PUSH DI
MOV AX,DATA
MOV DS,AX
AGAIN1:STRDISP STRSUB1 ;输出'PLEASE INPUT STRING:'
MOV BYTE PTR STRBUF,40H
LEA DX,STRBUF
MOV AH,0AH ;输入字符串到strbuf
INT 21H
MOV AL,STRBUF+1 ;取串长
add al,1
CBW
LEA SI,STRBUF+2
ADD SI,AX
MOV BYTE PTR [SI],'$'
MOV CX,AX
LOOP1:MOV BX,CX ;循环减小写字母转换为大写字母
CMP BYTE PTR STRBUF[BX],'a'
JB DONE
CMP BYTE PTR STRBUF[BX],'z'
JA DONE
SUB BYTE PTR STRBUF[BX],20H
DONE: LOOP LOOP1 ;循环
STRDISP CLRF ;回车换行
LEA DX,STRBUF+2
MOV AH,09H ;输出转换后的字符串
INT 21H
STRDISP CLRF
STRDISP STRSUB2
MOV AH,07H
INT 21H
CMP AL,01BH ;判断用户输入是否是Esc
JZ EXIT1 ;是则退出子程序
JMP AGAIN1
EXIT1:POP DI
POP SI
POP AX
POP BX
POP CX
POP DX
RET
<place w:st="on"><span lang="EN-US">UPPER ENDP</span></place>
CODE1 ENDS
;*************************** SUB FUNCTION 2 *****************************
SUB2DATA SEGMENT
SUB2STR1 DB 'PLEASE INOUT STRING:',0DH,0AH,'$'
SUB2STR2 DB 'PRESS Esc TO EXIT,PRESS ANYKEY TO CONTINUE...$'
SUB2STR3 DB 'THE MAXIMUM IS: $'
SUB2STR4 DB 0DH,0AH,'$'
SUB2BUF DB 40H DUP(?)
SUB2DATA ENDS
CODE2 SEGMENT
ASSUME CS:CODE2,DS:SUB2DATA,ES:SUB2DATA
MAXIMUM PROC FAR
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DS
PUSH ES
PUSH SI
PUSH DI
MOV AX,SUB2DATA
MOV DS,AX
MOV ES,AX
SUB2AGAIN:
STRDISP SUB2STR4 ;输出回车换行
STRDISP SUB2STR1 ;输出'PLEASE INOUT STRING:'
MOV BYTE PTR SUB2BUF,40H
LEA DX,SUB2BUF
MOV AH,0AH ;输入字符串到SUB2BUF
INT 21H
MOV AL,SUB2BUF+1
CBW
MOV CX,AX ;取字符串的长度
LEA SI,SUB2BUF+2
ADD SI,AX
MOV BYTE PTR [SI],'$'
LEA DI,SUB2BUF+2
sub di,1
MOV <place w:st="on"><state w:st="on">AL</state></place>,0
cld
LOOPSUB2:SCASB ;扫描字符串,SCASB 用AL的值减去ES:[DI]指向的值设置标志位
cmp al,es:[di]
Ja LOOPSUB2END ;AL>ES:[DI]则跳转到LOOPSUB2END
MOV AL,ES:[DI] ;AL<ES:[DI]则用ES:[DI]代替AL
LOOPSUB2END:<place w:st="on">LOOP</place> LOOPSUB2
cbw
push ax
STRDISP SUB2STR4 ;输出回车换行
STRDISP SUB2STR3 ;输出'THE MAXIMUM IS: $'
pop ax
mov dl,al
MOV AH,02H ;输出最大字符
INT 21H
STRDISP SUB2STR4 ;输出回车换行
STRDISP SUB2STR2 ;输出结束提示
MOV AH,07H ;读取按键
INT 21H
CMP AL,01BH ;与 Esc 比较
JZ EXIT2 ;是 则退出
JMP SUB2AGAIN ;否 则跳到开始,循环
EXIT2:POP DI
POP SI
POP ES
POP DS
POP AX
POP BX
POP CX
POP DX
RET
MAXIMUM ENDP
CODE2 ENDS
;*******************************
TRANS MACRO _SEG,_MEMO ;宏:将二进制数转换为数字字符
MOV <place w:st="on"><state w:st="on">AL</state></place>,_SEG
CBW
DIV TEN
ADD AH,THIRTY
ADD <place w:st="on"><state w:st="on">AL</state></place>,THIRTY
MOV _MEMO,<place w:st="on"><state w:st="on">AL</state></place>
MOV _MEMO+1,AH
ENDM
DECTOBIN MACRO _MEMORY,_SEGMENT ;宏:将两位的十进制数转换为二进制
MOV <place w:st="on"><state w:st="on">AL</state></place>,_MEMORY
SUB <place w:st="on"><state w:st="on">AL</state></place>,THIRTY
MUL BYTE PTR TEN
ADD AL,_MEMORY+1
SUB <place w:st="on"><state w:st="on">AL</state></place>,THIRTY
MOV _SEGMENT,<place w:st="on"><state w:st="on">AL</state></place>
ENDM
;******************************* SETTIME *******************************
SUB4DATA SEGMENT
HOUR DB '00$'
MINUTE DB '00$'
SECOND DB '00$'
<city w:st="on"><place w:st="on"><span lang="EN-US">COLON</span></place></city> DB ':$'
TEN DB 10D
THIRTY DB 30H
SUB4STR1 DB 'TIME:$'
STREND DB 'PRESS Esc TO EXIT,PRESS ANYOTHER KEY TO CONTINUE...$'
CLRF4 DB 0DH,0AH,'$'
TIMEBUF DB 12,8,'HH:MM:SS$'
SUBSTR2 DB 'PLEASE INPUTT THE TIME(HH:MM:SS):$'
SUBSTR3 DB 'DO YOU WANT TO RESET TIME(Y/N)?$'
SUBSTR4 DB 'SETTIME ERROR$'
SUB4DATA ENDS
CODE4 SEGMENT
ASSUME CS:CODE4,DS:SUB4DATA,ES:SUB4DATA
SETTIME PROC FAR
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DS
PUSH ES
PUSH SI
PUSH DI
MOV AX,SUB4DATA
MOV DS,AX
MOV ES,AX
SUB4AGAIN:
STRDISP CLRF4
MOV AH,2CH ;取系统时间
INT 21H
TRANS CH,HOUR
TRANS CL,MINUTE
TRANS DH,SECOND
STRDISP SUB4STR1 ;显示时间
STRDISP HOUR
STRDISP <city w:st="on"><place w:st="on">COLON</place></city>
STRDISP MINUTE
STRDISP <city w:st="on"><place w:st="on">COLON</place></city>
STRDISP SECOND
STRDISP CLRF4
STRDISP SUBSTR3
MOV AH,01 ;INPUT A LETTER INTO <place w:st="on"><state w:st="on">AL</state></place>
INT 21H
CMP AL,'Y'
JE RESETTIME
CMP <state w:st="on"><place w:st="on">AL</place></state>,'y'
JNE NORESETTIME ;IF <place w:st="on"><state w:st="on">AL</state></place> IS NOT 'Y' OR 'y' THEN END
RESETTIME:
STRDISP CLRF4
STRDISP SUBSTR2
LEA DX,TIMEBUF
MOV AH,0AH ;INPUT THE TIME STRING
INT 21H
DECTOBIN TIMEBUF+2,CH
DECTOBIN TIMEBUF+5,CL
DECTOBIN TIMEBUF+8,DH
MOV AH,2DH ;SET TIME
INT 21H
CMP AL,0 ;判断是否设置成功
JZ SUB4AGAIN ;AL为00则成功,为0FF则失败
STRDISP CLRF4
STRDISP SUBSTR4 ;显示出错信息
JMP SUB4AGAIN
NORESETTIME:
STRDISP CLRF4
STRDISP STREND
MOV AH,07H ;读取按键
INT 21H
CMP AL,01BH ;与 Esc 比较
JZ EXIT4 ;是 则退出
JMP SUB4AGAIN ;否 则跳到开始,循环
EXIT4:POP DI
POP SI
POP ES
POP DS
POP AX
POP BX
POP CX
POP DX
RET
SETTIME ENDP
CODE4 ENDS
END <place w:st="on">MAIN</place>
分享到:
相关推荐
标题和描述提到的“汇编语言程序大作业(含源代码)”指的是一个关于汇编语言编程的项目文档,其中包含了汇编语言的源代码。汇编语言是一种低级编程语言,它与计算机的机器语言非常接近,但提供了更易于理解和使用的...
### 汇编语言大作业报告知识点解析 #### 一、实验目的 1. **深入理解分支与循环程序设计的方法**:通过实际编程任务加深学生对汇编语言中分支(如`JZ`, `JNZ`等)和循环(如`LOOP`, `DEC`, `JNZ`等)控制结构的理解...
重庆大学汇编语言作业四,对教材的主要内容进行总结复习,方便学生复习。
"汇编语言第三章作业答案" 本作业答案涵盖了汇编语言第三章的相关知识点,包括立即操作数、寄存器操作数、存储器操作数、寻址方式、物理地址计算、指令执行结果比较、段超越前缀的用法等。 1. 操作数类型 在汇编...
福州大学的汇编语言程序设计实践作业集合涵盖了多个经典算法和数据结构的实现,这些练习旨在帮助学生深入理解和掌握汇编语言编程技能。下面将详细解释每个作业涉及到的知识点。 作业一:简单编程 这部分可能包含...
本资源包含了作者在大一期间学习汇编语言过程中的宝贵资料,包括平时实验报告、期末大作业的源代码以及期末考试试卷,这些都是学习汇编语言的重要参考资料。 实验报告是学习汇编语言的关键部分,它们记录了作者在...
在本项目中,我们主要探讨的是“(武汉理工大学)汇编语言程序设计大作业代码及报告”。这个作业涉及的核心知识点是使用汇编语言来实现矩阵的转置和运算操作,这是计算机科学基础教育中的一项重要技能,特别是对于...
本项目标题为“汇编语言作业——进制转换器”,显然,这是一个使用WIN32汇编语言编写的程序,它的主要功能是实现不同进制之间的转换,如二进制、八进制、十进制和十六进制之间的转换。对于初学者来说,这样的程序...
北京理工大学的《汇编语言》是一门深入研究计算机基础指令集、程序设计和计算机工作原理的专业课程。从提供的文件片段来看,包含了多个汇编语言相关的习题及其答案,主要涉及了寻址方式、指令执行、物理地址计算以及...
【汇编语言程序设计大作业】是一门针对信息安全专业学生的大作业,旨在加深对汇编语言的理解和应用。作业的核心任务是设计一个程序,能够处理一系列学生的考试成绩,包括成绩的合法验证、平均分、最高分、最低分的...
汇编语言程序大作业 本资源是关于汇编语言程序大作业的详细介绍,包括源代码和程序实现过程的详细分析。该程序的功能是根据用户从键盘的不同输入,回显在显示器上不同的结果。其实现的功能是当用户从键盘输入01至12...
《四川大学汇编语言程序设计答案详解》涵盖了基础的数字转换和计算机内部的数值表示,这对于理解汇编语言编程至关重要。下面将详细解释这些知识点: 1. **十进制到二进制转换**:这是最基本的数字系统转换。例如,9...
《微机原理大作业:深入理解与应用汇编语言及EMU8086软件》 在计算机科学领域,微机原理是理解计算机硬件与软件交互的基础,而汇编语言则是直接控制计算机硬件的重要工具。本大作业以大二学生视角出发,通过学习...
**汇编语言实验报告概述** 汇编语言是计算机科学中的一种低级编程语言,它与机器语言紧密相关,每一行汇编代码都对应一个特定的机器指令。在天津大学计算机学院的课程中,汇编语言的实践性学习是至关重要的,通过...
教学要求方面,该书提倡在课堂上要注重理解,通过笔记记录补充的例题等重要信息,并在课堂之外复习教材、完成作业,同时还要充分利用上机时间进行编程练习,从而达到熟练掌握汇编语言的目的。考核方面,课程成绩由...
《汇编语言课程设计》是一门深入探讨计算机底层运行机制的重要课程,旨在帮助学习者理解计算机硬件与软件之间的紧密联系。汇编语言是计算机科学的基础,它是一种低级编程语言,每条指令直接对应于计算机硬件的机器码...
"计算机组成原理与汇编语言程序设计课后答案" 计算机组成原理与汇编语言程序设计是计算机科学和技术的基础课程,对计算机的硬件和软件进行了深入的剖析和研究。该课程的主要内容包括计算机的基本结构、计算机的存储...
从给定的文件信息中,我们可以提炼出一系列与计算机科学基础——特别是数字系统与汇编语言相关的知识点。这些知识点涵盖了二进制、十进制、十六进制之间的转换,以及二进制数的算术与逻辑运算。下面,我们将详细探讨...