资源描述
华 北 科 技 学 院
课程设计说明书
班级: 姓名:
学号:
课程名称: 汇编语言课程设计
课设时间: 2023-12-05 至 2023-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)内容:将一个4 X 4 的矩阵与一个4 X 1 的矩阵相乘,将结果存入相应的单元,分别用十进制数、二进制、十六进制形式显示结果。
3.课程设计环境
(1)硬件:PC机。
(2)软件:操作系统为64位Windows7,设计语言为MASM FOR WINDOWS 汇编语言集成实验环境。
4.课程设计规定
(1)课程设计可采用每人一题,可任选一题进行设计, 至少包含五个功能模块。或者每组完毕一个课题,每组成员分工合作完毕一个课程设计,每个人的任务不同;
(2)可以选择老师提供的参考选题,也可以自选,假如自选,需要将自选题目的具体内容以及实现规定提供应老师,老师批准后方可采用;
(3)规定运用结构化程序设计方法以及汇编语言的编程思想来完毕系统的设计;
(4)规定有欢迎界面、菜单、文献操作,数据使用数组、结构体等均可,键盘操作或鼠标操作均可;
(5)模块化程序设计:规定在设计的过程中,按功能定义过程或宏,多个模块化设计可以用文献的形式来实现;
(6)学生所选课题必须上机通过,并获得满意的结果;
(7)程序书写风格:锯齿型书写格式。
二. 软件需求分析和设计
(1)需求分析本程序重要实现的功能是一个4*4矩阵与4*1矩阵相乘最后得到一个4*1矩阵,并且规定用三种方式输出这个矩阵,分别是二进制和十六进制和十进制。并且这个程序规定菜单的选择。
(2)下面就是这个程序的流程图
、
开始
菜单选择
输出第一个矩阵(十进制)
输出第二个矩阵(十进制)
矩阵相乘运算(矩阵相乘规则)
输出结果矩阵(十进制)
输出流程图
开始
将BX值和地址给AX
输出结果矩阵(十六进制)
以十进制输出AX的第一个数
输出结果矩阵(二进制)
N
N
地址转移下个数,中间TAB功能
结束
列数CX=0?
主流程图
Y
行数DX=0?
Y
结束
开始
开始
获得AX中一个数
获得AX中一个数
循环左移四位
除以10,商放在AX,余数放在DX
取出AL低四位加上30H输出
AX=0?
N
Y
AL>9?
余数的出栈输出
N
Y
N
CX=0?
N
加上07H变成A-F
Y
输出一个数
结束
开始
CH=0?
十进制矩阵输出
获得AX中一个数
Y
结束
逻辑左移一位
是否进位?
N
十六进制矩阵输出
N
Y
输出0
输出1
CX=0?
Y
开始
二进制矩阵输出
开始
列循环数初始赋值
行循环数初始赋值
重新定义偏移量和CX
Y
N
边相乘边存储
CX=0?
Y
Y
第二矩阵是否有第二列?
N
行循环数加一
是否有下一行?
N
开始
三. 程序实现说明(介绍程序实现过程,涉及关键代码分析(注意:应当限制代码的数量))
1.矩阵相乘关键代码
MUL_AB: ;矩阵相乘
MOV DI, 0
MOV HH, 0
;--------嵌套循环-------------
MUL_0:
MOV LL, 0
;---------------------
MUL_1:
MOV BX, HH ;HH为空,BX清零
ADD BX, HH
MOV SI, LL ;LL为空,SI清零
ADD SI, LL
MOV CX, LA ;将4传给CX
;---------------------
MUL_2:
MOV AX, MA[BX] ;矩阵一的第一个数放进AX
MOV DX, MB[SI] ;矩阵二的第一个数放进DX
MUL DX ;两数相乘
ADD MC[DI], AX ;结果矩阵第一数先放上AX
ADD BX, 2 ;地址往下移
ADD SI, 2 * LB ;地址下移矩阵二列数*2
LOOP MUL_2
;---------------------
ADD DI, 2 ;地址往下移
INC LL ;列数加1
CMP LL, LB ;比较结果矩阵列数与矩阵二的列数
JNZ MUL_1
;---------------------
ADD HH, LA ;结果矩阵行数
CMP HH, HA * LA ;比较结果矩阵行数数与矩阵一的行数与列数的乘积
JB MUL_0
RET
2.十进制转换关键代码
PRINT_AX: ;将存在AX中的数按照十进制输出
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10
MOV CX, 0
P_LOP1:
MOV DX, 0
DIV BX ;直接除以10,余数在DX一次输出一个
INC CX
PUSH DX
CMP AX, 0 ;商存在AX中,接着用来取余数放到DX里面
JNZ P_LOP1
MOV AH, 2
P_LOP2:
POP DX
ADD DL, '0'
INT 21H
LOOP P_LOP2 ;CX自加多少次,就自减多少次,输出整个数
POP DX
POP CX
POP BX
RET
3.十六进制转换关键代码
HSP PROC FAR ;十六进制转换子程序
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
MOV CH,04D ;CH初始定义为4
ROTATE:
MOV CL,04D ;CL初始定义为4
ROL BX,CL ;对操作数进行循环左移4次,每执行一次,把最高位移到最低位,同时还把最高位移到CF
MOV AL,BL
AND AL,0FH ;取AL的低四位
ADD AL,30H ;加上30H输出
CMP AL,'9' ;AL与9比较
JBE PRINT2 ;小于等于就会跳到PRINT2
ADD AL,07H ;大于AL加上07H ,变成字母ABCDEF
PRINT2:
MOV DL,AL ;AL给DL输出出来
MOV AH,2
INT 21H
DEC CH ;ch自减,不为零继续循环上面代码
JNE ROTATE
MOV AH,2
MOV DL,'H'
INT 21H
POP DX
POP CX
POP BX
RET
HSP ENDP
4.二进制转换关键代码
DSP PROC FAR ;二进制转换子程序
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX ;把数值放到BX保护起来,BX中自身放的就是二进制
MOV CX,16 ;为循环做准备
T: SHL BX,1 ;把BX的值向左移一位,其高位放在CF标志位里
JC PRINT4 ;假如高位是1就输出1
JNC PRINT5 ;假如高位是0就输出0
PRINT4:
MOV DL,31H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表达字符1
MOV AH,2
INT 21H
JMP L
PRINT5:
MOV DL,30H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表达字符0
MOV AH,2
INT 21H
L:
LOOP T
MOV AH,2
MOV DL,'B'
INT 21H
POP DX
POP CX
POP BX
RET
DSP ENDP
5. 运营结果截图
菜单截图
矩阵一矩阵二和相乘后矩阵截图(十进制)
矩阵三十六机制和二进制截图
四. 程序总结(软件完毕情况,有哪些收获,存在哪些局限性
对课程设计有哪些建议)
这次课设我完毕的重要是矩阵的相乘和输出矩阵的进制转换,以及光标定位,菜单输出等等功能!这次课设的时间有两周,其实重要完毕在最后一周,通过这次实验最大的收获就是看程序一定要耐心,虽然程序是我拼凑而成,但是基本上已经读懂整个程序,途中碰见几个问题,非常感谢老师和同学们的帮助,最终完毕了这个程序。存在的局限性之处就是这两个矩阵是固定格式的,不能任意矩阵相乘,希望以后可以改善,这个课设学习了很多,新的知识重要是BOIS功能的调用,重要集中在字体颜色变化和光标的定位,还学到了矩阵相乘中的嵌套循环,这个对于循环反复操作不同的数非常的重要!此外还了解了进制转换的方法,也是运用了循环移位的操作,本来我觉得汇编是个令人头疼的语言,但是你只要紧紧抓住它其中数的变化就行,可以准拟定位数的位置及作用,并且还要了解数的及时清零与更新!往往其中很容易混淆的就是数的位置和作用,之前很容易的辨认错误!这次的实验还是学到了很多东西,重要感谢老师和同学的指导,总体上来说,完毕了基本课设规定!希望在以后的学习中,也应当有那种细心钻研的精神!
源代码:
DATA SEGMENT
;================菜单的定义===============
str1 db '***********************Menu:*******************',13,10
mess1 db ' ********1:print the first array:***************',13,10
mess2 db ' ********2:print the second array:**************',13,10
mess3 db ' ********3:print the Hexadecimal system array:*',13,10
mess4 db ' ********4:print the Binary system array:*******',13,10
mess5 db ' ********5:print the Decimal system array:******',13,10
mess6 db ' *******************END*************************',13,10
length1 equ $-str1
STR2 db 'please make your choose:',13,10
;-----------------------------
array1 DB 'the first array is (4*4):','$'
array2 DB 'the second array is (4*1):','$'
H DB 'print array1*array2(Hexadecimal system):','$'
B DB 'print array1*array2(Binary system):','$'
D DB 'print array1*array2(Decimal system):','$'
;----------------------------
MA DW 11, 12, 13, 14 ;定义4*4矩阵MA
DW 21, 22, 23, 24
DW 31, 32, 33, 34
DW 41, 42, 43, 44
HA EQU 4 ;行数
LA EQU 4 ;列数
;-----------------------------
MB DW 12 ;定义4*1矩阵MB
DW 11
DW 11
DW 11
HB EQU 4
LB EQU 1
;-----------------------------
MC DW HA * LB DUP(?) ;定义结果矩阵
HC EQU HA
LC EQU LB
HH DW ?
LL DW ?
;==============宏的定义==============
;--------------光标的初始定义-------
cursor macro row,rank
mov ah,2
mov dh,row
mov dl,rank
mov bh,0
int 10h
endm
;回车换行
hchh macro
mov dl, 10
mov ah,2
int 21h
mov dl ,13
mov ah,2
int 21h
endm
;字符串输出
PRINT macro x
mov ah,9
lea dx, x
int 21h
endm
DATA ENDS
;***********************************
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
;==========光标和菜单字体颜色设立==========
mov al,3
mov ah,00h
int 10h
mov bp,seg str1
mov es,bp
mov bp,offset str1
mov cx,length1
mov dx,0
mov bl,05h ;菜单红字定义
mov al,0
cursor 2,15 ;菜单光标初始定义
mov ah,13h
int 10h
;==========================================
;---------菜单跳转选项-----------
hchh
cursor 12,0
out1:
mov ah,1
int 21h
cmp al,'1'
jz L1
cmp al,'2'
jz L2
cmp al,'3'
jz L3
cmp al,'4'
jz L4
cmp al,'5'
jz L5
jmp EXIT
;----------------主程序-------------------
L1: PRINT array1
HCHH
MOV BX, OFFSET MA ;输出第一个矩阵
MOV CX, LA
MOV DX, HA
CALL PRINT_M
HCHH
JMP OUT1
L2: PRINT array2
HCHH
MOV BX, OFFSET MB ;输出第二个矩阵
MOV CX, LB
MOV DX, HB
CALL PRINT_M1
CALL huanhang
HCHH
JMP OUT1
L3: PRINT D
HCHH
CALL MUL_AB ;矩阵相乘
MOV BX, OFFSET MC ;结果十进制输出
MOV CX, LC
MOV DX, HC
CALL PRINT_M2
HCHH
JMP OUT1
L4: PRINT H
HCHH
MOV BX, OFFSET MC ;结果十六进制输出
MOV CX, LC
MOV DX, HC
CALL PRINT_Z2
HCHH
JMP OUT1
L5: PRINT B
HCHH
MOV BX, OFFSET MC ;结果二进制输出
MOV CX, LC
MOV DX, HC
CALL PRINT_Z3
EXIT:
MOV AH, 4CH
INT 21H
;******************************
PRINT_M: ;第一个矩阵输出
PUSH CX
push ax ;提醒文字,并保护寄存器
push dx
pop dx
pop ax
PR2:
MOV AX, [BX] ;将BX数给AX
CALL PRINT_AX ;直接输出一个数(十进制数)
CALL TAB_09 ;输出空格
ADD BX, 2 ;转到下一个数
LOOP PR2
POP CX ;根据列判断一行输入多少数据
CALL huanhang ;输出一行的数后立即换行
DEC DX ;DX自减
JNZ PRINT_M ;DX不为零直接跳到上面继续输出余数
RET
;******************************
PRINT_M1: ;第二个矩阵输出
PUSH CX
push ax
push dx
pop dx
pop ax
PR20:
MOV AX, [BX]
CALL PRINT_AX
CALL TAB_09
ADD BX, 2
LOOP PR20
POP CX
CALL huanhang ;输出一列后立即换行
DEC DX
JNZ PRINT_M1
RET
;******************************
PRINT_M2: ;相乘矩阵后的输出
PUSH CX
push ax
push dx
pop dx
pop ax
PR21:
MOV AX, [BX]
CALL PRINT_AX
CALL TAB_09
ADD BX, 2
LOOP PR21
POP CX
CALL huanhang ;输出一列后立即换行
DEC DX
JNZ PRINT_M2
RET
;******************************
PRINT_AX: ;将存在AX中的数按照十进制输出
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10
MOV CX, 0
P_LOP1:
MOV DX, 0
DIV BX ;直接除以10,余数在DX一次输出一个
INC CX
PUSH DX
CMP AX, 0 ;商存在AX中,接着用来取余数放到DX里面
JNZ P_LOP1
MOV AH, 2
P_LOP2:
POP DX
ADD DL, '0'
INT 21H
LOOP P_LOP2 ;CX自加多少次,就自减多少次,输出整个数
POP DX
POP CX
POP BX
RET
;******************************
huanhang: ;段内换行,去掉这个后会陷于死循环!
PUSH AX
PUSH DX
MOV AH, 2
MOV DL, 13
INT 21H
MOV DL, 10
INT 21H
POP DX
POP AX
RET
;******************************
TAB_09: ;TAB功能调用,让矩阵的输出更加规范!
PUSH AX
PUSH DX
MOV AH, 2
MOV DL, 9
INT 21H
POP DX
POP AX
RET
;&&&&&&&&&&&&&&&矩阵相乘&&&&&&&&&&&&&&
MUL_AB: ;矩阵相乘
MOV DI, 0
MOV HH, 0
;--------嵌套循环-------------
MUL_0:
MOV LL, 0
;---------------------
MUL_1:
MOV BX, HH ;HH为空,BX清零
ADD BX, HH
MOV SI, LL ;LL为空,SI清零
ADD SI, LL
MOV CX, LA ;将4传给CX
;---------------------
MUL_2:
MOV AX, MA[BX] ;矩阵一的第一个数放进AX
MOV DX, MB[SI] ;矩阵二的第一个数放进DX
MUL DX ;两数相乘
ADD MC[DI], AX ;结果矩阵第一数先放上AX
ADD BX, 2 ;地址往下移
ADD SI, 2 * LB ;地址下移矩阵二列数*2
LOOP MUL_2
;---------------------
ADD DI, 2 ;地址往下移
INC LL ;列数加1
CMP LL, LB ;比较结果矩阵列数与矩阵二的列数
JNZ MUL_1
;---------------------
ADD HH, LA ;结果矩阵行数
CMP HH, HA * LA ;比较结果矩阵行数数与矩阵一的行数与列数的乘积
JB MUL_0
RET
;%%%%%%%%%%%%%%十六进制输出%%%%%%%%%%%%%%
PRINT_Z2: ;十六进制矩阵输出
PUSH CX
push ax
push dx
pop dx
pop ax
print1:
MOV AX, [BX]
CALL HSP
CALL TAB_09
ADD BX, 2
LOOP print1 ;第一行输出
POP CX
CALL huanhang ;输出一列后立即换行
DEC DX
JNZ PRINT_Z2
RET
HSP PROC FAR ;十六进制转换子程序
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
MOV CH,04D ;CH初始定义为4
ROTATE:
MOV CL,04D ;CL初始定义为4
ROL BX,CL ;对操作数进行循环左移4次,每执行一次,把最高位移到最低位,同时还把最高位移到CF
MOV AL,BL
AND AL,0FH ;取AL的低四位
ADD AL,30H ;加上30H输出
CMP AL,'9' ;AL与9比较
JBE PRINT2 ;小于等于就会跳到PRINT2
ADD AL,07H ;大于AL加上07H ,变成字母ABCDEF
PRINT2:
MOV DL,AL ;AL给DL输出出来
MOV AH,2
INT 21H
DEC CH ;ch自减,不为零继续循环上面代码
JNE ROTATE
MOV AH,2
MOV DL,'H'
INT 21H
POP DX
POP CX
POP BX
RET
HSP ENDP
;%%%%%%%%%%%%%%十六进制输出%%%%%%%%%%%%%%
;***************二进制输出***************
PRINT_Z3: ;二进制矩阵输出
PUSH CX
push ax
push dx
pop dx
pop ax
print3:
MOV AX, [BX] ;将BX值传给AX
CALL DSP
CALL TAB_09
ADD BX, 2 ;执行一个数地址加2,到下一个数
LOOP print3 ;第一行输出
POP CX ;CX出栈
CALL huanhang ;输出一列后立即换行
DEC DX ;DX出栈
JNZ PRINT_Z3
RET
DSP PROC FAR ;二进制转换子程序
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX ;把数值放到BX保护起来,BX中自身放的就是二进制
MOV CX,16 ;为循环做准备
T: SHL BX,1 ;把BX的值向左移一位,其高位放在CF标志位里
JC PRINT4 ;假如高位是1就输出1
JNC PRINT5 ;假如高位是0就输出0
PRINT4:
MOV DL,31H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表达字符1
MOV AH,2
INT 21H
JMP L
PRINT5:
MOV DL,30H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表达字符0
MOV AH,2
INT 21H
L:
LOOP T
MOV AH,2
MOV DL,'B'
INT 21H
POP DX
POP CX
POP BX
RET
DSP ENDP
;***************二进制输出***************
CODE ENDS
END START
展开阅读全文