汇编语言实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告
课程名称:汇编语言程序设计
实验名称:实验三模块化程序设计
实验时间: 2015-5-12,14:30-17:30
实验地点:南一楼804室15号实验台
指导教师:曹忠升
专业班级:
学号:
姓名:李肇宁
同组学生:无
报告日期:2015年6月8日
计算机科学与技术学院
一、原创性声明
本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。
特此声明!
学生签字:
日期:2015.6.3
二、评语与成绩评定
1.指导老师评语
2.实验成绩评定
指导教师签字:
日期:
目录
1 实验目的与要求 (1)
2 实验内容 (1)
3 实验过程 (2)
3.1 任务1 (2)
3.1.1 设计思想及存储单元分配 (2)
3.1.2 流程图 (2)
3.1.3 源程序 (4)
3.1.4 实验步骤 (10)
3.1.5实验记录 (10)
3.任务2 (13)
3.2.1 设计思想及存储单元分配 (13)
3.2.2 源程序 (13)
3.2.3 实验步骤 (18)
4 体会 (19)
1实验目的与要求
(1) 进一步掌握程序设计方法,包括宏指令、模块化程序设计方法;
(2) 掌握较大规模程序的调试方法。
2实验内容
任务1:
输入一组有符号字数据。对该组数进行排序,按照从大到小的顺序以用户指定的进制形式输出排序后的结果。
运行时:
Please input numbers:
123 0 -100 -50 +300 25 ↙
Output Format (1: decimal; 2 :hex; 3: Octal) : 1↙
300, 123, 25, 0, -50, -100
运行时:
Please input numbers:
123 0 -100 -50 300 25 ↙
Output Format (1: decimal; 2 :hex; 3: Octal ) : 2↙
12CH, 7BH, 19H, -32H, -64H
要求:
(1) 画出程序流程图,给出寄存器、存储单元的分配方法,子程序的功能、入口参数及出口参数(对于各个子程序,也要说明其寄存器、存储单元的分配情况。在流程图中也列出相应子程序的名称)。
(2) “数字串到字数据的转换”用子程序实现。要求:该子程序只实现一个数字串的转换。对于多个数字串,要多次调用该子程序。(可以借鉴教材中的示例,注意每个模块前都应该加上“.386”)。对于非数字串,以及超过一个字大小的数字串应给出提示。
(3) “排序”使用子程序实现。
(4) “数值数据到串的转换”用子程序实现。要求该子程序只实现一个数值数据的转换。
(5) 输入时,数字串之间的分割符可以是一个空格,也可以是一个标点符号(如逗号),数字串前可有一个正号或负号。输出时,数字串之间的分割符号为一个逗号加上一个空格。
(6) 观察执行CALL指令时,堆栈的变化,以及IP、CS的变化。
(7) 掌握跟踪进入子程序的方法。
(8) 定义宏并使用宏指令,观察宏扩展后的结果。
(9) 采用模块化程序的方法设计该程序。
说明:
(1) 写下必要的设计文档可以帮助我们理清思路,减少写程序时的错误;
(2) 同学们可以相互讨论算法思想,理清思路;
(3) 可以先不用子程序来实现程序的功能,然后再改写成子程序,最后拆分到不同模块;
(4) 在源程序中加上适当的注释。
任务2:
(1) 将上述程序改成简化段定义,并用第6章提到的INVOKE调用子程序。给出要做怎样的调整,给出改写后的源程序。设计思想及存储单元分配、流程图部分可简单写或省略。
(2) 观察各个模块中定义的段在内存中相互之间的关系,包括定义的段满足合并条件(即相同段名、类别、加了PUBLIC属性)的情况和不满足合并条件时的情况,以及简化段时的情况。
3实验过程
3.1任务1
3.1.1设计思想及存储单元分配
设计思想:
1.采用1号DOS功能调用输入一个字符,送入BUF字节缓冲区;
2.再调用F10T2子模块将BUF区中这个十进制数字串转换为二进制,送入ARR字存储区;
3.再调用F2TN和QUEUE将ARR缓冲区中所有符号数排序并按指定进制输出
存储单元分配:
AX——中间寄存器。
BX——往ARR字存储区送数指针,初值为ARR。
CX——作以逗号分隔的一个十进制数字串长度计数器,初值为0。
DX——按系统功能调用的规定使用。
DI——往BUF字节存储区送输入的字符指针,初值为BUF。
SI——调用F10T2子模块的入口参数,作从BUF区取字符指针。
BUF——输入缓冲区首址。
ARR——经转换得到的二进制数组存储区首址。
COUNT——ARR存储区中数组元素个数计数器,初值为0。
SIGN——输入字符串处理结束标志,1—处理结束,0—处理未结束
3.1.3 源程序
主模块程序:
NAME MAIN
EXTRN F10T2:NEAR,F2TN:NEAR,QUEUE:NEAR
IF1 ;将宏库在第一次扫描时加入一起汇编INCLUDE MACRO.LIB
ENDIF
.386
DA TA SEGMENT USE16 PARA PUBLIC'DATA'
BUF DB 8 DUP(0) ;输入的一个十进制数字串存储区
ARR DB 32 DUP(0) ;转换后的二进制数组存储区
SIGN DB 0 ;是否输完标志,1已输完,0未输完
COUNT DW 0 ;转换后的二进制数组元素个数计数器
ERROR DB 'IS ILLEGGAL DIGIT!$'
OUTPUT1 DB 'PLEASE INPUT YOUR NUMBER SEPARATED BY SPACE:$' OUTPUT2 DB 'OUTPUT FPEMAT(1:DECIMAL;2:HEX;3: OCTAL):$'
DA TA ENDS
STACK0 <200 DUP(0)>;调用宏指令定义堆栈
CODE SEGMENT USE16 PARA PUBLIC'CODE'
ASSUME DS:DATA,ES:DATA,CS:CODE,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA BX,ARR ;数组首址ARR->BX
MOV COUNT,0 ;数组元素个数计数器COUNT
MOV SIGN,0
WRITE OUTPUT1
BEG: LEA DI,BUF ;数组串存储区首址
MOV CX,0
NEXT0:MOV AH,1
INT 21H
CMP AL,' ' ;判断输入字符是否是空格
JE DIGIT ;是,代表一个数输完
CMP AL,0DH ;判断输入字符是否是回车符
JNE P
CMP COUNT,0
JE EXIT
INC SIGN