汇编语言课程设计任务书

  • 格式:doc
  • 大小:584.00 KB
  • 文档页数:17

1 汇编语言课程设计任务书

一、课程设计目的

1. 掌握汇编语言与高级语言的接口方法,正确编写混合语言程序,掌握混合语言程序的调试和运行;

2. 掌握DOS、BIOS系统功能调用,掌握基本的显存读写技术;进一步了解汇编接口的功能和用法,掌握利用定时器产生声音的方法;

3. 学会用汇编语言编写一个较完整的实用程序,培养自己的动手操作能力;

4. 学习汇编语言项目设计的基本思路和方法,编程、调试、撰写报告等。

二、任务内容:

任务一:混合编程,将内存中的一个字符串的小写字母转换为大写并输出。也可根据自己兴趣自定题目。

要求:1.分别运用混合编程的两种方法:嵌入式编程、C程序调用汇编函数模块完成该任务;

2.也可根据兴趣自定题目,如排序、求阶乘和等。

任务二:以下题目二选一

1. 显示系统日期和时间

要求:1.在屏幕特定位置显示当前系统日期和时间;

2.显示的日期和时间要求即时更新,即设计为跳动的时钟;

3.可自定义电子钟的显示区域、显示位置、背景和前景色或以图形化方式显示。

4.当按下某个键,如“Q”时,程序返回DOS,数字钟消失。

2. 利用PC扬声器演奏乐曲

要求:1.在屏幕特定位置显示乐曲名称;

2.循环演奏乐曲(自选);

3.当按下某个键,如“Q”时,音乐停止,程序返回DOS。

三、课程设计报告的要求

1. 本次课程设计每位同学必须认真、独立的完成课程设计的编程和调试。

2. 课程设计报告要求使用A4纸打印,必须有目录。封面提供,内容要认 2 真独立完成。

3. 课程设计报告内容一般应包含如下部分:

① 课程设计目的、内容;

② 每个任务的程序流程图

③ 程序清单

④ 调试结果及分析;

⑤ 收获、体会和建议。

4. 课程设计结束同时上交课程设计报告,不得拖延。

四、成绩的评定

1. 考勤(20分)

2. 调试验收(30分)

3.

随机回答指导教师的问题(20分)

4. 课程设计报告(30分)

5. 课程设计态度不认真,超过1/3时间不到者,不予及格。

6. 完全拷贝他人,对设计内容一无所者或知之甚少者,一经发现,不予及格。

7. 课程设计报告雷同或抄袭者,不予及格。

8. 可以自主扩充功能,有创新可加分。 3 汇编语言课程设计指导书

一、混合编程预备知识

(一)什么是混合编程

多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程。程序的大部分采用高级语言编写,可以提高程序的开发效率;在某些部分,利用汇编语言编写,可以提高程序的运行效率。

(二)混合编程方法

汇编语言与C语言混合编程有4种实现方法:一是嵌入式汇编,即将汇编语句或程序嵌入到C语言程序中;二是在C语言程序中调用汇编语言函数(汇编函数以汇编程序源文件形式存在);三是在汇编语言程序中调用C语言程序;四是采用DOS或BIOS调用函数。这里我们着重介绍前两种方法。

1. 嵌入式汇编

(1)C语言中嵌入汇编语句的格式如下:

asm 操作码 操作数 <;或换行>

如以下C源程序文件“test.c”:

(2)编译连接方法

含有嵌入式汇编语句的C程序的编译连接,需要使用TC环境的命令行编译器TCC. EXE,而TCC.EXE在编译时要调用TASM.EXE,因此TC安装目录下必须有汇编程序TASM.EXE。但是在大多数的情况下此目录中是没有TASM.EXE的。我们可以先下载TASM 5.0进行安装,然后将安装目录下的TASM.EXE直接拷贝到TC安装目录下,就可以用了。TCC.EXE的调用格式是: 4 TCC [options] file[s]

其中,file[s]为需要编译或连接的文件,可有一个或多个。[option]为各个参数选项,常用的有“-B”,用于指示源程序中使用了嵌入式汇编,则编译命令为:

TCC –Id:\tc\include –B test

注意:TCC区分大小写,B必须为大写。

(3)编译连接过程

假定TC2.0安装目录为C:\turboc2,test.c文件在turboc2文件夹中,且该目录中含有TASM.EXE。则编译连接过程如下:

①启动命令提示符,使用cd \turboc2命令切换到tc目录,输入TCC命令:

②运行该编译命令,如下图所示表示编译连接成功:

③此时在当前目录下生成test.obj、test.exe文件,运行test.exe文件,结果如下:

5 结果正确!

2. 在C语言程序中调用汇编语言函数

此方法要求分别编译C语言程序和汇编语言程序,再将目标文件连接成一个可执行文件。在这一过程中,汇编语言程序被看作函数,被C语言程序调用。C语言程序以汇编语言子程序名作为函数名调用汇编语言程序模块。

(1)编写源程序

汇编语言子模块的过程应用PUBLIC伪指令将其说明为“公用过程”。在C语言程序中,也应对被调用的汇编语言程序模块用EXTERN声明为“外部模块”。

例如:在C中调用汇编语言模块完成两个数的求和。

C文件(命名为ADDC.C)

参数传递主要采用堆栈来进行。对于TC中的小模式采用近调用,参数入栈采用自右向左的顺序,即变量y、变量x,且在栈中各占用2个字节。

汇编语言文件(命名为ADDM.ASM,完成的功能为求两个整数之和)

可以看出代码段是以带下划线的标识符开头的,代码段的标识为_TEXT,这是由TC编译程序所定好了的,如果不按照这个格式书写汇编代码,调用就不 6 会成功。TC编译器默认情况下,对外部标识符均要在其首部加下划线,所以C程序中调用的函数ADDUP在这里也是以下划线标出:_ADDUP。

(2)编译过程

①用MASM宏汇编在命令行下对ADDM. ASM汇编,汇编后生成一个模块文件 ADDM.OBJ,然后将ADDM.OBJ复制到TC目录下,以便于建立TC下的工程文件。

②工程文件的建立。在TC集成环境下建一个新文件,其内容为:

就只有以上两行内容,写完后保存为ADDCM.PRJ,说明了该工程包含了ADDC.C和ADDM.OBJ两个程序模块。

③对工程文件编译连接。在TC环境中利用Compile—Make EXE file命令,可将该文件编译连接为ADDCM.EXE。

运行ADDCM.EXE,结果如下:

7 二、系统时间的获取和显示

(一)时间的获取

调用系统日期和时间,并将调用的日期和时间数转换成ASCII码存在系统内存区的字符串中。将存在系统内存区的日期和时间用字符串存入显存区(显存的起始地址:B800:0000)并在合适的位置显示出来。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式(如利用定时器中断,中断类型号为1CH)来不断获取系统的时间,这样就形成了会跳动的电子钟。流程图如图1、图2所示。 图1 主程序流程图 图2 中断处理程序流程图

(二)屏幕特定位置显示字符

阅读教材P.324-335页内容。

对应屏幕上的每个字符位置,显存空间都有相应的存储单元与之对应。对应显示在屏幕上的每个字符,在存储器中由连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。属性字节对单色显示和彩色显示都是有效的。相应的值与属性关系参考教材P.325图9.5以及P.326图9.6以及表9.7。 开 始

获取原1CH中断向量

保存原中断类型设置新1CH的中断向量

恢复原1CH的中断向量

结束 保护现场

中断返回 读取系统日期、时间 保存原中断向量

分别将时间的时、分、秒转换为ASCII码

在指定位置显示日期和时间

恢复现场 开定时器中断

执行中断处理程序断 8 我们可以使用BOIS显示中断10H的各项功能来进行显示字符的编程。

首先,利用0号功能设置屏幕显示方式:

MOV AX,0003H ;设置80×25彩色文本方式

INT 10H

设置光标位置:

MOV AH,02H

MOV BH,显示的页号

MOV DX,显示的行、列

INT 10H

在光标位置显示字符:

MOV AH,09H

MOV BH,显示的页号

MOV BL,字符属性值

MOV AL,显示的字符

MOV CX,显示次数

INT 10H 9 三、使PC发出音符声音

8253定时器内部有三个独立的计数器:Counter0、Counter1、Counter2(端口地址为40H、41H、42H)和一个控制寄存器(端口地址为43H)。三个计数器是分别编程的,对任一个计数器编程时,首先要将控制字节写入控制寄存器。控制字节各位含义如图1所示.

图1 控制字节各位含义

PC中,通过初始化控制寄存器(43H端口值为0B6H),使通道2用于扬声器发声。使扬声器发声的驱动电路如图2所示。

图2 微机扬声器发声电路原理图

通过使8255的PB端口的第1位输出高电平打开与门,利用8253的2通道发出不同频率的脉冲信号,经过放大器放大后,便可驱动扬声器发声。通过改变计数值的方法,使其产生不同频率音调的声音。音符与频率值的对应关系如表1所示。

表1 音符与频率值对应关系表 10 编程提示:音频频率的产生,可通过设置8253通道2的计数器值来确定。

计数值=1.19318MHz/给定音符频率=1234DCH/给定音符频率

可用以下程序求计数值。

MOV DI,给定频率值

MOV DX,12H

MOV AX,34DCH

DIV DI

得到的计数值,按低8位、高8位分别送通道2,程序如下:

OUT 42H,AL

MOV AL,AH

OUT 42H,AL

乐曲是按照一定的高低、长短和强弱关系组成的音调,组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的频率可以从表1中获得,音符的持续时间根据乐曲每个音符的节拍数来确定。在4/4(四四拍)中,四分音符为一拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八音符持续半拍等。如果我们给全音符分配1秒的时间,则二分音符的持续时间为0.5秒。

10ms的延迟时间可以简单地通过执行循环指令取得:

WAIT1: MOV CX,2801

DELAY: LOOP DELAY

如果要产生与10ms成倍数的延迟时间,可执行该倍数次延迟10ms的指令。

知道了音调与频率和时间的关系,我们就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的频率值送通道2并用持续时间进行延时。

两只老虎