当前位置:文档之家› 重庆大学汇编实验报告3

重庆大学汇编实验报告3

《汇编语言程序设计》实验报告
年级、专业、班级姓名
实验题目实验3:汇编程序的循环结构的使用
实验时间2013年4月15 实验地点DS1421
实验成绩实验性质□验证性 设计性□综合性教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;□实验结果正确;□语法、语义正确;□报告规范;
其他:
评价教师签名:
一、实验目的
通过一个排序算法,来熟悉和掌握利用汇编语言实现循环处理能力的程序。

二、实验项目内容
1 编写一个整数数组内的元素排序的程序
2 需要排序数组大小为10个DW的整数
3 按照从低到高输出这10个数字
4 要求撰写必要程序模块设计图和主要的流程
三、实验过程或算法(源程序)
assume cs:code,ds:data
data segment
dw 1234h,2a45h,345bh,45c7h,5678h,4321h,5432h,6543h,7654h,0d765h table db '0123456789abcde'
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov di,0
mov ax,stack
mov ss,ax
mov sp,32
mov cx,9
s0: mov ax,ds:[si]
push cx
s1: add si,2
cmp ax,ds:[si]
jb change
s2: loop s1
xchg ax,ds:[si]
xchg ax,ds:[di]
mov si,0
mov di,0
pop cx
loop s0
mov ax,data
mov ds,ax
mov si,0
call show
mov ax,4c00h
int 21h
change: mov ax,ds:[si]
mov di,si
jmp s2
show: push es
push di
push ax
push bx
push cx
push dx
mov ax,0b800h
mov es,ax
mov di,160*12+2*10
mov cx,10
show1: push cx
show2: mov al,ds:[si]
mov dl,al
and al,00001111b
mov bl,al
mov bh,0
mov al,table[bx]
mov ah,2
push ax
shr dl,1
shr dl,1
shr dl,1
shr dl,1
mov bl,dl
mov bh,0
mov dl,table[bx]
mov dh,2
push dx
inc si
loop show2
mov cx,4
show3: pop word ptr es:[di]
add di,2
loop show3
mov al,'h'
mov ah,2
mov es:[di],ax
add di,2
mov al,' '
mov es:[di],ax
add di,2
pop cx
loop show1
pop dx
pop cx
pop bx
pop ax
pop di
pop es
ret
code ends
end start
Data segment存放要进行排序的数据和下面程序中要用到的数据。

stack segment主要用于嵌套循环是保存cx的值和下面输出数据时的类型转换。

开始,使ds:si指向第一个数据,ss:sp指向栈底,di用于下面程序中保存最大值的位置。

采用冒泡排序算法,流程图为:
其中的change代码段在后面
Ax,ds,si为送入函数show的参数,其中ds:si指向要显示的数据(16进
制).show函数的功能为把十六进制的数据显示到屏幕上。

上面排序要用到的代码。

Show函数首先保存要中到的寄存器。

然后使es:di设置光标,指示数据在屏幕上的第一个位置。

因为数值0-15与字符‘0’-’f’之间没有一致的映射关系存在,所以我用table 表在他们之间建立一致的映射关系:以数值为table表的偏移,可以找到对应的字符。

10个数据,可以用10次循环依次输出。

每个数据2个字节,所以每次处理2位一个字节。

由于数据在内存中一个字节表示两位对应屏幕上的数,所以用and al,00001111,与shr bl,cl(cl=4)分离数据。

又由于输出位置的先后关系,所以用栈转换顺序,最后在数据后面加上‘h’表示十六进制。

程序结束。

四、实验结果及分析和(或)源程序调试过程
运行上面的程序:
可以看出数据是从小到大依次排列的。

通过本实验,我熟悉和掌握利用汇编语言实现循环处理能力的程序,loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,(1)(cx)=(cz)-1 (2)判断cx的中的值,不为0则转到标号处执行程序,如果为0则向下执行。

所以我们用cx存放循环次数。

对于嵌套循环,我们可以用栈来保存外循环的cx,当内循环结束时,再出栈,恢复cx的值。

报告创建时间:2013-5-1。

相关主题