编程输出九九乘法表

编程输出九九乘法表
编程输出九九乘法表

摘要..

九九乘法表输出是应用masm.exe、link.exe、debug.exe等汇编语言软件进行编译链接及执行目的程序的方法来实现。并且认识和利用DOS系统下的21h函数的02功能号来进行单个字符的输出..程序设计的过程中用到循环和子函数的思想。模块化的程序设计思想有利于源代码代码的编写..错误的查找和修改同时可以分步来调试程序减少工作量乘法表的输出没有乘数和被乘数只有乘积的结果输出。

关键词:

汇编语言程序设计、微机原理、九九乘法表、dos中断系统导入语

前言

汇编语言是一门程序设计语言,学习程序设计的思想与方法既是学习的重点也是难点,课设的目标就是要帮助读者提高程序设计的能力,较深入地掌握汇编语言程序设计的思想与方法。学习汇编语言时,有些同学已经学习过例如C语言等高级语言,将为我们理解程序设计的思想打下良好基础;但也可能从未学习过其他语言,虽然框框较少,但建立计算机语言与程序设计的概念将是一大难题。汇编语言是多类知识交叉的学科,一部分知识往往还连带着其他的相关内容,如果处理不好这些连带的内容,将影响学习者对当前知识点的理解。但是如果先扫清外围,例如先介绍CPU与存储器的内部结构、数据形式,再介绍指令与指令系统、程序设计方法……,虽然可以做到内容单一,也容易接受,但教学未以程序设计为线索展开,可能在开始学习后相当长一段时间里不接触汇编语言程序设计的内容,将令学习过程抽象无趣。本书考虑到这些情况,采用了实践先行的方法,以一个完整的程序实例引导,首先通过演示与动手,对程序设计及一些基本概念、基本方法建立感性认识,从而屏蔽了一些相关知识带来的干扰,在此基础上再逐一展开。学习的过程除了理解还有记忆与模仿,人们往往都是从死记、模仿走向创新的,实践引导的过程将为模仿创造条件,也提供了记忆的线索与内容。以程以程序为线索展开,将使我们在整个学习过程中的每一步都目标明确,主题清晰,基础扎实,在不知不觉中登上程序设计的颠峰。

汇编语言的主要用途之一是涉及硬件的开发,目前社会对具有一定硬件基础的计算机人才需求较旺,本书围绕输入、输出程序设计介绍了若干常用芯片的结构与程序设计方法,即加强了涉及硬件的程序设计技术的教学,也有助于提高设计实际应用系统的能力。

目录

一、设计内容与要求 (1)

二、设计思想 (2)

三、工作原理 (3)

四、程序流程图 (4)

五、程序运行结果截图 (5)

六、程序源代码 (6)

七、设计过程中遇到的问题及解决方法 (10)

八、设计心得 (11)

九、致谢 (12)

十、参考文献 (13)

一、设计要求

创建文本文件:

编写源代码..把文件保存在有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寄存器中

mulbl ;乘法指令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子函数的流程图如下

开始

主函数给子函数的参数

<10

调用子函数disp

A的值除以十

结束

;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子函数的流程图如下

di函数给di子函数赋处参数执行ascll码转换指令输出ascll码值结束

六、设计过程中遇到的问题及解决方法

首先..遇到的问题是计算机的识别问题..计算机内部只唯一认识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

相关主题
相关文档
最新文档