汇编语言课程设计编写两个四位无符号十进制数乘法程序
党员对照检查材料-祝老师新年快乐
华 北 科 技 学 院
课程设计说明书
课程名称: 汇编语言
班级:
计算机B08-2 姓名:_ 朱云峰 _
学号:__ 2
__
设计题目:
编写两个四位无符号十进制数乘法程序
设计时间:
2010年6月23日
至
2010年 6月30日
指导教师:___ ___ 杜杏菁______ ____ _
评
语:____________________________ _____
_____________________________________ ___
_________________________________________
________________________________________ _
_________________________________________
评阅成绩:
__ __
评阅教师:
__ __
一、课程设计目的
进
行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计
的基本知识和基本方法,通过实际
动手能力的培养,进一步熟悉汇编语言的结构
和使用方法,达到能独立阅读、编制和调试一定规模的汇编
语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
三、课程设计题目:
编写两个四位无符号十进制数乘法程序。
四、课题分析
计算用的数据要求从键盘输入,而且应该不止一次地输入,所以应该通过定义,调用子程序来实现;在输入的子程序重要加入ASCII码的转换,将输入的数
据转换为机器能
计算的数据;在输入子程序中要加入输入数据的判断,只能把数
据限制在数字键,令其他输入显示为错误
;接下来是计算过程,得到的结果也同
样是计算机能够识别的ASCII码;最后是输出显示部分,该部
分也应该被定义为
子程序,加入数值的转换,使输出的数据为十进制数,调用9号功能,将计算结
果显示在屏幕上。
五、流程图:
- 1 -
- 2 -
六、程序源代码:
.MODEL
SMALL
.386
DATA SEGMENT
FLAG_SIGN DB 0
FLAG_NUM1 DB 0
FLAG_NUM2 DB 0
TEMP DD 0
ARRAY
DD 16 DUP(0)
ERR DB 0DH,0AH,'Input
error!',0DH,0AH,'$$'
STRING DB
0AH,0DH,0AH,0DH,'Please Input(eg. A*B= ) $$'
STRIN DB 0AH,0DH,0AH,0DH,'(
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
AGAIN:
LEA DX,STRING
MOV AH,9
INT 21H
LEA DX,STRIN
MOV AH,9
INT 21H
MOV
EBX,OFFSET ARRAY
MOV FLAG_SIGN,0
MOV FLAG_NUM1,0
MOV
FLAG_NUM2,0
L_Input0:
XOR
EDX,EDX
XOR ECX,ECX
XOR EAX,EAX
MOV AH,1
INT 21H
CMP AL,'+'
JZ L_Input1
CMP AL,'-'
JNZ L_Number
NOT FLAG_SIGN
L_Input1:
- 3 -
MOV AH,1
INT 21H
L_Number:
CMP AL,'0'
JB L_Operator
CMP AL,'9'
JA L_Operator
SUB AL,30H
ADD EDX,EDX
MOV ECX,EDX
ADD ECX,ECX
ADD ECX,ECX
ADD
EDX,ECX
MOV AH,0
ADD EDX,EAX
MOV FLAG_NUM1,1
JMP
L_Input1
L_Operator:
CMP AL,'*'
JNZ L_Equal
CMP
FLAG_NUM1,0
JZ ER
MOV [BX],EDX
ADD BX,4
MOV FLAG_NUM1,0
MOV
FLAG_NUM2,1
JMP L_Input0
L_Equal:
MOV [BX],EDX
CMP AL,'='
JNZ L_Quit1
MOV
BL,FLAG_NUM1
MOV CL,FLAG_NUM2
CMP BL,CL
JNZ ER
CMP
FLAG_SIGN,0
JZ L_Cal
MOV DL,'-'
MOV AH,2
INT 21H
L_Cal:
MOV CX,0
MOV
SI,CX
MOV EAX,ARRAY[SI+4]
- 4
-
MOV EBX,ARRAY[SI]
MUL EBX
MOV
EBX,1000000000
DIV EBX
MOV TEMP,EAX
CALL BINTOASCII
MOV
TEMP,EDX
CMP TEMP,0
JZ Show_0
CALL BINTOASCII
JMP AGAIN
Show_0:
MOV CX,9
Display:
MOV DL,'0'
MOV AH,2
INT 21H
DEC CX
CMP CX,0
JNZ Display
JMP AGAIN
L_Quit1:
CMP AL,'Q'
JNZ L_Quit2
JMP L_Quit
L_Quit2:
CMP AL,'q'
JNZ ER
JMP
L_Quit
ER:
MOV DX,OFFSET ERR
MOV AH,9
INT 21H
JMP AGAIN
L_Quit:
MOV AH,4CH
INT 21H
BINTOASCII PROC
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
MOV EAX,TEMP
- 5 -
MOV EBX,10
PUSH BX
B3:
CMP EAX,0
JZ B4
SUB EDX,EDX
DIV EBX
ADD DL,30H
PUSH DX
JMP B3
B4:
POP DX
CMP DL,10
JE B5
MOV AH,2
INT 21H
JMP B4
B5:
POP
EDX
POP ECX
POP EBX
POP EAX
RET
BINTOASCII ENDP
CODE ENDS
END START
七、结果显示
- 6 -
八、感想、收获及体会
通过此次编程实践,我又得到了一种全新的体验。
本次的实践与以往的上课实践不同,上课的
时候老师让我们把所教授的知识
重新实践,加强巩固,已达到融会贯通的目的;而此次的编程实践却是自
己选题
目自己查找资料,通过自学来掌握所需知识,这需要一定的毅力与智慧。
在第一天选课
的时候,记得老师跟我们说过,根据自己的实际情况,自己的
学习水平,与参考考试成绩来选题,而我的
编程水平没有想象中的那么好,所以
我选了一个比较适合我自己的题目:双字乘法程序。题目看似简单,
但其实不然,
对于我这个编程新手来说,这道题目并不容易,其中有很多东西老师在课堂上没
有
教过,只能自己通过自学来掌握。通过自学与同学交流,我逐渐掌握编程所需
的知识要点,并逐步实施实
践,在同学们的大力帮助下,终于完成了作品。完成
时的那种愉悦,不言而喻。
而最大的收获
莫过于得到了一份珍贵的编程经验,一份辛苦的结晶。这些在
不断鼓励我继续向前,希望以后能有更大的
收获。
其实在我看来,编程就是一场战争,你需要排兵布阵,你需要观察敌情,你
需要苦思冥
想做出判断,你需要沙场秋点兵的那种魄力。当你面对伪装的敌人时,
你不能认清它的真实面孔,就盲目
地出兵讨伐,必然吃败仗。所以我做好了全面
的准备,经过仔细的推敲与思考,最终做出了程序。但还有
一些不完善的地方,
由于时间比较短,所以没能修改得很完善。希望老师见谅。
- 7 -
华 北 科 技 学 院
课程设计说明书
课程名称: 汇编语言
班级: 计算机B08-2 姓名:_ 朱云峰 _
学号:__
2 __
设计题目:
编写两个四位无符号十进制数乘法程序
设计时间:
2010年6月23日
至
2010年
6月30日
指导教师:___ ___ 杜杏菁______ ____ _
评 语:____________________________ _____
_____________________________________ ___
_________________________________________
________________________________________ _
_________________________________________
评阅成绩:
__ __
评阅教师:
__ __
一、课程设计目的
进
行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计
的基本知识和基本方法,通过实际
动手能力的培养,进一步熟悉汇编语言的结构
和使用方法,达到能独立阅读、编制和调试一定规模的汇编
语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
三、课程设计题目:
编写两个四位无符号十进制数乘法程序。
四、课题分析
计算用的数据要求从键盘输入,而且应该不止一次地输入,所以应该通过定义,调用子程序来实现;在输入的子程序重要加入ASCII码的转换,将输入的数
据转换为机器能
计算的数据;在输入子程序中要加入输入数据的判断,只能把数
据限制在数字键,令其他输入显示为错误
;接下来是计算过程,得到的结果也同
样是计算机能够识别的ASCII码;最后是输出显示部分,该部
分也应该被定义为
子程序,加入数值的转换,使输出的数据为十进制数,调用9号功能,将计算结
果显示在屏幕上。
五、流程图:
- 1 -
- 2 -
六、程序源代码:
.MODEL
SMALL
.386
DATA SEGMENT
FLAG_SIGN DB 0
FLAG_NUM1 DB 0
FLAG_NUM2 DB 0
TEMP DD 0
ARRAY
DD 16 DUP(0)
ERR DB 0DH,0AH,'Input
error!',0DH,0AH,'$$'
STRING DB
0AH,0DH,0AH,0DH,'Please Input(eg. A*B= ) $$'
STRIN DB 0AH,0DH,0AH,0DH,'(
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
AGAIN:
LEA DX,STRING
MOV AH,9
INT 21H
LEA DX,STRIN
MOV AH,9
INT 21H
MOV
EBX,OFFSET ARRAY
MOV FLAG_SIGN,0
MOV FLAG_NUM1,0
MOV
FLAG_NUM2,0
L_Input0:
XOR
EDX,EDX
XOR ECX,ECX
XOR EAX,EAX
MOV AH,1
INT 21H
CMP AL,'+'
JZ L_Input1
CMP AL,'-'
JNZ L_Number
NOT FLAG_SIGN
L_Input1:
- 3 -
MOV AH,1
INT 21H
L_Number:
CMP AL,'0'
JB L_Operator
CMP AL,'9'
JA L_Operator
SUB AL,30H
ADD EDX,EDX
MOV ECX,EDX
ADD ECX,ECX
ADD ECX,ECX
ADD
EDX,ECX
MOV AH,0
ADD EDX,EAX
MOV FLAG_NUM1,1
JMP
L_Input1
L_Operator:
CMP AL,'*'
JNZ L_Equal
CMP
FLAG_NUM1,0
JZ ER
MOV [BX],EDX
ADD BX,4
MOV FLAG_NUM1,0
MOV
FLAG_NUM2,1
JMP L_Input0
L_Equal:
MOV [BX],EDX
CMP AL,'='
JNZ L_Quit1
MOV
BL,FLAG_NUM1
MOV CL,FLAG_NUM2
CMP BL,CL
JNZ ER
CMP
FLAG_SIGN,0
JZ L_Cal
MOV DL,'-'
MOV AH,2
INT 21H
L_Cal:
MOV CX,0
MOV
SI,CX
MOV EAX,ARRAY[SI+4]
- 4
-
MOV EBX,ARRAY[SI]
MUL EBX
MOV
EBX,1000000000
DIV EBX
MOV TEMP,EAX
CALL BINTOASCII
MOV
TEMP,EDX
CMP TEMP,0
JZ Show_0
CALL BINTOASCII
JMP AGAIN
Show_0:
MOV CX,9
Display:
MOV DL,'0'
MOV AH,2
INT 21H
DEC CX
CMP CX,0
JNZ Display
JMP AGAIN
L_Quit1:
CMP AL,'Q'
JNZ L_Quit2
JMP L_Quit
L_Quit2:
CMP AL,'q'
JNZ ER
JMP
L_Quit
ER:
MOV DX,OFFSET ERR
MOV AH,9
INT 21H
JMP AGAIN
L_Quit:
MOV AH,4CH
INT 21H
BINTOASCII PROC
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
MOV EAX,TEMP
- 5 -
MOV EBX,10
PUSH BX
B3:
CMP EAX,0
JZ B4
SUB EDX,EDX
DIV EBX
ADD DL,30H
PUSH DX
JMP B3
B4:
POP DX
CMP DL,10
JE B5
MOV AH,2
INT 21H
JMP B4
B5:
POP
EDX
POP ECX
POP EBX
POP EAX
RET
BINTOASCII ENDP
CODE ENDS
END START
七、结果显示
- 6 -
八、感想、收获及体会
通过此次编程实践,我又得到了一种全新的体验。
本次的实践与以往的上课实践不同,上课的
时候老师让我们把所教授的知识
重新实践,加强巩固,已达到融会贯通的目的;而此次的编程实践却是自
己选题
目自己查找资料,通过自学来掌握所需知识,这需要一定的毅力与智慧。
在第一天选课
的时候,记得老师跟我们说过,根据自己的实际情况,自己的
学习水平,与参考考试成绩来选题,而我的
编程水平没有想象中的那么好,所以
我选了一个比较适合我自己的题目:双字乘法程序。题目看似简单,
但其实不然,
对于我这个编程新手来说,这道题目并不容易,其中有很多东西老师在课堂上没
有
教过,只能自己通过自学来掌握。通过自学与同学交流,我逐渐掌握编程所需
的知识要点,并逐步实施实
践,在同学们的大力帮助下,终于完成了作品。完成
时的那种愉悦,不言而喻。
而最大的收获
莫过于得到了一份珍贵的编程经验,一份辛苦的结晶。这些在
不断鼓励我继续向前,希望以后能有更大的
收获。
其实在我看来,编程就是一场战争,你需要排兵布阵,你需要观察敌情,你
需要苦思冥
想做出判断,你需要沙场秋点兵的那种魄力。当你面对伪装的敌人时,
你不能认清它的真实面孔,就盲目
地出兵讨伐,必然吃败仗。所以我做好了全面
的准备,经过仔细的推敲与思考,最终做出了程序。但还有
一些不完善的地方,
由于时间比较短,所以没能修改得很完善。希望老师见谅。
- 7 -