8086汇编语言程序设计——第一个程序

时间:2021-12-08 01:21:53

    本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。Intel8086指令系统中有100多条指令,利用这些指令可以编写出复杂的程序实现更多功能。

    汇编语言是直接控制计算机硬件工作的最简便的语言。学习了汇编语言可具有在CPU寄存器级上进行控制和操作的能力,可获得直接对计算机硬件底层编程的经验。

 一个计算的例子

例 * 编写一个汇编语言程序,实现下列公式计算。

假设X=4,Y=5

8086汇编语言程序设计——第一个程序

汇编指令如下:

8086汇编语言程序设计——第一个程序

如果在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命令输入程序的做法明显不方便,一是无法给出变量名即符号地址,二是调试修改程序不便。

1. 编写

一个完整的汇编语言源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。

伪指令与C语言等高级语言中的说明性语句的含义类似,起到说明作用

用记事本gedit或者vi编写,保存到dos目录下

8086汇编语言程序设计——第一个程序

注释符号为;号

2. 汇编、链接、执行

汇编语言源程序既可以用大写字母也可以用小写字母书写。汇编语言程序建立及汇编过程如图所示。

8086汇编语言程序设计——第一个程序

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

8086汇编语言程序设计——第一个程序

3.  在DEBUG下执行程序

MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执行到该处停下来不再继续)。用G 0023(G 断点)执行程序。

带彩色显示的算术程序

屏幕显示和键盘输入

凡是涉及到键盘输入、屏幕显示等输入输出操作,都可以用软件中断指令INT n的功能调用来实现。

在微机系统中,功能调用分两个层次,最底层的是BIOS功能调用,其次是DOS功能调用,它们都是通过软件中断指令INT n来进行调用的。

除了用INT指令实现输入和显示之外,还可以通过直接写显示缓冲区的方式显示字符。

 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。

 DOS功能调用例子

例: 显示两行字符串(回车换行功能)。第1行为“Input x:”,第2行为“Output y=x+1:”。从键盘输入x,输出y=x+1的值。

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

另一个示例 

简化的程序结构

从MASM5.0开始,提供了简化的段定义结构,这种结构用于小规模的程序设计中。

一般格式为.MODEL SMALL。这种格式是小型模式,程序可以有一个代码段、一个数据段,每段不大于64KB。

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

设计思路:

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

 8086汇编语言程序设计——第一个程序

注意到,这里使用了BIOS中断调用INT 10H

小贴士: 彩色字符显示属性字节为前景色由4位(0~3位)组合,背景色由3位(4~6位)组合。最高位BL表示闪烁,RGB为红、绿、蓝,I代表亮度。例如蓝底黄字的属性值为1EH。表4-3列出了16种颜色组合。

8086汇编语言程序设计——第一个程序