微机原理与汇编语言实验循环程序设计实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理与汇编语言
实验报告
姓名x x x学号xxxxxx 专业班级计科x班
课程名称微机原理与汇编语言实验日期2014.10.22
实验名称循环程序设计实验成绩
一、实验目的
1、掌握循环程序的设计方法。

2、掌握比较指令、转移指令和循环指令的使用方法。

3、进一步掌握调试工具的使用方法。

二、实验内容
1、实验原理
(1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题
(2)累加结果为一个16位的二进制数,为了显示结果,必需把它们转换为十进制数
2、实验步骤
(1)流程图
(2)实验源码
.model small
.stack ;定义堆栈段
.data ;定义数据段
inf1 db "Please input a number(1-627):$"
inf2 db 0ah, 0dh, "1+2+......+$"
ibuf db 7, 0, 6 dup(0)
obuf db 6 dup(0)
.code
start: mov ax, @data
mov ds, ax
mov dx, offset inf1
;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax 中
mov ah, 09h
int 21h
mov dx, offset ibuf
mov ah, 0Ah
int 21h
mov cl, ibuf+1
mov ch, 0
mov si, offset ibuf+2
mov ax, 0
loop1: mov dx, 10
mul dx
and byte ptr [si], 0Fh
add al, [si] 从键盘输入一个十进制数,并将其转换为二进制数,存放在AX中
开始
结束
素、、
(CX)-1=0
累加循环次数送CX(MOV CX,AX)AX清0(AX中存放累加和)
BX送1(BX存放每次循环累加的数,每循环一次,BX值加1)
ADD AX,BX
INC BX
累加和(在AX中)转换为十进制数并
显示
Y
N
adc ah, 0
inc si
loop loop1
mov cx, ax ;计算1+2+3+...+n
mov ax, 0
mov bx, 1
loop2: add ax, bx
inc bx
loop loop2
mov di, offset obuf+6 ;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf
mov byte ptr [di], '$'
mov bx, 10
loop3: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop3
dec di
mov [di], '='
mov dx, offset inf2 ;结果输出
mov ah, 09h
int 21h
mov cl, ibuf+1 ;显示n
mov ch, 0
mov si, offset ibuf+2
loop4: mov dl, [si]
add dl, 30h
inc si
mov ah, 02h
int 21h
loop loop4
mov dx, di
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
end start
实验习题1源码:
; multi-segment executable file template.
.model small ;定义程序的存储模式(small表示小型模式)
.stack ;定义堆栈段
.data ;定义数据段
inf1 db 0ah, 0dh, "1+2+......+$"
obuf1 db 6 dup(0)
obuf2 db 7 dup(0) ;除了六位数字外还要有一个=号.code
start: mov ax, @data
mov ds, ax
mov dx, offset inf1 ;输出 1+2+......+
mov ah, 09h
int 21h
mov ax, 0 ;计算1+2+3+...+n
mov bx, 1
loop1: add ax, bx
inc bx
cmp ax, 60000
jbe loop1
push ax ;将最终结果备份入栈
push bx ;将n备份
pop cx
mov di, offset obuf1+5
;将cx二进制数转换为十进制数并以ascii的形式存于obuf1
mov byte ptr [di], '$'
mov ax, cx
mov bx, 10
loop2: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop2
mov dx, di ;输出n
mov ah, 09h
int 21h
pop ax
mov di, offset obuf2+6
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf2
mov byte ptr [di], '$'
mov bx, 10
loop3: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop3
dec di
mov [di], '='
mov dx, di ;=输出结果
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
end start
实验习题2源码:
; multi-segment executable file template.
.model small ;定义程序的存储模式(small表示小型模式)
.stack ;定义堆栈段
.data ;定义数据段
inf1 db 'Please input six num:', 0ah, 0dh, '$'
inf2 db 'sum:$'
obuf0 db 0ah, 0dh, '$'
ibuf db 5, 0, 4 dup(0)
obuf db 6 dup(0)
.code
start: mov ax, @data
mov ds, ax
mov dx, offset inf1 ;输出提示信息
mov ah, 09h
int 21h
mov bx, 6 ;设置外层循环次数
loop1: mov dx, offset ibuf
mov ah, 0Ah
int 21h
mov cl, ibuf+1 ;设置内层循环次数
mov ch, 0
mov si, offset ibuf+2
mov ax, 0
loop2: mov dx, 10 ;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中 mul dx
and byte ptr[si], 0Fh
add al, [si]
adc ah, 0
inc si
loop loop2
push ax ;将结果入栈保存
mov dx, offset obuf0 ;回车换行
mov ah, 09h
int 21h
dec bx
cmp bx, 0
jnz loop1
mov cx, 6
mov ax, 0
loop3: pop bx
add ax, bx
loop loop3
mov di, offset obuf+5
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf mov byte ptr [di], '$'
mov bx, 10
loop4: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop4
mov dx, offset inf2 ;输出提示信息
mov ah, 09h
int 21h
mov dx, di
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
end start
实验习题3源码:
; multi-segment executable file template.
.model small ;定义程序的存储模式(small表示小型模式) .stack ;定义堆栈段
.data ;定义数据段
inf db "Please input a num(0-65535):$"
inf2 db 0ah, 0dh, "The num of 1:$"
ibuf db 6, 0, 5 dup(0)
obuf db 6 dup(0)
.code
start: mov ax, @data
mov ds, ax
mov es, ax
mov ah, 09h ;输出提示信息Please input a num:
mov dx, offset inf
int 21h
mov ah, 0Ah ;接收一个无符号十进制整数(小于65536)
mov dx, offset ibuf
int 21h
mov ax, 0
mov cl, ibuf+1;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中mov ch, 0
mov si, offset ibuf+2
loop1: mov dx, 10
mul dx
and byte ptr[si], 0Fh
add al, [si]
adc ah, 0
inc si
loop loop1
mov bx, 0
loop2: shr ax, 1
adc bx, 0
cmp ax, 0
jnz loop2
mov ax, bx
mov di, offset obuf+5
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf
mov byte ptr [di], '$'
mov bx, 10
loop3: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop3
mov ah, 09h ;输出提示信息The num of 1:
mov dx, offset inf2
int 21h
mov ah, 09h ;将统计结果在屏幕上显示出来
mov dx, di
int 21h
mov ax, 4c00h
int 21h
end start
实验习题4源码:
; multi-segment executable file template.
.model small ;定义程序的存储模式(small表示小型模式)
.stack ;定义堆栈段
.data ;定义数据段
N equ 5
ibuf db 4, 0, 3 dup(0)
inf1 db 'Please input N num(0-255):', 0ah, 0dh, '$'
inf2 db 'Sort:', 0ah, 0dh, '$'
buf db N dup(0)
obuf2 db 4 dup(0)
obuf db 0ah, 0dh, '$'
.code
start: mov ax, @data
mov ds, ax
mov dx, offset inf1 ;输出提示信息
mov ah, 09h
int 21h
mov di, offset buf
mov bx, N ;设置外层循环次数
loop1: mov dx, offset ibuf
mov ah, 0Ah
int 21h
mov cl, ibuf+1 ;设置内层循环次数
mov ch, 0
mov si, offset ibuf+2
mov ax, 0
loop2: mov dx, 10 ;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中 mul dx
and byte ptr[si], 0Fh
add al, [si]
inc si
loop loop2
mov [di], al
inc di
mov dx, offset obuf ;回车换行
mov ah, 09h
int 21h
dec bx
cmp bx, 0
jnz loop1
mov bx, N-1 ;比较大小
mov cx, bx
mov dx, bx
mov di, offset buf
loop3: mov si, di
mov al, [di]
inc si
loop4: cmp [si], al
jbe loop5
mov al, [si]
mov ah, [di]
mov [si], ah
mov [di], al
loop5: inc si
loop loop4
dec dx
mov cx, dx
inc di
dec bx
cmp bx, 0
jne loop3
mov dx, offset inf2 ;输出提示信息
mov ah, 09h
int 21h
;结果输出
mov cx, N
mov si, offset buf
loop6: mov di, offset obuf2+3
;将buf中的二进制数转换为十进制数并以ascii的形式存于obuf2,并输出 mov byte ptr [di], '$'
mov bx, 10
mov al, [si]
mov ah, 0
loop7: mov dx, 0
div bx
add dl, 30h
dec di
mov [di], dl
or ax, ax
jnz loop7
mov dx, di
mov ah, 09h
int 21h
mov dx, offset obuf
mov ah, 09h
int 21h
inc si
loop loop6
mov ax, 4c00h
int 21h
end start
3、实验结果
(1)实验结果
(2)实验习题1
程序流程图:
(3)实验习题2
(4)实验习题3
(5)实验习题4
三、实验总结
1)通过本次实验我掌握循环程序的设计方法,掌握比较指令、转移指令和循环指令的使用方法,进一步掌握了调试工具的使用方法。

2)在实验过程中我也遇到过许多困难,我觉的最大的困难时汇编难于调试,特别是代码写的很多的时候,某处的错误很难能够查的出来。

我的办法是每写一段程序就调试一下是否是正确的,比如说本次的实验大致可分为五个功能片段,第一个是输出信息,第二个是接受屏幕上的数字串,第三个是将数字串转化为二进制数,第四是累加求和,第五是将二进制数转化为十进制数形式的数字串。

可以用分开来调试的方法,通过一条功能后在进行下一条功能的书写与调试工作。

另外书写注释也是非常重要的,只有这样才能利于后来的阅读。

3)本次实验中经常会遇到寄存器不够用的情况,因为cx用于计数,dx有时会用于存储向屏幕输出字符串的首地址,而自己又不想在数据段额外定义一个区域存储这些值。

于是在习题2中要求输入6个数时我用到了栈。

每当进行功能调用ax的值要被改变时,我将ax的值存有栈中保存。

进行求和时在将这6个数出栈即可。

4)在进行循环程序设计的过程当中,最后一个排序问题花了我很长的时间,原因是进行排序要用到2层的循环。

我的解决该问题的算法是选择排序法,内层用cx作为循环计数器,外层仿照cx,用bx 作为计数器,每进行一次循环bx减一,如果bx=0后,整个循环结束。

首先将第一个数与该数组的其他数字比较大小,如果其他数字比第一个数小则指针指向下一个数字,否则将该数字与第一个数交换位置,指针后移,每进行一次内部循环,都将选出一个最大的数字置于第一个位置。

进行N-1次外层循环后,即可将这些数字排序了。

这里面我将N作为符号常量,通过改变程序里的N值可以实现对N 个数排序的功能。

5)我选择的运行软件是emu8086,因为用它调试比较方便,但它不支持dup(?)这种书写方式,所以我将dup(?)均改为dup(0)。

6)在本实验中如果求和时的输入大于627会发生溢出的现象,因为累加求和的结果存放于ax中,存储的最大无符号数是65535,所以会发生溢出的现象。

解决的办法可以利用位扩展的方式,用两个寄存器保存结果,比如用bx保存溢出后舍去的进位。

添加adc bx,0就可以将进位标志寄存器的进位存储于bx中了。

相关文档
最新文档