汇编语言实验三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档