汇编实现九九乘法表输出

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

汇编实现九九乘法表输出
目录
概述 (3)
一设计内容与要求 (3)
二设计思想 (3)
三工作原理 (3)
四程序流程图 (4)
五、程序运行结果截图 (5)
六程序源代码 (5)
七设计过程中遇到的问题及解决方法 (8)
八设计心得 (8)
九结束语 (9)
十参考文献 (9)
九九乘法表输出
摘要:
九九乘法表输出是应用masm.exe 、link.exe、debug.exe等汇编语言软件进行编译链接及执行目的程序的方法来实现。

并且认识和利用DOS系统下的21h函数的02功能号来进行单个字符的输出,程序设计的过程中用到循环和子函数的思想。

模块化的程序设计思想,有利于源代码代码的编写,错误的查找和修改,同时可以分步来调试程序,减少工作量,乘法表的输出没有乘数和被乘数,只有乘积的结果输出。

关键词:
汇编语言程序设计、微机原理、九九乘法表、dos中断系统
导入语
一、设计要求
(一)创建文本文件,编写源代码,把文件保存在有masm.exe link.exe等汇编软件的
文件夹下,文件的后缀名改为.asm,比如(九九乘法表输
出.asm)。

(二)开启电脑,在“开始”—“运行”输入“cmd”命令进入DOS的字符操作界面,编译链接
程序代码,查看源程序是否有错误,有错误则加以修改。

(三)程序编译链接没有错误的情况下,执行目标程序,查看结果的输出情况,并用debug 命令查看内存的变化。

(四)按要求撰写设计报告。

二、设计思想
九九乘法表输出程序主要用到一个嵌套循环,和两个过程,外层循环用bl保存并记录,外循环每执行一次,bl的值加一。

内循环用bh 保存并记录,如果bh的值小于bl的值则执行内循环,内循环中每盒bl比较一次,成立则值加一不成立则转到换行子函数执行,同时也比较外循环是否继续满足条件执行,即比较bl的值是否小于10,小于就执行外循环,否则就结束程序。

设计dis子函数,把内存中的16进制数转换成10进制,设计的disp子函数是把十进制转化成ASCLL码,并输出乘积,这样得到的显示的结果就是我们看到的10进制数。

子函数output_ctl的功能是换行,当内循环变量bh的值大于外循环值bl时,调用这个函数,使得输出的结果风有序,输出的结果更容易体现嵌套循环。

三、工作原理
九九乘法表输出是简单的乘法,实现了1—9之间的数字相互相乘,并且把结果输出,利用masm.exe 、link.exe debug.exe等汇编语言软件。

设计算法编写源代码,设计一个循环结构来循环相乘,直到完成9*9,比较退出程序。

同时还设计到数数制的转换问题,内存中的数据是16进制,而我们习惯看到的是10进制数,通过16进制转换成10进制,在转成通用ascll码输出显示,同时还用到DOS的中断调用。

四、程序流程图
五、程序运行结果截图
六、程序源代码
data segment
table dw 81 dup(0)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov di,offset table ;di指向table的首地址00h mov bl,1 ;外循环值
mul_1:
mov bh,1 ;内循环值
mul_2:
push cx ;压栈
;输出第一个外循环值
mov dl,bl
or dl,30h
mov ah,02h
int 21h
;输出乘号
mov dl,'x'
mov ah,02h
int 21h
;输出第一个内循环值
mov dl,bh
or dl,30h
mov ah,02h
int 21h
;输出等号
mov dl,'='
mov ah,02h
int 21h
mov al,bh ;把bh的值赋给al寄存器中
mul bl ;乘法指令,al与bl相乘,结果放入al中
mov [di],al ;di指向乘的结果
call dis ;调用子函数dis
mov dl,0h ;输出空格
mov ah,2
int 21h
mov dl,0h ;输出空格
mov ah,2
int 21h
add di,2 ;di指向它的下一个地址
pop cx
inc bh ;自加一指令
cmp bh,bl ;比较语句,bh小于bl执行jbe语句,否则执行;call output_ctle语句
jbe mul_2 ;跳转指令,返回mul_2处,实现循环
call output_ctle ;程序调用指令
inc bl
cmp bl,10 ;比较语句,bl小于10执行jb语句,否则执行程;序结束指令
jb mul_1
jmp exit ;无条件转移指令
; output_ctle函数功能:输出回车换行
output_ctle proc Near
push ax ;压栈语句
push dx
mov ah,02h ;dos中断下的单个字符输出功能
mov dl,0dh ;0d是回车的ascll码值
int 21h
mov ah,02h
mov dl,0ah ;0a是换行的ascll码值
int 21h
pop dx ;出栈语句
pop ax
ret
output_ctle endp ;子函数dis结束
;dis功能:在系统内数据是16进制的,乘的结果大于10,则需要转化成10进制数但;是不输出,首先判断数据是否大于10,大于10的除以10,余数放在dl中. dis proc near ;子函数dis开始
push ax
push dx
mov dh,10
cmp ax,10
jb next1 ;ax的值低于10转向next1
div dh ;ax的值高于10除以10,结果存在ax中
call disp ;子函数调用语句
mov al,ah
next1:
call disp
pop dx
pop ax
ret
dis endp ;子函数dis结束
(一)dis子函数的流程图如下
;disp的函数功能:把dis的十进制数转换成ASCII码,并输出。

实现:十进制和ASCII ;码相差30h,即把这个十进制数加上30h,就转换成ASCII码,并把乘数的结果输出disp proc near ;子函数disp 开始
push ax
push bx
mov dl,al
add dl,30H ;加法指令
mov ah,2
int 21h
pop bx
pop ax
ret
disp endp ;子函数disp结束
exit: ;结束退出语句
mov ah,4ch
int 21h
code ends
end start
end start
(二)disp子函数的流程图如下
六、设计过程中遇到的问题及解决方法
首先,遇到的问题是计算机的识别问题,计算机内部只唯一认识2进制代码,为了更好的存储信息,计算机用十六进制数存储数据,设计之初,我反复思考自己的算法没有问题,但是总是的不到想要的结果,利用debug命令查看内存的情况也正确,后来在网上百度论坛上发帖找到答案,设计了两个子函数来处理这个问题,一个是dis函数,一个是disp函数,之后再编译链接,执行目的程序得到预计的结果。

其次,就是子函数的解决问题,编写源代码的的习惯问题,语句不是成对出现,push 和pop语句出错,导致运行链接正确,而没有
正确的结果,原因是没有按顺序出栈或者不出栈,使得内存没有正确释放或者不释放引起的。

在仔细阅读IBM_PC汇编语言这本书的子函数设计一章后,加大了对子函数的认识,并修改解决上面问题。

最后,问题设计初,用到的是指定循环次数,利用loop语句来实现循环,这样结果就想一个长方形的输出,每个数相互乘了两次,同时输出两次结果,所以得到的结果不像我们使用的九九乘法表。

后来使用判断跳转指令来实现循环,首先判断内循环值和外循环值的大小,决定是否继续乘法,再通过外循环值和10比较,决定继续执行程序还是退出程序。

七、设计心得
通过九九乘法表输出程序的编写,首先我更加的认识到计算机内部的运行,对计算机的认识加深,计算机的内存使用情况,它是怎样运行的有更大的理解。

其次通过自己编写源代码,了解到汇编语言和高级编程的语言的区别,汇编语言更难理解和翻译但是在计算机内部却容易被计算机识别,汇编的关键字很多,存储器很有限,合理的利用和释放存储器至关重要,每利用一个存储器在后面用到时必须查看是否已经释放这个存储器,否则就会出现编译链接没错误,但是运行结果有误的情况。

最后就是对debug命令操作加深,debug命令是用来辅助汇编语言软件使用,也可以单
独编程。

可以帮助我们查看内存的具体的使用情况,-u指令来查看部分内存,-g用来执行程序,单步运行可以使用-t命令,还可以跳转到指定位置执行,在有设计子函数的程序中,利用debug命令是非常有必要的。

八、结束语
编程对算法的分析很重要,无论是用什么语言来编程,算法是不会变化的,设计一个良好的算法,不仅可减少计算机内存的使用,还可以加快程序的运行,就像我在第一次设计的时候使用的循环结构就很不合理,使得的工作量加大一倍,而且得到的结果还不是很满意,在网上查看后把算法加以改进,得到的结果基本上符合要求。

设计一
个良好的程序就是要有一个优秀的算法作为根基,要不一切都是徒劳的。

参考文献
[1] 钱晓捷.微型计算机原理及应用[M].2006,北京:清华大学出版社
[2] 钱晓捷,陈涛.16/32微机原理、汇编语言及接口技术[M].2版.北京:机械工业出版社,
2005
[3] 穆玲玲,钱晓捷.32位汇编语言程序设计[M].北京:电子工业出版社,2007
[4] 钱晓捷. 新版汇编语言程序设计[M].北京:电子工业出版社,2006。

相关文档
最新文档