汇编语言程序设计实验篇 下载本文

start:

; set segment registers: mov ax, data mov ds, ax mov es, ax

;初始化bl和bh,显示上半部分 next:

;内循环计数器 cl=bh next1:

;显示’*’ cl=cl-1

;如果cl≠0,则转到next1 ;显示’0DH’ ;显示’0AH’ bh=bh+1 bl=bl-1

;如果bl≠0,则转到next

;初始化bl、ch和bh,显示下半部分 next2:

cl=ch;设置空格数

;如果cl=0,则转到next3 next4:

;显示’ ’ ;cl=cl-1

;如果cl≠0,则转到next4 next3:

cl=bh

;如果cl=0,则转到next5 next6:

;显示’*’ cl=cl-1

;如果cl≠0,则转到next6 next5:

;显示’0DH’ ;显示’0AH’ ch=ch-1 bh=bh+1 bl=bl-1

;如果bl≠0,则转到next2 lea dx, pkey mov ah, 9

int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1

int 21h

mov ax, 4c00h ; exit to operating system. int 21h ends

end start ; set entry point and stop the assembler.

5. 实验习题

若要显示如下形式的三角形,该如何修改程序?

* *** ***** ******* ********* *********** ************* *************** *****************

6. 实验报告要求

1) 写出完整的程序。

2) 使用不同数据测试程序并解释运行结果。

1.3 扩展实验 1.3.1 统计排序

1. 实验目的

1)掌握三种基本程序结构的设计方法。

2. 实验设备

微型计算机、emu8086

3. 实验原理

在屏幕上显示字符串的语句如下:

LEA DX,<字符串变量名,字符串必须以字符′$′作为结束> MOV AH,9 INT 21H

从键盘上输入字符串的语句如下:

LEA DX,<键盘缓冲区名> MOV AH,0AH INT 21H

在显示提示信息后和输入数据后,都需要回车换行,在这里我们用一个宏指令CRLF来实现。注意,宏指令CRLF中又调用了另外一个带参数的宏指令CALLDOS。宏指令一般定义在程序的最前面。

宏定义:

CALLDOS MACRO FUNCTION ;定义宏指令CALLDOS

MOV AH, FUNCTION INT 21H

ENDM ;宏定义结束

CRLF MACRO FUNCTION ;定义宏指令CRLF

MOV DL,0DH ;回车

CALLDOS 2 ;2号功能调用用于显示DL中的字符 MOV DL,0AH ;换行 CALLDOS 2

ENDM ;宏定义结束

CRLF宏指令用2号DOS功能调用(显示一个字符)显示回车符与换行符的方法来实现回车换行。2号DOS功能在显示回车符与换行符时实际上只是把光标移到下一行的开始,而并非把0DH和0AH显示在屏幕上。

在程序中凡是需要进行回车换行的地方只要把CRLF看成是一条无操作数指令直接使用即可。在程序中若要使用CALLDOS宏指令,需要在CALLDOS宏指令后带上一个实参,该实参为DOS功能调用的功能号。

为了便于排序和统计,从键盘输入的数据先转换成二进制数存储,在最后显示结果前再把数据转换成ASCII码。由于字符′0′~′9′的ASCII码是30H~39H,因此将数值0~9转换成对应的ASCII码时,需要在其基础上加30H;由于字符′A′~′F′的ASCII码是41H~46H,因此将数值A~F转换成对应的ASCII码时,需要在其基础上加37H。

可以采用冒泡排序法对数据排序。在双重循环中,外层循环用于确定待比较的数据,内层循环在待比较的数据中确定一个最小数并将该数放到合适的位置。比较数据时,可以先从最后一个数开始,通过与前一个数的比较,将小数放在前面,大数放在后面,即如果后面的数小于前面的数,需要交换两个数的位置。

4. 实验内容

在屏幕上显示提示信息“Please input 10 numbers:”,提示用户输入10个数(数的范围在0~99之间),然后从键盘上读入这10个数。接着对这10个数从小到大进行排序,并统计0~59、60~79、80~99的数各有多少。最后在屏幕上显示排序后的数(每个数之间用逗号分隔)并显示统计的结果。显示格式如下:

Sorted numbers: xx,xx,xx,xx,xx,xx,xx,xx,xx,xx 0-59: xx 60-79: xx 80-99: xx

程序流程图如错误!未找到引用源。所示。

开始 显示提示信息 循环从键盘读入10个数据 对数据进行排序 对数据进行统计 显示排序后的数据和统计结果 返回DOS 结束 图 2-6程序流程图

程序的框架如下: ;定义宏CALLDOS ;定义宏CRLF data segment

;定义提示信息MESSAGE,显示'Please input 10 numbers:' MESSAGE db 'Please input 10 numbers:',0dh,0ah,'$'

;定义键盘缓冲区KB_BUF,包括可接收最大字符数为3,实际输入字符数,输入的字符

KB_BUF db 3 ACTLEN db 0

BUFFER db 3 DUP(0)

;定义数据NUMBERS,存放转化后的二进制数据 NUMBERS db 10 DUP(0)

;定义统计结果LE59,GE60,GE80,分别存放小于60,60~80之间和大于80三个区间的统计结果 LE59 db 0 GE60 db 0 GE80 db 0

;定义显示结果信息SORTSTR,显示'Sorted number:' SORTSTR db 'Sorted number:'

;定义显示排序后的结果SORTNUM,包括字符和分割符,回车和换行 SORTNUM db 10 DUP(20h,20h,','),0dh,0ah

;定义显示信息MESS00,包括'0-59:'和统计结果,回车和换行 MESS00 db '0-59:',30h,30h,0dh,0ah

;定义显示信息MESS60,包括'60-79:'和统计结果,回车和换行 MESS60 db '60-79:',30h,30h,0dh,0ah

;定义显示信息MESS80,包括'80-99:'和统计结果,回车和结束符 MESS80 db '80-99:',30h,30h,0dh,0ah,'$' pkey db \ ends

code segment start:

; set segment registers: mov ax, data mov ds, ax mov es, ax ;显示MESSAGE mov cx, 10

lea di, NUMBERS LP1:

;从键盘读入一个数据,转换成二进制数存入DI所指向的内存单元 ;将输入的字符转换成数值,保存在al中 mov di, al inc di

CRLF 2 ;在下一行输入

loop LP1 ;直到10个数据都输入完

lea di, NUMBERS mov bl, 10

;对NUMBERS中的10个数据排序 lea si, NUMBERS mov cx,10

;统计NUMBERS中的10个数据,结果放在GE80、GE60和LE59中 lea si, NUMBERS lea di, SORTNUM mov dx, 10

;排序后的10个数据转换成ASCII码依次存入SORTNUM中 ;把GE80、GE60和LE59中的统计结果转换成ASCII码存入MESS80、MESS60和MESS00字符串中

; 显示统计结果 lea dx, SORTSTR mov ah, 9 int 21h

lea dx, pkey mov ah, 9

int 21h ; output string at ds:dx ; wait for any key....