四川大学电气信息学院微机原理实验报告 下载本文

内容发布更新时间 : 2024/5/18 8:01:04星期一 下面是文章的全部内容请认真阅读。

实验2.2 汇编语言程序设计

---- 循环结构程序 一.实验内容

练习1.用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。 提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。

对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。

4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。

外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX) 排序遍数 1 2 3 4 本遍排序前 第一次排序后 240,260 260,300 280,300 280,300 第二次排序后 240,260 260,300 280,300 第三次排序后 300,260 280,300 第四次排序后 260,300 300,250,280,250,300,280,250,280,300,250,280,240,250,280,240,240,260 260,300 280,300 280,300 250,280,240,250,280,240,250,240,280,250,240,260,250,240,260,250,240,260,240,250,260,240,250,260,240,250,260,二.程序清单

DATA SEGMENT

A DW 300,250,280,240,260 B DW 5 DUP (?) D DB 10 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX XOR AX,AX XOR BX,BX MOV CX,5 LEA SI,A

LOP33: MOV AX,[SI] ;LOP33内的循环是将A内的5个数输出到屏幕上,与实验2.1练 习一中程序同理 DIV D ;将三个数通过除法取出转换为ASCII码然后输出 MOV BH,AH DIV D

MOV DL,AL ADD DL,30H MOV BL,AH MOV AH,2 INT 21H MOV DL,BL

ADD DL,30H MOV AH,2 INT 21H MOV DL,BH ADD DL,30H MOV AH,2 INT 21H

MOV DL,20H MOV AH,2 INT 21H INC SI INC SI

LOOP LOP33

MOV DX,5 ;外循环5次 MOV CX,5 LOPP: LEA SI,A DEC DX

MOV CX,DX

LOP: MOV AX,[SI] ;取第一个数 MOV BX,[SI+2] ;取第二个数 CMP AX,BX

JAE LOP1 ;第一个数大于第二个数则进入LOP1 JMP LOP2 ;不大于则挑过LOP1进入LOP2

LOP1: MOV [SI+2],AX ;LOP1用于两数互换位置 MOV [SI],BX

LOP2: INC SI INC SI

CMP DX,0 ;如果外循环了5次则进入LOP4 JZ LOP4

LOOP LOP ;内循环

LOOP LOPP ;外循环 LOP4: MOV CX,5 LEA SI,A

LOP3: MOV AX,[SI] ;LOP3中的循环是将排序过后的五个三位数输出,与实验2.1练 习一中程序同理

DIV D

MOV BH,AH DIV D

MOV DL,AL ADD DL,30H MOV BL,AH MOV AH,2 INT 21H

MOV DL,BL ADD DL,30H MOV AH,2 INT 21H MOV DL,BH ADD DL,30H MOV AH,2 INT 21H

MOV DL,20H MOV AH,2 INT 21H INC SI INC SI

LOOP LOP3 MOV AH,4CH INT 21H CODE ENDS END START

第三次实验 8253定时器/计数器与接口实验

------乐曲程序

一.实验目的:

学习8253计数器2输出方波信号用以驱动扬声器发声的原理,通过程序设置计数器2的输出波形的频率和延续时间,控制扬声器的音调和发生长短。

二.实验内容:

1.设计程序让微机演奏一段两只老虎的乐曲。

2.思考如何让PC机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改程序实现。

三.程序清单

stack segment stack dw 100 dup(?) stack ends data segment

music dw 2 dup(262,294,330,262) dw 2 dup(330,349,392) dw 2 dup(392,440,392,349,330,262) dw 2 dup(294,196,262),0

time dw 10 dup(250*50),500*50,250*50,250*50,500*50 dw 2 dup(120*50,120*50,120*50,120*50,250*50,250*50) dw 2 dup(250*50,250*50,500*50) n equ 32 data ends code segment

assume cs:code;ds:data start:mov ax,data mov ds,ax mov al,0b6h ;控制字写入控制器 out 43h,al lea di,music ;分别取music和time地址送入DI,SI lea si,time mov cx,n ;循环32次将乐曲的32个音符完成 lp: mov bx,[di] ;读出频率 add di,2 ;指向下一个频率 mov dx,12h ;将脉冲频率存入AX,DX mov ax,34dch div bx ;算出计数值 out 42h,al mov al,ah out 42h,al ;计数值给到计数器2 in al,61h or al,3 out 61h,al ;开扬声器

mov dx,[si] ;将时长存入DX add si,2

mov bx,cx

del1: mov cx,064h ;延时 del2: loop del2

dec dx ;循环中继续延时 jnz del1 mov cx,bx in al,61h and al,0fch out 61h,al ;关扬声器 loop lp ;回到lp准备发出下一个音符 mov ah,4ch int 21h code ends end start

四.实验结果

扬声器发出两只老虎的音乐 反汇编和单步运行