当前位置:编程学习 > C#/ASP.NET >>

谁知道用汇编语言设计四则运算计算器

谁知道用汇编语言设计四则运算计算器,给小弟一点指教。。。。。。。。。。。
谢谢。。。 --------------------编程问答-------------------- 沙发帮忙顶 --------------------编程问答-------------------- 该回复被版主删除 --------------------编程问答-------------------- 这个  呵呵  义务帮顶下吧 --------------------编程问答-------------------- 目录

1.前言 1
2.系统功能 1
3.设计思想 1
4.功能结构图 1
5.流程图 2
6.使用说明 3
7.心得体会 3
8.调试 3
9.参考文献 3
10.源代码——j.asm文件 3

1.前言
汇编语言是计算机能够提供给用户使用的最快而又最有效的语言。
汇编语言面向机器,只有它能够为程序员提供最直接操纵机器硬件系统的途径,利用它可以编写出在时间和空间两方面最有效率的程序。尽管在使用汇编语言进行程序设计之前,完全理解汇编语言特点有些困难,但了解汇编语言的特点对学习汇编语言程序设计是有益的。
2.系统功能
该系统实现了整数(2个字节的无符号数)的四则运算效果,当用户在运行这个程序的时候输入两个2个字节无符号整数,选择运算符号,就能计算出结果!
3.设计思想
本程序是以蓝色为背景,具有操作提示信息。在NUM1后面输入第一个运算数据,NUM2后面输入第二个运算数据,然后选择运算符号,就能运算出结果。其间有CLEAR子程序,进行屏幕初始化。CHANGE子程序,将十六进制数转换为十进制数。BEGIN子程序开始运算。DISPMSG子程序,显示用户界面。通过这几个及程序的协助,使得这个系统可以正常的运行!
4.功能结构图








                    
                                   




图一 功能结构图

5.流程图


图二 流程图

6.使用说明
直接点击应用程序或者在dos环境下运行.exe文件!在运行条件下按ESC即可退出!

7.心得体会
通过这次课程设计,我受益匪浅。 
本次的汇编语言课程设计是通过大量的查阅资料和搜索信息资料来完成的,在设计的过程使我掌握了许多的电脑基本技能及理解查阅资料的基本方法,同时经过我的不断查阅,理解资料,加深了对汇编语言的理解与认识。在设计的整个过程中,我体会到了设计的快乐,和小小的成就感。在设计过程中得到了老师的精心指导,帮助我进行分析和调试汇编语言源程序,使自己能够更快更好,更透彻的理解汇编语言的基本含义。在这次设计的过程中还学到了一些除技能以外的其他东西,领略到了别人在处理专业技能问题时显示出的优秀品质,更深切的体会到人与人之间的那种相互协调合作的机制,最重要的还是自己对一些问题的看法产生了良性的变化. 只有这样把自己身置于具体的问题之中,我们才能更好的解决问题。
8.调试

图三 用户界面
                                                                                                                                    
9.参考文献
[1] 《汇编语言程序设计指导》 清华大学出版社
[2] 《汇编语言编程艺术》清华大学出版社

10.源代码——j.asm文件
CURS MACRO A,B 
MOV AH,2 ;置光标位置 
MOV BH,0 ;页号为0 
MOV DH,A ;设置光标的坐标为(A.B) 
MOV DL,B 
INT 10H ;BIOS调用 

ENDM 
;------------------------------- 
DISPMSG MACRO MESSAGE 
LEA DX,MESSAGE ;传递MESSAGE的偏移地址 
MOV AH,9 ;显示字符串 
INT 21H ;DOS调用 

ENDM 
;---------------------------------- 

CLEAR MACRO COLOR ;清屏 
MOV AH,6 ;屏幕初始化 
MOV AL,0 ;页号 
MOV CH,0 ;设置左上角的坐标为(0,0) 
MOV CL,0 
MOV DL,100 ;设置右上角的坐标为(100,100) 
MOV DH,100 
MOV BH,COLOR ;卷入行属性 
INT 10H ;BIOS调用 
ENDM 

.MODEL SMALL 
.STACK 
.DATA ;数据段定义 
MSG0 DB '* * * * * * * * * * * * * * * * * * * *',0DH,0AH ;,0dh,0ah,0dh,0ah 
DB ' * *',0DH,0AH 
;db '* *',0dh,0ah 
;db '* *',0dh,0ah 
DB ' * --------caculater-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * NUM1:' 
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH 
DB ' * NUM2:' 
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH 
DB ' * RESULT:' 
DB '_______________ *',0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * *',0DH,0AH 
DB ' * * * * * * * * * * * * * * * * * * * *','$' 
MSG1 DB 'choose +,-,*,/','$' 
MSG2 DB 'you choose wrong','$',0AH,0DH 
MSG3 DB 'Press ESC to Exit!',0DH,0AH,'$' 
MSG4 DB 'Press any key to continue!',0DH,0AH,'$' 
MSG5 DB '-','$' 
MSG6 DB '.','$' 
MSG7 DB 'error input!','$' 
MSG8 DB 'data2 is wrong!','$' 
NUM1 DW ? 
NUM2 DW ? 
.CODE ;代码段从这里开始 
;-------------------------------------------- 
DEC_DIV PROC NEAR 
CWD ;将字转换为双字,AX内容符号扩展到DX 
DIV CX 
PUSH DX 
MOV DL,AL 
ADD DL,30H ;将不是数字的字符转换为数字 
MOV AH,2 ;显示输出 
INT 21H ;DOS调用 
POP DX 
MOV AX,DX 
RET 

DEC_DIV ENDP 
;------------------------------------------ 
CHANGE PROC NEAR ;该子程序的功能:将AX中存储的十六进制数转换为十进制数 
CMP AX,1000 
JAE C1 ;AX≥1000则转移 
CMP AX,100 
JAE C2 ;AX≥100则转移 
CMP AX,10 
JAE C3 ;AX≥10则转移 
JMP C4 ;AX<10 

C1: MOV CX,1000D 
CALL DEC_DIV 

C2: MOV CX,100D 
CALL DEC_DIV 

C3: MOV CX,10D 
CALL DEC_DIV 

C4: MOV CX,1D 
CALL DEC_DIV 
RET 
CHANGE ENDP 
;------------------------------- 
BEGIN PROC NEAR 

BACK: CLEAR 1EH 
CURS 2,20 ;设置光标为(2.20) 
DISPMSG MSG0 ;显示用户界面 
CURS 8,41 ;设置光标为(8,41) ,第一行 
MOV BX,0 
MOV CX,2 
NEWCHAR1: 
MOV AH,1 ;键盘输入并回显 
INT 21H ;DOS调用 
CMP AL,30H ;检查输入的字符是不是数字 
JAE J1 ;如果不是,则转移至J1 
JMP D2 ;是,转移到D2执行 
J1: CMP AL,39H ; 与9的ASCII侣氡 
JBE J2 ;如果输入的字符是0-9,则转移至J2 
JMP D2 ;如果不是数字,则转移至D2 
J2: SUB AL,30H 
CBW ;AL的内容符号扩展到AH 
XCHG AX,BX 
MOV DI,10 
MUL DI 
XCHG AX,BX 
ADD BX,AX 
LOOP NEWCHAR1 
MOV NUM1,BX 
CURS 11,41 ;设置光标位为(11,40),第二行 
MOV BX,0 
MOV CX,2 
NEWCHAR2: 
MOV AH,1 ;键盘输入并回显 
INT 21H ;DOS调用 
CMP AL,30H ;与0的ASCII码比较 
JAE J3 ;如果输入数字大于等于0则跳转至J3 
JMP D2 
J3: CMP AL,39H ;与9比较 
JBE J4 ;如果小于或等于9则跳转 
JMP D2 ;如果输入不是数字则跳转 
J4: SUB AL,30H ;如果输入不是0-9,则转化成相应的字符 
CBW ;将AL符号扩展到AH 
XCHG AX,BX 
MOV DI,10 
MUL DI 
XCHG AX,BX 
ADD BX,AX 
LOOP NEWCHAR2 
MOV NUM2,BX 
MOV AX,NUM1 
MOV BX,NUM2 
PUSH AX 
PUSH BX 
CURS 15,33 ;设置光标的位置为(15.33),第三行 
DISPMSG MSG1 ;显示提示信息 
MOV AH,1 ;接受键盘输入并回显 
INT 21H ;DOS调用 
CMP AL,'+' 
JE ADDI ;如果运算符为+,则计算两数之和 
CMP AL,'-' 
JE SUBT ;如果运算符为-,则计算两数之差 
CMP AL,'*' 
JE MULT ;如果运算符为*,则计算两数之积 
CMP AL,'/' 
JE DIVI ;如果运算符为/,则计算两数之商 
CURS 16,25 ;设置光标为(16,25) 
DISPMSG MSG2 ;在屏幕上输出提示信息 
JMP D1 

;---------------------------------------- 
;ADD THE TWO DATAS 
ADDI: POP BX 
POP AX 
ADD AX,BX ;计算两数字之和 
PUSH AX 
CURS 14,41 ;设置光标位置为(14,41) 
POP AX 
CALL CHANGE ;将结果转换为十进制数 
JMP D1 
;--------------------------------------- 
;SUBTRACT THE TWO DATAS 
SUBT: POP BX 
POP AX 
CMP AX,BX ;比较两数大小 
JAE D0 ;如果AX>=BX则跳转 
XCHG AX,BX 
PUSH AX 
PUSH BX 
CURS 14,40 ;设置光标位置为(14,40) 
DISPMSG MSG5 ;在屏幕上显示负号 
POP BX 
POP AX 
D0: SUB AX,BX ;计算两数之差 
PUSH AX 
CURS 14,41 ;设置光标位置为(14,41) 
POP AX 
CALL CHANGE ;将结果转换为十进制数 
JMP D1 
;--------------------------------------- 
;MULTIPLY THE TWO DATAS 
MULT: POP BX 
POP AX 
MUL BX ;计算两数之积 
PUSH AX 
CURS 14,41 ;设置光标位置为(14,41) 
POP AX 
CALL CHANGE ;将结果转换为十进制数 
JMP D1 
;--------------------------------------- 
;DIVIDE THE TWO DATAS 
DIVI: POP BX 
POP AX 
CMP BX,0 ;判断除数是否为0 
JE ERROR ;如果是0则跳转 
CWD 
DIV BX ;计算两数之商 
PUSH DX 
PUSH AX 
CURS 14,41 ;设置光标位置为(14,41) 
POP AX 

CALL CHANGE ;将十六进制数转换为十进制数 
POP DX 
CMP DX,0 
JNE LOP ;如果DX不等于0则跳转 
JMP D1 

LOP: MOV CX,4 ;设置精确度为小数点后4位 
PUSH DX 
DISPMSG MSG6 ;输出小数点 
POP DX 

CON: PUSH BX 
MOV AX,DX 
MOV BX,10 
MUL BX 
POP BX 
CWD ;将AX的内容符号扩展到双字 
DIV BX ;计算小数点后每一位的数字 
PUSH DX 
PUSH CX 
CALL CHANGE ;将十六进制数转化为十进制数 
POP CX 
POP DX 
CMP DX,0 ;判断是否已经计算到小数点后第六位 
JE D1 ;如果是,则跳转 
LOOP CON ;如果不是,就继续计算 
ERROR: CURS 15,33 ;设置光标位置为(15,33) 
DISPMSG MSG8 ;提示出错 

D1: RET 
D2: PUSH AX 
PUSH BX 
CURS 15,33 ;设置光标位置为(15,33) 
DISPMSG MSG7 ;提示输入出错 
POP BX 
POP AX 
RET 

BEGIN ENDP 
;---------------------------------------- 
MAIN PROC NEAR 

MOV AX,@DATA 
MOV DS,AX 
MOV ES,AX 
PUSH DS 
XOR AX,AX 
PUSH AX 
MOV NUM2,0 ;将缓冲区清空 
MOV NUM1,0 
AGAIN: 
CALL BEGIN 
CURS 16,23 ;设置光标位置为(16.23) 
DISPMSG MSG3 ;在屏幕上输出提示信息,提示退出的方法 
CURS 17,23 ;设置光标位置为(17.23) 
DISPMSG MSG4 ;在屏幕上输出提示信息,提示继续的方法 
MOV AH,7 ;键盘输入,无回显 
INT 21H ;DOS调用 
CMP AL,27 ;判断输入的是否为ESC 
JNE AGAIN ;如果不是就继续执行以上运算 
EXIT: MOV AX,4C00H ;如果是就退出系统 
INT 21H ;DOS调用 
MAIN ENDP 
END MAIN
补充:.NET技术 ,  其他语言
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,