Skip to content
This repository was archived by the owner on May 8, 2019. It is now read-only.

Latest commit

 

History

History
295 lines (198 loc) · 15 KB

File metadata and controls

295 lines (198 loc) · 15 KB

第3部分 汇编语言程序设计

##一、课程简介

###1.1 课程说明

本课程基于《汇编语言(第2版)》郑晓薇 编著,机械工业出版社,可以配合该教材使用。本课程由郑晓薇授权制作,提取教材中的实例以及实验内容,可以在实验楼环境中完成所有实例及实验。实验课程制作符合教材原版实例驱动教学以及实验训练贯穿始终的特点。

###1.2 实验环境 **1.DOS 环境 **
实验环境中安装有dosemu可以模拟DOS环境,并提供DEBUGMASMLINK等汇编语言开发程序。如果您对实验环境不熟悉,推荐您先学习《新手入门之玩转实验楼》。
**2.进入汇编实验 **
在桌面上双击dosemu图标,直接进入DOS。再做如下操作:

C:\〉D:           ——回车后进入D盘  
D:\〉CD DOS       ——进入DOS子目录  
D:\dos〉DIR       ——列出目录中的文件(包括masm和link) 

以后的汇编实验程序都要在dos这个子目录中进行。 img

**3.汇编语言实验程序的下载保存 **
在虚拟机的dos子目录中编写调试好的程序可以通过虚拟机的下载功能保存到本地机中。
(1)先在桌面上打开主文件夹,将dos文件夹中的汇编语言程序复制到code文件夹中;
enter image description here

(2)点击虚拟机上方的下载代码按钮,在弹出的对话框中按下载后将code子目录压缩下载到本地机。 enter image description here

##二、汇编语言程序设计初步 前面两节我们介绍了DEBUG的用法、汇编指令的构成和寻址方式,在DEBUG下用几条简单的汇编指令实现了加减运算。我们知道,汇编语言与微型计算机系统密切相关。本书以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。Intel8086指令系统中有100多条指令,利用这些指令可以编写出复杂的程序实现更多功能。
汇编语言是直接控制计算机硬件工作的最简便的语言。学习了汇编语言可具有在CPU寄存器级上进行控制和操作的能力,可获得直接对计算机硬件底层编程的经验。学习汇编语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制,包括控制CPU的数据寄存器、地址寄存器、标志寄存器;对存储器的读写操作,对输入设备和输出设备的访问等等。下面我们先从一个简单的例子入手学习汇编语言编程。 ###2.1 一个计算的例子 **例 ** 编写一个汇编语言程序,实现下列公式计算。假设X=4,Y=5
img

汇编指令如下: img
如果在DEBUG下用A命令输入这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能用T命令执行。

D:\dos〉DEBUG
-A
MOV AL,4
ADD AL,5
MOV BL,8
IMUL BL
MOV BL,4
MOV BH,0
SUB AX,BX
MOV BL,2
IDIV  BL
MOV [0],AL
MOV [1],AH

采用DEBUG的A命令输入程序的做法明显不方便,一是无法给出变量名即符号地址,二是调试修改程序不便。因此,采用编写源程序的方式更有利于程序的调试和执行。 ###2.2 编写汇编语言源程序 一个完整的汇编语言源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。伪指令与C语言等高级语言中的说明性语句的含义类似,起到说明作用。有了伪指令,系统在汇编该程序时,就会正确的将源程序翻译、连接成可执行文件。(有关伪指令的其他用法参看本教材4.2节)
我们先给这个源程序起名为ABC.ASM(汇编源程序的扩展名为.ASM)。用记事本或者在dos子目录下用edit输入源程序。
实验步骤:
(1)双击桌面上的记事本gedit,录入下列程序(分号后为注释,可不输入):
img

(2)按save按钮保存程序:

img

(3)选择路径、文件夹及输入文件名:

img

###2.3 从源程序到可执行程序 汇编语言源程序既可以用大写字母也可以用小写字母书写。汇编语言程序建立及汇编过程如图所示。 img

用户编写的源程序要经汇编程序MASM汇编(翻译)后生成二进制目标程序,文件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接生成可执行程序,文件名默认与源程序同名、扩展名为.EXE。
注意:源程序一定要和MASM和LINK文件放在同一个文件夹中。 执行MASM和LINK命令时需要按多次回车。

执行步骤:
img

(1)输入汇编命令masm abc.asm

img

注意:此处显示0个警告性错误,0个严重性错误。如果有错误,必须对源程序进行修改。有关出错提示信息参见教材附录B。

(2)输入连接命令link abc.obj

img

注意: 此处有一个警告性错误:no stack segment 没有堆栈段。这个提示是由于我们的程序中没有定义堆栈段,此错误可以忽略,不影响生成.exe文件。如果出现严重性错误,必须再检查一下源程序有无错误。

(3)用dir查看一下

img
已经生成了abc.exe可执行程序了。如果程序有错误,再回到记事本修改错误;之后需要重新汇编和连接。
(4)接着运行该程序abc.exe,可以看到没有显示任何结果就退回到DOS下了。

###2.4 在DEBUG下执行程序 如果源程序无错误,就能汇编、连接成为可执行程序ABC.EXE。由于该程序没有写显示结果的指令语句,要想观察结果必须用DEBUG调试工具。
(1)输入DEBUG ABC.EXE

img

(2)输入两次U命令后可以看到结束程序语句MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执行到该处停下来不再继续)。用G 0023(G 断点)执行程序。此时得到AX=0022,再执行D DS:0查看存储单元,第0号单元是04,即X单元,05是Y的值,22就是计算结果Z的十六进制数。 img

(3)按Q退出DEBUG

##三、带彩色显示的算术程序

本节实验取自教材中第四章的《实例四 带彩色显示的算术程序》。

###3.1. 简化的程序结构

从MASM5.0开始,提供了简化的段定义结构,这种结构用于小规模的程序设计中。一般格式为.MODEL SMALL。这种格式是小型模式,程序可以有一个代码段、一个数据段,每段不大于64KB。

下面通过设计含有键盘输入和定位显示的十进制数运算程序,来复习BCD码的概念、算术运算指令、十进制调整指令、键盘输入、光标定位、中断调用、屏幕及显示缓冲区等内容,以加深对汇编语言程序设计的理解。

注意:MASM及LINK程序放在D盘的dos目录下,可以在dosemu环境中输入D:切换到D盘,然后使用命令cd dos进入D:\dos〉目录。

###3.2. 屏幕显示和键盘输入

在汇编语言中,凡是涉及到键盘输入、屏幕显示等输入输出操作,都可以用软件中断指令INT n的功能调用来实现。所谓功能调用是计算机系统设计的简单I/O子程序,能方便地访问系统的硬件资源。 在微机系统中,功能调用分两个层次,最底层的是BIOS功能调用,其次是DOS功能调用,它们都是通过软件中断指令INT n来进行调用的。除了用INT指令实现输入和显示之外,还可以通过直接写显示缓冲区的方式显示字符。

####3.2.1 DOS功能调用

DOS的功能调用采用INT 21H指令,调用时要求在AH中提供功能号,在指定的寄存器和存储单元中提供调用必需的参数和缓冲区地址,执行后系统在AL中放入返回参数。 常用的DOS功能调用有5个: 键盘输入1个字符: 1号DOS功能调用
显示器输出1个字符: 2号DOS功能调用
键盘输入缓冲区: 10号DOS功能调用
显示字符串: 9号DOS功能调用
返回DOS控制: 4CH号DOS功能调用

注意:
I/O处理操作的都是ASCⅡ码,对于键盘输入的数字,做计算时需将ASCⅡ码转变为二进制数,输出显示数据时需将二进制数转为ASCⅡ码。数字0~9的ASCII码为30H~39H,可以看出两者之间相差30H。

####3.2.2 DOS功能调用例子

例: 显示两行字符串(回车换行功能)。第1行为“Input x:”,第2行为“Output y=x+1:”。从键盘输入x,输出y=x+1的值。
实验步骤:
(1)双击桌面上的记事本gedit,录入下列程序,在D盘dos下保存为test3-2.asm

data segment  
	mess1 db 'Input x:','$'
    mess2 db 0ah,0dh, 'Output y:$'   ;0ah和0dh是换行和回车 
    y db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax, data
mov ds,ax		;数据段的段地址→ds
mov dx,offset mess1
mov ah,9	   	;显示提示信息“Input x:”
int 21h
mov ah,1	;1号功能,键盘输入,键入的值在al
int 21h
add al,1		;al+1→al 
mov y,al        ;保存到y单元 
mov dx,offset mess2        
mov ah,9	;在下一行显示提示信息“Output y:”		
int 21h
mov ah,2	;2号功能,显示一个字符
mov dl,y 	;显示的字符要放入dl,显示x+1的值
int 21h
mov ah,4ch
int 21h
code ends
end start

(2)双击dosemu图标,进入dos虚拟机。输入DOS命令,从C盘进入D盘,再进入dos子目录。
enter image description here

(3)经过汇编masm test3-2.asm,连接link test3-2.obj,生成 test3-2.exe。 enter image description here

(4)在DOS下执行test3-2程序。从键盘输入x,显示出y的值 enter image description here

###3.3. 实验示例

  • **关注点:键盘输入,彩色字显示 **

**示例4-8 ** 用简化的程序格式从键盘输入两个一位的十进制数,做加法运算。相加后以蓝底黄字显示在屏幕上。

设计思路:

(1)键盘输入用DOS中断调用1号功能;显示采用写显存方法;
(2) 经非压缩BCD码加法调整指令AAA调整后会将AL的高4位清零,因此键盘输入的数字不必去掉30H,可直接运算;
(3)用BIOS中断调用INT 10H的3号功能获得光标的位置,让结果显示在光标处;
(4)由于计算结果不会超过两位十进制数,可用SI寄存器保存十进制数的ASCII码。

实验步骤:
(1)双击桌面上的记事本gedit,录入下列程序:

Alt text

(2)在dos子目录下保存为4-8.asm,经过汇编masm 4-8.asm,连接link 4-8.obj,生成了4-8.exe。

D:\dos〉masm 4-8.asm
D:\dos〉link 4-8.obj
D:\dos〉dir
D:\dos〉4-8.exe

注意!: 如果实验楼环境下的DOS不识别简化的程序模式.mode small ,则需将程序修改为正常的段定义格式即可。

(3)运行结果:
img

程序运行时,当输入5、6之后,显示等号和加法结果。BCD码调整指令请参看本教材的4.3.7节。DOS中断调用INT 21H以及BIOS中断调用INT 10H,除了本章用3号功能获得光标的位置之外的其它功能,在第9章将作详细介绍。
小贴士: 彩色字符显示属性字节为前景色由4位(0~3位)组合,背景色由3位(4~6位)组合。最高位BL表示闪烁,RGB为红、绿、蓝,I代表亮度。例如蓝底黄字的属性值为1EH。表4-3列出了16种颜色组合。 img

示例4-9 从键盘输入两个一位的十进制数,做乘法运算。相乘的结果保存在存储单元X中,算式显示在屏幕上。用简化的程序格式。

设计思路:

(1) 用DOS中断调用的1号功能输入数据,用2号功能显示结果,9号功能显示提示信息;
(2)做乘法时必须将输入数字的ASCII码去掉,转换成数值;
(3) 乘法之后用十进制调整指令AAM;
(4)将要显示的数值变为ASCII码。

实验步骤:
(1)双击桌面上的记事本gedit,录入下列程序:

Alt text

(2)在dos子目录下保存为4-9.asm,经过汇编masm 4-9.asm,连接link 4-9.obj,生成4-9.exe。

D:\dos〉masm 4-9.asm
D:\dos〉link 4-9.obj
D:\dos〉dir
D:\dos〉4-9.exe

(3)运行结果:

Alt text

实验结果分析如下:

DOS中断调用的1号、2号、9号功能提供了对键盘和显示器的操作和控制,为用户提供了方便的调用指令(见本书4.4节)。本程序的输入和显示在同一行上,没有换行。

###3.4 实验任务

####1. 实验目的

通过设计顺序程序,掌握汇编语言程序设计思路和编写方法,并通过实验观察和分析程序的执行结果。熟练掌握数值计算程序设计方法。

####2. 实验内容

参考示例4.9,完成下列实验内容:

  • 1)设计程序。实现Y=2X+3,X是一位十进制数。要求X从键盘输入,在下一行上显示’Y=2X+3=’ 以及十进制计算结果。

参考结果:

Alt text

  • 2) 设计程序。分别从键盘输入一位十进制数X和Y,用乘除指令实现Z=(X+20)/6-4Y,显示出计算结果。

####3. 实验要求

  • 1) 写出设计思路和程序源码;
  • 2)实验内容用截图形式记录实验结果;
  • 3)写出实验结果分析。

####4. 实验拓展

  • 1) 如果以黄底红字显示结果,程序应该怎么改?
  • 2)自由设计一个计算型实验题目并编程实现。