汇编语言矩阵相乘课程设计附源代码.docx

上传人:b****2 文档编号:16850433 上传时间:2023-07-19 格式:DOCX 页数:28 大小:163.56KB
下载 相关 举报
汇编语言矩阵相乘课程设计附源代码.docx_第1页
第1页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第2页
第2页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第3页
第3页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第4页
第4页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第5页
第5页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第6页
第6页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第7页
第7页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第8页
第8页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第9页
第9页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第10页
第10页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第11页
第11页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第12页
第12页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第13页
第13页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第14页
第14页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第15页
第15页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第16页
第16页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第17页
第17页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第18页
第18页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第19页
第19页 / 共28页
汇编语言矩阵相乘课程设计附源代码.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编语言矩阵相乘课程设计附源代码.docx

《汇编语言矩阵相乘课程设计附源代码.docx》由会员分享,可在线阅读,更多相关《汇编语言矩阵相乘课程设计附源代码.docx(28页珍藏版)》请在冰点文库上搜索。

汇编语言矩阵相乘课程设计附源代码.docx

汇编语言矩阵相乘课程设计附源代码

华北科技学院

课程设计说明书

班级:

姓名:

学号:

课程名称:

汇编语言课程设计

课设时间:

2006-12-05至2006-12-16

成绩评定:

1、工作量:

A(),B(),C(),D(),F()

2、难易度:

A(),B(),C(),D(),F()

3、答辩情况:

基本操作:

A(),B(),C(),D(),F()

代码理解:

A(),B(),C(),D(),F()

4、报告规范度:

A(),B(),C(),D(),F()

5、学习态度:

A(),B(),C(),D(),F()

总评成绩:

指导教师:

 

一.课程设计的目的、任务

1.课程设计的目的:

使学生综合使用所学过的汇编语言程序设计知识,掌握结构化程序设计的基本思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,解决稍微复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。

课程设计的目的和要求:

(1)使学生巩固和加强《汇编语言》课程的理论知识。

(2)使学生掌握汇编语言的基本概念、语法、语义和数据类型的使用特点。

(3)使学生掌握汇编语言程序设计的方法及编程技巧,能正确使用汇编语言编写程序。

(3)进一步理解与运用结构化程序设计的思想和方法;学会利用流程图或N-S图表示算法。

(4)使学生掌握调试程序的基本方法及上机操作方法。

(5)掌握书写程设计开发文档的能力,使学生学会撰写课程设计总结报告。

课程设计的思想和方法还可以作为学生做毕业论文时的参考资料。

(6)通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。

为学生做毕业设计打好基础。

(7)初步掌握开发一个小型实用系统的基本方法:

结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。

通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。

(8)培养学生的创新能力和创新思维。

学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。

(9)培养学生良好的程序设计风格。

在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。

学生在课程设计书写代码时,应该严格按要求处理,以便建立良好的程序设计风格。

 

2.课程设计的题目——矩阵相乘

(1)要求:

掌握多重循环程序的设计方法,并熟悉有关矩阵的编程原理。

(2)内容:

将一个4X4的矩阵与一个4X1的矩阵相乘,将结果存入相应的单元,分别用十进制数、二进制、十六进制形式显示结果。

3.课程设计环境

(1)硬件:

PC机。

(2)软件:

操作系统为64位Windows7,设计语言为MASMFORWINDOWS汇编语言集成实验环境。

4.课程设计要求

(1)课程设计可采取每人一题,可任选一题进行设计,至少包含五个功能模块。

或者每组完成一个课题,每组成员分工合作完成一个课程设计,每个人的任务不同;

(2)可以选择老师提供的参考选题,也可以自选,如果自选,需要将自选题目的详细内容以及实现要求提供给老师,老师批准后方可采用;

(3)要求利用结构化程序设计方法以及汇编语言的编程思想来完成系统的设计;

(4)要求有欢迎界面、菜单、文件操作,数据使用数组、结构体等均可,键盘操作或鼠标操作均可;

(5)模块化程序设计:

要求在设计的过程中,按功能定义过程或宏,多个模块化设计可以用文件的形式来实现;

(6)学生所选课题必须上机通过,并获得满意的结果;

(7)程序书写风格:

锯齿型书写格式。

 

二.软件需求分析和设计

(1)需求分析本程序主要实现的功能是一个4*4矩阵与4*1矩阵相乘最后得到一个4*1矩阵,并且要求用三种方式输出这个矩阵,分别是二进制和十六进制和十进制。

并且这个程序要求菜单的选择。

(2)下面就是这个程序的流程图

 

 

 

输出流程图

 

主流程图

Y

 

 

N

 

 

十进制矩阵输出

 

十六进制矩阵输出

 

二进制矩阵输出

 

三.程序实现说明(介绍程序实现过程,包括关键代码分析(注意:

应该限制代码的数量))

 

1.矩阵相乘关键代码

MUL_AB:

;矩阵相乘

MOVDI,0

MOVHH,0

;--------嵌套循环-------------

MUL_0:

MOVLL,0

;---------------------

MUL_1:

MOVBX,HH;HH为空,BX清零

ADDBX,HH

MOVSI,LL;LL为空,SI清零

ADDSI,LL

MOVCX,LA;将4传给CX

;---------------------

MUL_2:

MOVAX,MA[BX];矩阵一的第一个数放进AX

MOVDX,MB[SI];矩阵二的第一个数放进DX

MULDX;两数相乘

ADDMC[DI],AX;结果矩阵第一数先放上AX

ADDBX,2;地址往下移

ADDSI,2*LB;地址下移矩阵二列数*2

LOOPMUL_2

;---------------------

ADDDI,2;地址往下移

INCLL;列数加1

CMPLL,LB;比较结果矩阵列数与矩阵二的列数

JNZMUL_1

;---------------------

ADDHH,LA;结果矩阵行数

CMPHH,HA*LA;比较结果矩阵行数数与矩阵一的行数与列数的乘积

JBMUL_0

RET

2.十进制转换关键代码

PRINT_AX:

;将存在AX中的数按照十进制输出

PUSHBX

PUSHCX

PUSHDX

MOVBX,10

MOVCX,0

P_LOP1:

MOVDX,0

DIVBX;直接除以10,余数在DX一次输出一个

INCCX

PUSHDX

CMPAX,0;商存在AX中,接着用来取余数放到DX里面

JNZP_LOP1

MOVAH,2

P_LOP2:

POPDX

ADDDL,'0'

INT21H

LOOPP_LOP2;CX自加多少次,就自减多少次,输出整个数

POPDX

POPCX

POPBX

RET

3.十六进制转换关键代码

HSPPROCFAR;十六进制转换子程序

PUSHBX

PUSHCX

PUSHDX

MOVBX,AX

MOVCH,04D;CH初始定义为4

ROTATE:

MOVCL,04D;CL初始定义为4

ROLBX,CL;对操作数进行循环左移4次,每执行一次,把最高位移到最低位,同时还把最高位移到CF

MOVAL,BL

ANDAL,0FH;取AL的低四位

ADDAL,30H;加上30H输出

CMPAL,'9';AL与9比较

JBEPRINT2;小于等于就会跳到PRINT2

ADDAL,07H;大于AL加上07H,变成字母ABCDEF

PRINT2:

MOVDL,AL;AL给DL输出出来

MOVAH,2

INT21H

DECCH;ch自减,不为零继续循环上面代码

JNEROTATE

MOVAH,2

MOVDL,'H'

INT21H

POPDX

POPCX

POPBX

RET

HSPENDP

4.二进制转换关键代码

DSPPROCFAR;二进制转换子程序

PUSHBX

PUSHCX

PUSHDX

MOVBX,AX;把数值放到BX保护起来,BX中本身放的就是二进制

MOVCX,16;为循环做准备

T:

SHLBX,1;把BX的值向左移一位,其高位放在CF标志位里

JCPRINT4;如果高位是1就输出1

JNCPRINT5;如果高位是0就输出0

PRINT4:

MOVDL,31H;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符1

MOVAH,2

INT21H

JMPL

PRINT5:

MOVDL,30H;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符0

MOVAH,2

INT21H

L:

LOOPT

MOVAH,2

MOVDL,'B'

INT21H

POPDX

POPCX

POPBX

RET

DSPENDP

5.运行结果截图

菜单截图

矩阵一矩阵二和相乘后矩阵截图(十进制)

矩阵三十六机制和二进制截图

四.程序总结(软件完成情况,有哪些收获,存在哪些不足

对课程设计有哪些建议)

这次课设我完成的主要是矩阵的相乘和输出矩阵的进制转换,以及光标定位,菜单输出等等功能!

这次课设的时间有两周,其实主要完成在最后一周,通过这次试验最大的收获就是看程序一定要耐心,虽然程序是我拼凑而成,但是基本上已经读懂整个程序,途中遇见几个问题,非常感谢老师和同学们的帮助,最终完成了这个程序。

存在的不足之处就是这两个矩阵是固定格式的,不能任意矩阵相乘,希望以后可以改进,这个课设学习了很多,新的知识主要是BOIS功能的调用,主要集中在字体颜色变化和光标的定位,还学到了矩阵相乘中的嵌套循环,这个对于循环反复操作不同的数非常的重要!

另外还了解了进制转换的方法,也是利用了循环移位的操作,本来我觉得汇编是个令人头疼的语言,但是你只要紧紧抓住它其中数的变化就行,能够准确定位数的位置及作用,而且还要了解数的及时清零与更新!

往往其中很容易混淆的就是数的位置和作用,之前很容易的辨认错误!

这次的实验还是学到了很多东西,主要感谢老师和同学的指导,总体上来说,完成了基本课设要求!

希望在以后的学习中,也应该有那种细心钻研的精神!

源代码:

DATASEGMENT

;================菜单的定义===============

str1db'***********************Menu:

*******************',13,10

mess1db'********1:

printthefirstarray:

***************',13,10

mess2db'********2:

printthesecondarray:

**************',13,10

mess3db'********3:

printtheHexadecimalsystemarray:

*',13,10

mess4db'********4:

printtheBinarysystemarray:

*******',13,10

mess5db'********5:

printtheDecimalsystemarray:

******',13,10

mess6db'*******************END*************************',13,10

length1equ$-str1

STR2db'pleasemakeyourchoose:

',13,10

;-----------------------------

array1DB'thefirstarrayis(4*4):

','$'

array2DB'thesecondarrayis(4*1):

','$'

HDB'printarray1*array2(Hexadecimalsystem):

','$'

BDB'printarray1*array2(Binarysystem):

','$'

DDB'printarray1*array2(Decimalsystem):

','$'

;----------------------------

MADW11,12,13,14;定义4*4矩阵MA

DW21,22,23,24

DW31,32,33,34

DW41,42,43,44

HAEQU4;行数

LAEQU4;列数

;-----------------------------

MBDW12;定义4*1矩阵MB

DW11

DW11

DW11

HBEQU4

LBEQU1

;-----------------------------

MCDWHA*LBDUP(?

);定义结果矩阵

HCEQUHA

LCEQULB

HHDW?

LLDW?

;==============宏的定义==============

;--------------光标的初始定义-------

cursormacrorow,rank

movah,2

movdh,row

movdl,rank

movbh,0

int10h

endm

;回车换行

hchhmacro

movdl,10

movah,2

int21h

movdl,13

movah,2

int21h

endm

;字符串输出

PRINTmacrox

movah,9

leadx,x

int21h

endm

DATAENDS

;***********************************

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

;==========光标和菜单字体颜色设置==========

moval,3

movah,00h

int10h

movbp,segstr1

moves,bp

movbp,offsetstr1

movcx,length1

movdx,0

movbl,05h;菜单红字定义

moval,0

cursor2,15;菜单光标初始定义

movah,13h

int10h

;==========================================

;---------菜单跳转选项-----------

hchh

cursor12,0

out1:

movah,1

int21h

cmpal,'1'

jzL1

cmpal,'2'

jzL2

cmpal,'3'

jzL3

cmpal,'4'

jzL4

cmpal,'5'

jzL5

jmpEXIT

;----------------主程序-------------------

L1:

PRINTarray1

HCHH

MOVBX,OFFSETMA;输出第一个矩阵

MOVCX,LA

MOVDX,HA

CALLPRINT_M

HCHH

JMPOUT1

L2:

PRINTarray2

HCHH

MOVBX,OFFSETMB;输出第二个矩阵

MOVCX,LB

MOVDX,HB

CALLPRINT_M1

CALLhuanhang

HCHH

JMPOUT1

L3:

PRINTD

HCHH

CALLMUL_AB;矩阵相乘

MOVBX,OFFSETMC;结果十进制输出

MOVCX,LC

MOVDX,HC

CALLPRINT_M2

HCHH

JMPOUT1

L4:

PRINTH

HCHH

MOVBX,OFFSETMC;结果十六进制输出

MOVCX,LC

MOVDX,HC

CALLPRINT_Z2

HCHH

JMPOUT1

L5:

PRINTB

HCHH

MOVBX,OFFSETMC;结果二进制输出

MOVCX,LC

MOVDX,HC

CALLPRINT_Z3

EXIT:

MOVAH,4CH

INT21H

;******************************

PRINT_M:

;第一个矩阵输出

PUSHCX

pushax;提示文字,并保护寄存器

pushdx

popdx

popax

PR2:

MOVAX,[BX];将BX数给AX

CALLPRINT_AX;直接输出一个数(十进制数)

CALLTAB_09;输出空格

ADDBX,2;转到下一个数

LOOPPR2

POPCX;根据列判断一行输入多少数据

CALLhuanhang;输出一行的数后立即换行

DECDX;DX自减

JNZPRINT_M;DX不为零直接跳到上面继续输出余数

RET

;******************************

PRINT_M1:

;第二个矩阵输出

PUSHCX

pushax

pushdx

popdx

popax

PR20:

MOVAX,[BX]

CALLPRINT_AX

CALLTAB_09

ADDBX,2

LOOPPR20

POPCX

CALLhuanhang;输出一列后立即换行

DECDX

JNZPRINT_M1

RET

;******************************

PRINT_M2:

;相乘矩阵后的输出

PUSHCX

pushax

pushdx

popdx

popax

PR21:

MOVAX,[BX]

CALLPRINT_AX

CALLTAB_09

ADDBX,2

LOOPPR21

POPCX

CALLhuanhang;输出一列后立即换行

DECDX

JNZPRINT_M2

RET

;******************************

PRINT_AX:

;将存在AX中的数按照十进制输出

PUSHBX

PUSHCX

PUSHDX

MOVBX,10

MOVCX,0

P_LOP1:

MOVDX,0

DIVBX;直接除以10,余数在DX一次输出一个

INCCX

PUSHDX

CMPAX,0;商存在AX中,接着用来取余数放到DX里面

JNZP_LOP1

MOVAH,2

P_LOP2:

POPDX

ADDDL,'0'

INT21H

LOOPP_LOP2;CX自加多少次,就自减多少次,输出整个数

POPDX

POPCX

POPBX

RET

;******************************

huanhang:

;段内换行,去掉这个后会陷于死循环!

PUSHAX

PUSHDX

MOVAH,2

MOVDL,13

INT21H

MOVDL,10

INT21H

POPDX

POPAX

RET

;******************************

TAB_09:

;TAB功能调用,让矩阵的输出更加规范!

PUSHAX

PUSHDX

MOVAH,2

MOVDL,9

INT21H

POPDX

POPAX

RET

;&&&&&&&&&&&&&&&矩阵相乘&&&&&&&&&&&&&&

MUL_AB:

;矩阵相乘

MOVDI,0

MOVHH,0

;--------嵌套循环-------------

MUL_0:

MOVLL,0

;---------------------

MUL_1:

MOVBX,HH;HH为空,BX清零

ADDBX,HH

MOVSI,LL;LL为空,SI清零

ADDSI,LL

MOVCX,LA;将4传给CX

;---------------------

MUL_2:

MOVAX,MA[BX];矩阵一的第一个数放进AX

MOVDX,MB[SI];矩阵二的第一个数放进DX

MULDX;两数相乘

ADDMC[DI],AX;结果矩阵第一数先放上AX

ADDBX,2;地址往下移

ADDSI,2*LB;地址下移矩阵二列数*2

LOOPMUL_2

;---------------------

ADDDI,2;地址往下移

INCLL;列数加1

CMPLL,LB;比较结果矩阵列数与矩阵二的列数

JNZMUL_1

;---------------------

ADDHH,LA;结果矩阵行数

CMPHH,HA*LA;比较结果矩阵行数数与矩阵一的行数与列数的乘积

JBMUL_0

RET

;%%%%%%%%%%%%%%十六进制输出%%%%%%%%%%%%%%

PRINT_Z2:

;十六进制矩阵输出

PUSHCX

pushax

pushdx

popdx

popax

print1:

MOVAX,[BX]

CALLHSP

CALLTAB_09

ADDBX,2

LOOPprint1;第一行输出

POPCX

CALLhuanhang;输出一列后立即换行

DECDX

JNZPRINT_Z2

RET

HSPPROCFAR;十六进制转换子程序

PUSHBX

PUSHCX

PUSHDX

MOVBX,AX

MOVCH,04D;CH初始定义为4

ROTATE:

MOVCL,04D;CL初始定义为4

ROLBX,CL;对操作数进行循环左移4次,每执行一次,把最高位移到最

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2