汇编实验之四则运算

合集下载

四则运算实验报告

四则运算实验报告

实验3四则运算表达式求值背景在工资管理软件中,不可避免的要用到公式的定义及求值等问题。

对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。

问题描述四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

基本要求使用二叉树来实现。

实现提示利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。

输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。

输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

选作内容(1)在输入输出方式上要求使用:输入:将中缀表达式存于文本文件中,程序从该文本文件中读出表达式。

输出:如果该中缀表达式正确,则将后缀表达式输出到该文件中原表达式的后面,它们之间用“---”后相连;如果不正确,请在输出表达式错误提示到该文件原表达式的后面,它们之间用“---”相连。

(2) 利用堆栈来实现中缀表达式转换为后缀表达式。

测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+程序代码:#include <iostream>#include <string.h>using namespace std;#define SIZE 100#define STACKINCREMENT 10template<class T>//栈class stack{public:void InitStack() {S.base = (T *)malloc(SIZE * sizeof(T));if(!S.base) exit(0);S.top = S.base;S.stacksize = SIZE;}void DestroyStack(){free(S.base);}void ClearStack(){S.top = S.base;}bool StackEmpty(){if(S.top == S.base) return true;else return false;}int StackLength(){return (S.top - S.base);}bool GetTop(T &t){if(S.top != S.base){t = *(S.top - 1);return true;}else return false;}void Push(T t){if(S.top - S.base >= S.stacksize){S.base = (T *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(T));if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = t;S.top++ ;}bool Pop(T &t){if(S.top == S.base) return false;else S.top-- ;t = *S.top ;return true;}private:struct SqStack{T *base;T *top;int stacksize;}S;};class BiTree{private:struct BiTreeNode{char OPT[10];BiTreeNode *lchild,*rchild;};BiTreeNode *T; //T是根结点int index; //index是后缀表达式转换二叉树时的索引int number_of_point ;//销毁一颗树void DestroyTree(BiTreeNode *T){if(T){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);}}void DestroyTree(){DestroyTree(T);}//1表示栈顶优先级高于待入栈的元素int compare(char a,char b){ //定义了任意两个运算符的优先级if(a == '(' && b == ')') return 0;else if((a == '+' && b == '*') || (a == '+' && b == '/') || (a == '-' && b == '*') || (a == '-' && b == '/')|| (a != ')' && b == '(') || (a == '(' && b != ')'))return -1;else return 1;}//递归构造start,end分别是一个式子开始值和结束值的索引/*递归构造中缀表达式转化为的二叉树(利用栈) */void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end){ if(start == end) { //递归终止if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);strcpy(T->OPT,str[start]);T->lchild = NULL;T->rchild = NULL;}else{stack<char> opt;stack<int> num;num.InitStack();opt.InitStack();char last;int index;int a;bool jump = false;for(int i = start;i <= end;i++) { //begin求解优先级最小的一个运算符if(jump) break;number_of_point = 0 ;if(IsNumber(str[i][0]) || str[i][0] == '-' &&IsNumber(str[i][1]) )continue;else{char c = str[i][0];char b;if(i == start && c == '(') {start += 1;continue;}else if(opt.StackEmpty() || (opt.GetTop(b) && compare(b,c) == -1)){opt.Push(c);num.Push(i);}else{if(c != ')'){opt.Pop(b);num.Pop(a);if(!opt.StackEmpty()){opt.GetTop(b);if(compare(b,c) == 1){opt.Pop(b);num.Pop(a);opt.Push(c);num.Push(i);}else{opt.Push(c);num.Push(i);}}else{opt.Push(c);num.Push(i);}}else{for(opt.GetTop(b);compare(b,c) != 0;opt.GetTop(b)){opt.Pop(b);num.Pop(a);if(opt.StackEmpty()){opt.Push(b);num.Push(a);end -= 1;jump =true;break;}}if(compare(b,c) == 0) {opt.Pop(b);num.Pop(a);}}}}} //end,得到的是该步中的根结点字符last及其索引indexopt.Pop(last);num.Pop(index);if(!opt.StackEmpty()){opt.Pop(last);num.Pop(index);}opt.DestroyStack();num.DestroyStack();if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);T->OPT[0] = last;T->OPT[1] = '\0';InorderCreate(T->rchild,str,start,index-1);InorderCreate(T->lchild,str,index+1,end);}}bool IsNumber(char a){ //判断一个字符是否为数值形式的if( a == '.' && number_of_point == 0 ) {number_of_point ++ ;return true;}else if('0' <= a && a <= '9') return true ;else return false;}//递归求解树表示的表达式的值double Operate(BiTreeNode *T){if(T->lchild==NULL && T->rchild==NULL){double num = atof(T->OPT); //调用系统函数atof()将字符串转换为浮点数return num;}double ld,rd;ld = Operate(T->lchild);rd = Operate(T->rchild);char c = T->OPT[0];switch(c){case '+': return ld+rd;break;case '-': return rd-ld;break;case '*': return ld*rd;break;case '/': return rd/ld;break;default:cout << " you have entered wrong data ! "<< endl ;return 0;break ;}}void display(BiTreeNode *T){if(T == NULL ) return ;display(T->rchild);display(T->lchild);cout << T->OPT << " " ;public:BiTree() {T = NULL ;index = 0 ;number_of_point = 0 ;}/*以下两个函数重载私有成员函数方便计算*/void InorderCreate(){char OPT[30][10];cout << "输入中缀表达式: " << endl;char c = getchar();bool flag = true;int i = 0,j = 0 ;while(c != 10) { //输入的是空格j = 0;if(c == '-' && flag == true) { //flag判断是否是一个负数的值OPT[i][j++] = c;for(c = getchar() ; IsNumber(c) ; c = getchar() )OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else if(IsNumber(c)){OPT[i][j++] = c;for(c = getchar();IsNumber(c);c = getchar())OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else //运算符时的处理{flag = true;OPT[i][j++] = c;OPT[i++][j] = '\0';c = getchar();}}InorderCreate(T,OPT,0,i-1);}double Operate(){return Operate(T);}void display(){display(T) ;}~BiTree() {DestroyTree();};int main(){BiTree tree;tree.InorderCreate();cout << endl << tree.Operate() << endl;tree.display() ;cout << endl ;return 0;}测试结果:。

实验一四则运算(INTERNET)

实验一四则运算(INTERNET)

电工电子实验中心实验报告课程名称:计算机硬件技术基础实验实验名称:实验一四则运算姓名:学号:评定成绩:审阅教师:实验时间:123456一、实验目的要求1.熟悉汇编语言的框架结构,掌握顺序结构的编程方法;2.熟悉Tddebug调试环境和Turbo Debugger的使用;3.理解X86内存数据的组织方式;4.理解基本的内存寻址方式。

二、实验任务完成32位无符号数的加法、减法,16位乘以16位,32位除以16位除法的四则运算练习。

三、实验代码DATA SEGMENTA DW 1234H, 5678H ;被加数B DW 0FEDCH, 123AH ;加数C DW 2 DUP (?)AD DW 0FEDCH, 0BA98HBD DW 1234H, 789AHCD DW 2 DUP (?)A1 DW 0D678HB1 DW 0012HC1 DW 2 DUP (?)A2 DW 5678H, 0234HB2 DW 0F234HC2 DW 2 DUP (?)DATA ENDSSTACK1 SEGMENT STACKDB 100 DUP(?)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START PROC FARPUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXMOV AX, A ;32位无符号加法ADD AX, B ;低16位加低16位MOV C, AX ;保存结果MOV AX, A+2ADC AX, B+2 ;高16位加高16位MOV C+2, AX ;保存结果MOV AX, AD ;补全代码1-32位无符号减法SUB AX, BD ;低16位相减MOV CD, AX ;保存结果MOV AX, AD+2SBB AX, BD+2 ;高16位相减MOV CD+2, AX ;保存结果MOV AX, A1 ;补全代码2-16位乘以16位MUL B1 ;AX中的16位与B1中的16位相乘(结果为32位)MOV C1, AX ;保存低16位结果MOV C1+2, DX ;保存高16位结果MOV AX, A2 ;补全代码3-32位除以16位MOV DX, A2+2 ;高16位DIV B2 ;AX中的低16位、DX中的高16位与B2中的16位相乘MOV C2, AX ;保存低16位结果MOV C2+2, DX ;保存高16位结果RETSTART ENDPCODE ENDSEND START四、探究内容1)若需要进行有符号数的运算,需要注意什么问题?如何实现?答:有符号数的首位数字,0代表“+”,1代表“-”;同样n位数的有符号数的计算范围是-2^(n-1)-2^(n-1),无符号数的计算范围是0-(2^n)-1。

汇编语言实现四则混合运算

汇编语言实现四则混合运算

;本程序实现加减混合运算输入格式必须为1+2-3=;程序思路:遇到一个操作符执行前一次运算,等号执行最后一次运算,然后保存本次操作符;---------提示信息------DISPL MACRO DIMOV AH,9MOV DX,DIINT 21HENDM;-----------DISP MACRO V ARMOV AH,2MOV DL,V ARINT 21HENDM;--------输入函数-------INPUT MACROPUSH AXPUSH BXPUSH CXPUSH DXMOV BX,0 ;BX存放十进制数CLCMOV DX,0NEXT0:MOV AH,1INT 21HCMP AL,2BH ;判断输入是否为'+'JE NEXT2CMP AL,2DH ;判断输入是否为'-'JE NEXT2CMP AL,3DH ;判断‘=’JE NEXT2SUB AL,30HJL NEXT1CMP AL,9JG NEXT1MOV AH,0 ;将输入的数转换成10进制数XCHG AX,BXMOV CX,10MUL CXADD AX,BXJC NEXT1XCHG AX,BXJMP NEXT0NEXT1:MOV DX,0MOV BX,0MOV DI,OFFSET STR ;提示出错DISPL DIMOV DI,OFFSET STR2DISPL DIJMP NEXT0NEXT2:CMP DX,0JNZ NEXT1CMP COUNT,1 ;第一次输入存到buf0以后输入全部存放到buf1 JE L0MOV BUF0,BXJMP L1L0: MOV BUF1,BXJMP NEXT3L1: MOV OPER,AL ;将操作符保存至operMOV COUNT,1MOV BX,0JMP NEXT0NEXT3:CMP OPER,'+';判读那是何种操作JE N0CMP OPER,'-'JE N1N0:MOV BX,BUF0 ;加法相应操作ADD BX,BUF1MOV BUF0,BXCMP AL,'='JE NEXT4JMP L1N1:MOV DX,BUF0 ;加法操作CMP FLAG,1 ;如果原来buf0里的数是负数用buf1-buf0的绝对值JNE N2XCHG DX,BUF1MOV FLAG,0N2: CLCSBB DX,BUF1JNC N3MOV FLAG,1NEG DX ;如果相减为负数则存放绝对值N3:MOV BUF0,DXCMP AL,'='JE NEXT4JMP L1NEXT4:CMP FLAG,1JNE NEXT5DISP '-';若果结果为负数输出负号NEXT5:CALL PRINTPOP DXPOP CXPOP BXPOP AXENDMDATAS SEGMENTSTR DB0AH,0DH,'$'STR0 DB'please input arithmetic expressions:',0AH,0DH,'$' STR2 DB'the num is unexpected,input again:',0AH,0DH,'$' BUF0 DW?BUF1 DW?FLAG DB 0OPER DB?COUNT D B 0DATAS ENDSSTACKS SEGMENTDW256 DUP(?) ;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV DI,OFFSET STR0DISPL DIINPUTMOV AH,4CHINT 21H;-----------显示函数--------PRINT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,0 ;记录有效数字位数MOV BX,10 ;除10取余MOV AX,BUF0LAST:MOV DX,0DIV BXPUSH DXINC CXCMP AX,0JNZ LASTAGE:POP DX ;出栈输出OR DX,30HMOV AH,2INT 21HLOOP AGEPOP DXPOP CXPOP BXPOP AXRETPRINT ENDPCODES ENDSEND STARTDISP MACRO V ARMOV AH,2MOV DL,V ARINT 21HENDMDATAS SEGMENTDATA0 DB'PLEASE INPUT A NUMBER(0-999):','$'DATA1 DB' over flow input again:','$'DATA2 DB'PLEASE INPUT ANOTHER NUMBER(EXP:123)','$' DATA3 DB'PLEASE INPUT AN OPREATOR:','$'DATA4 DB'THE OPERATOR IS WRONG,INPUT AGAIN:','$' OPER DB?FLAG DB 0FLAG1 DB 0DATA DW 3 DUP(?)DATAS ENDSSTACKS SEGMENTDW 256 DUP(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV DI,OFFSET DATA0 ;提示信息CALL DISPLMOV SI,0 ;SI作为数组下标CALL INPUTCALL NEWLINEMOV DI,OFFSET DATA3 ;提示信息CALL DISPLAGAIN:MOV AH,1 ;1号功能输入四则运算符INT 21HCMP AL,'+';判断输入的是不是+,-,*,/ JE NEXT0CMP AL,'-'JE NEXT0CMP AL,'*'JE NEXT0CMP AL,'/'JE NEXT0CALL NEWLINE ;输入的运算符不合法,重新输入MOV DI, OFFSET DATA4CALL DISPLJMP AGAINNEXT0:MOV OPER,AL ;保存运算符CALL NEWLINEMOV DI,OFFSET DATA2 ;输入第二个操作数MOV SI,2CALL INPUTMOV AX,DATA[0]MOV BX,DATA[2]CMP OPER,'+';判断是那种操作,进行运算JE NEXT1CMP OPER,'-'JE NEXT2CMP OPER,'*'JE NEXT3CMP OPER,'/'JE NEXT4NEXT1: ;加法运算CLCADC AX,BXJNC N1MOV FLAG,1 ;判断是否进位N1: MOV DATA[4],AX ;运算结果放入内存JMP OUTPUTNEXT2: ;减法运算CLCSBB AX,BXJNC N2MOV FLAG,1 ;判断是否借位NEG AXN2: MOV DATA[4],AX ;运算结果放入内存JMP OUTPUTNEXT3: ;乘法运算CLCMOV DX,0MUL BXMOV DATA[4],AX ;运算结果放入内存JMP OUTPUTNEXT4: ;除法运算CLCMOV DX,0CMP BX,0JNZ N4 ;判断除数是否为0CALL NEWLINECALL ERRORCALL NEWLINEMOV DI,OFFSET DATA2MOV SI,2CALL INPUTJMP NEXT4N4: DIV BXMOV DATA[4],AX ;运算结果放入内存OUTPUT:CALL NEWLINEMOV DI,0 ;输出第一个操作数CALL PRINTDISP OPER ;输出运算符MOV DI,2CALL PRINT ;输出第二个操作数DISP '='CMP FLAG,1JNZ N EXT5DISP '-'NEXT5:MOV DI,4CALL PRINT ;输出结果MOV AH,4CHINT 21H;-----------输入函数------------INPUT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV BX,0 ;BX存放十进制数CLCMOV DX,0L0:;----------输入数字----------MOV AH,1 ;判断数字是否合法INT 21HCMP AL,0DHJE L2SUB AL,30HJL L1JG L1;---------转换成十进制数-------MOV AH,0 ;转换成10进制数放入内存XCHG AX,BXMOV CX,10MUL CXADD AX,BXJC L1XCHG AX,BXJMP L0L1:MOV DX,0MOV BX,0CALL NEWLINECALL ERRORJMP L0L2:CMP DX,0JNZ L1MOV DATA[SI],BXMOV DX,0POP DXPOP CXPOP BXPOP AXRETINPUT ENDP;--------------提示信息------------DISPL PROC NEARMOV AH,9MOV DX,DIINT 21HRETDISPL ENDP;-------回车换行--------NEWLINE PROC NEARPUSH AXPUSH DXMOV DL,0AHINT 21HMOV DL,0DHMOV AH,2INT 21HPOP DXPOP AXRETNEWLINE ENDP;----------错误提示---------------- ERROR PROC NEARPUSH AXPUSH DXMOV DX,OFFSET DATA1MOV AH,9INT 21HPOP DXPOP AXRETERROR ENDP;-----------显示函数--------PRINT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,0MOV BX,10MOV AX,DATA[DI]LAST:MOV DX,0 ;除10压栈DIV BXPUSH DXINC CXCMP AX,0JNZ LASTAGE:POP DX ;出栈输出OR DX,30HMOV AH,2INT 21HLOOP AGEPOP DXPOP CXPOP BXPOP AXRETPRINT ENDP CODES ENDSEND START。

汇编语言课程设计_四则运算计算器设计

汇编语言课程设计_四则运算计算器设计

目录1 设计目的 (1)2 概要设计 (1)2.1 系统总体分析 (1)2.2 主模块框图及说明 (2)3 详细设计 (3)3.1 主模块及子模块说明 (3)3.2 各模块详细设计 (3)3.2.1 判定运算符模块设计 (3)3.2.2取运算数模块 (3)3.2.3计算模块 (4)3.2.4结果处理模块 (5)3.2.5输出模块 (5)3.2.6错误处理模块 (6)4 程序调试 (7)4.1 运行界面分析 (7)4.2 调试过程及分析 (7)5 心得体会 (8)5.1 设计体会 (8)5.2 系统改进 (8)参考文献 (10)附录 (11)实现加减乘除四则运算的计算器1 设计目的汇编语言是继机器语言后出现的计算机程序设计语言,是计算机所能提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特征并能够直接控制硬件的惟一语言。

因而了解之一语言的特性,并熟练掌握这一语言并应用于开发中便是计算机专业学生所必需掌握的技能之一。

本课程设计通过加减乘除四则运算计算器的设计,增强对于汇编语言寄存器、指令、伪指令、中断等的理解。

可通过编写的汇编程序完成基本的加减乘除四则运算。

主要功能:能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:C:\tasm>js 3+252 概要设计2.1 系统总体分析四则运算计算器应当实现对用户输入表达式的处理。

根据用户输入的表达式,完成加减乘除四则运算。

程序自动判定表达式输入,并完成对于输入的16进制数的转换,同时计算结果并以10进制数输出。

对于异常情况程序应当进行处理,保证程序的正确运行。

设计一个计算器,在DOS界面下输入<程序名> <表达式>可直接输出运算结果。

例如在DOS界面中输入JS 3+6,可直接输出9。

程序接受16进制数输入,以十进制数输出运算结果。

对于输出错误情况,程序自动给出错误提示,若输入的格式有误,程序给出“JS <Expression> [10]”(即输入样例)提示,若输入的表达式有误,程序给出“Error in expression !”(即表达式错误)提示。

四则运算的实现

四则运算的实现

四则运算的实现在数学运算中,四则运算是最基本也是最常见的运算之一。

它包括加法、减法、乘法和除法四种运算方式。

在计算机科学领域,实现四则运算是编程语言中一个非常基础和核心的功能。

本文将介绍四则运算的实现原理及其在计算机编程中的应用。

一、加法运算的实现加法运算是最简单的运算之一,通常用符号“+”表示。

在编程中,实现两个数的加法运算可以通过以下步骤:1. 输入两个待加数。

2. 将两个数相加得到和。

3. 输出和作为运算结果。

以下是一个示例代码,演示了如何实现加法运算:```pythona = int(input("请输入第一个数:"))b = int(input("请输入第二个数:"))sum = a + bprint("两数之和为:", sum)```二、减法运算的实现减法运算是在两个数之间进行相减的操作,通常用符号“-”表示。

在编程中,实现两个数的减法运算可以通过以下步骤:1. 输入被减数和减数。

2. 将被减数减去减数得到差。

3. 输出差作为运算结果。

以下是一个示例代码,演示了如何实现减法运算:```pythona = int(input("请输入被减数:"))b = int(input("请输入减数:"))difference = a - bprint("两数之差为:", difference)```三、乘法运算的实现乘法运算是将两个数相乘的操作,通常用符号“×”表示。

在编程中,实现两个数的乘法运算可以通过以下步骤:1. 输入两个待乘数。

2. 将两个数相乘得到积。

3. 输出积作为运算结果。

以下是一个示例代码,演示了如何实现乘法运算:```pythona = int(input("请输入第一个数:"))b = int(input("请输入第二个数:"))product = a * bprint("两数之积为:", product)```四、除法运算的实现除法运算是将被除数除以除数的操作,通常用符号“÷”表示。

四则运算

四则运算

实验一、四则运算一、实验目的1.熟悉汇编语言上机操作的过程。

2.熟悉DEBUG程序对程序进行调试。

3.熟悉汇编语言源程序的框架结构。

二、实验内容无符号数的加,减,乘,除四则运算练习,采用寄存器寻址。

编程,顺序执行32位加法,32位减法,16位乘以16位乘法,32位除以16位除法。

注意程序的标准结构语句。

三、实验源程序DA TA SEGMENTA DW 1234H,5678H ;被加数B DW 0FEDCH,0123AH ;加数C DW 2 DUP(?) ;和数(预留)AD DW 0FEDCH,0BA98H ;被减数BD DW 1234H,789AH ;减数CD DW 2 DUP(?) ;差A1 DW 0D687H ;被乘数B1 DW 0012H ;乘数C1 DW 2 DUP(?) ;积A2 DW 5678H,0234H ;被除数B2 DW 0F234H ;除数C2 DW 2 DUP(?) ;商DA TA ENDSSTACK SEGMENT PARA STACK ‘STACK’DB 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE, DS:DA TA, SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DA TA ;标准序MOV AX,AADD AX,BMOV C,AXMOV AX,A+2ADC AX,B+2MOV C+2,AX;32位加法MOV AX,ADSUB AX,BDMOV CD,AXMOV AD,AX+2SBB AX,BD+2MOV CD+2,AX;32位减法MOV AX,A1MUL B1MOV C1,AXMOV C1+2,DX;16位乘以16位MOV AX,A2MOV DX,A2+2DIV B2MOV C2,AXMOV C2+2,DX;32位除以16位RETSTART ENDPCODE ENDSEND START四、实验要求1.调用一个编辑软件键入源程序。

汇编语言四则运算

汇编语言四则运算

《微机原理与接口技术》课程设计电气与自动化工程系 通信工程2010-12-28院 系: 专 业: 年级班级: 学 号: 姓 名: 指导教师: 设计日期:一、课程设计目的每个同学在1-2周时间内,用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。

二、课程设计要求从键盘上输入数字参与运算,并在屏幕上显示结果,至少实现加法减法运算。

三、课题分析该程序设计的关键是要根据四则运算中()、*、/、+、-、= 的优先级设置符号的权值,其中(、*、/、+、-、)、= 的权值分别设置为5、4、4、3、3、1、0 ,然后根据权值的大小进行运算。

程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。

程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。

需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/ 及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘ +、-’运算符及紧跟着的权值,然后按照+、- 运算符的左右顺序从左到右进行‘ +、- ’运算,当最后遇到等号‘ = ’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。

四、流程图五、程序源代码DATAS SEGMENT STR1 DB 0AH,0DH,'@******************************************@$' STR2 DB 0AH,0DH,'@* *@$' STR3 DB 0AH,0DH,'@* Welcome you ! *@$' STR4 DB 0AH,0DH,'@* This is programe of sizeyunsuan *@$' STR5 DB 0AH,0DH,'@* Rang(-32768 to 32767) *@$' STR6 DB 0AH,0DH,'@* JikeB082 Hanyou 200807014225 *@$' STR7 DB 0AH,0DH,'@* *@$' STR8 DB 0AH,0DH,'@******************************************@$' MESG DB 0AH,0DH,'Do you want to continue? (y/n) $' SIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 NUMB DW 20 DUP (0) ;保存输入的数值 MARK DB 'M' ;保存输入的运算符 DB 10 DUP (0) ERROR DB 'YOUR INPUT IS WRONG$' DATAS ENDS DISP MACRO STR LEA DX,STR MOV AH,9 INT 21H ENDM CHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值 CMP AL,ASC JNE OTH &HAO MOV CH,H JMP OTH7 ENDM CODES SEGMENT ASSUME CS:CODES,DS:DATAS START :CALL CLEAR MOV AX,DATAS MOV DS,AX LEA DI,NUMB LEA SI,MARK DISP STR1 DISP STR2 DISP STR3 DISP STR4 DISP STR5DISP STR6 DISP STR7 DISP STR8 CALL CR MOV AX,0 MOV BX,0 MOV CX,0 MOV DX,0 START1: CALL CR INPUT: MOV AH,1 INT 21H CMP AL,'=' JE PD ;是等号,进一步判断输入括号是否配对 CMP AL,28H JB INPUT CMP AL,39H JA INPUT CMP AL,2FH ;判断是数字还是符号 JBE JUD ;是符号转入响应操作 INC WORD PTR SIGN1 ;将数字标志位加1 SUB AL,30H ;将ASCII 码转16进制 MOV AH,0XCHG AX,[DI]MUL BXMOV BX,10XCHG AX,[DI]ADD [DI],AXJMP INPUTPD: CMP WORD PTR SIGN2,0 ;判断配对标志位JE JUDJMP BCJUD:CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位JE FUHADD DI,2MOV WORD PTR SIGN1,0 ;将数字标志位复0FUH:CALL ADVANCE ;设定优先级CMP CH,5 ;判断输入的符号是否是左括号JNE PY ;不是则判断输入的是否是右括号INC WORD PTR SIGN2 ;是左括号,括号标志位加1PY:CMP CH,1 ;判断输入的是否是右括号JNE AGAINDEC WORD PTR SIGN2 ;是右括号,括号标志位减1AGAIN:CMP BYTE PTR[SI],'M';判断运算符存储区是否为空如23*56-(8*19)/6+67-8=1322JE SAVECMP CH,[SI] ;[SI]的内容为前一个符号或其权值JA SAVECMP BYTE PTR[SI],'('JNE YIDODEC SIJMP INPUTYIDO:DEC SIMOV CL,[SI]CALL MATCH ;判断是什么运算符并进行相应的计算JMP AGAINSAVE:CMP CH,0 ;判断是否是等号JE OUTPUTCMP CH,1JE INPUT ;“)”不保存,输入下一个数INC SIMOV [SI],AL ;保存符号INC SICMP CH,5 ;判断是否是左括号JNE GO_ONMOV CH,2 ;改变(的权值GO_ON:MOV [SI],CH ;紧跟着保存符号的权值JMP INPUTBC: LEA DX,ERRORMOV AH,9INT 21HJMP J_SHUMATCH PROC NEAR ;子程序,进行相应的运算PUSH AXXOR AX,AXXOR BX,BXCMP CL,2AH ;乘法运算 JNE NEXT1SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXMOV [DI],AXADD DI,2JMP FINISHNEXT1:CMP CL,2FH ;除法运算 JNE NEXT2SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXMOV [DI],AXADD DI,2JMP FINISHNEXT2:CMP CL,2BH ;加法运算 JNE NEXT3SUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISHNEXT3:CMP CL,2DH ;减法运算 JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH:POP AXRETMATCH ENDPADVANCE PROCCHOICE 28H,1,5 ;(OTH1:CHOICE 29H,2,1 ;)OTH2:CHOICE 2AH,3,4 ;*OTH3:CHOICE 2FH,4,4 ;/OTH4:CHOICE 2BH,5,3 ;+OTH5:CHOICE 2DH,6,3 ;-OTH6:CHOICE 3DH,7,0 ;=OTH7:RETADVANCE ENDP CLEAR PROC NEAR ;清屏PUSH AXPUSH BXPUSH CXPUSH DXMOV AX,0600HMOV BH,0FHMOV CX,0MOV DX,184FHINT 10HPOP AXPOP BXPOP CXPOP DXRETCLEAR ENDPCR PROC NEAR ;回车换行PUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21HMOV AH,2MOV DL,0AHINT 21HPOP DXPOP AXRETCR ENDPOUTPUT: ;输出运算结果SUB DI,2CMP WORD PTR[DI],0JGE W1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21HW1: MOV BX,10000MOV CX,5MOV SI,0W2: MOV AX,[DI]CWDDIV BXMOV [DI],DXCMP AL,0JNE W3CMP SI,0JNE W3CMP CX,1JE W3JMP W4W3: MOV DL,ALADD DL,30HMOV AH,2INT 21HMOV SI,1W4: MOV AX,BXMOV DX,0MOV BX,10DIV BXMOV BX,AX LOOP W2CALL CR DISP MESGMOV AH,1INT 21HCMP AL,'n'JE J_SHUCMP AL,'N'JE J_SHUMOV WORD PTR[DI+2],0 CALL CRLEA DI,NUMBLEA SI,MARKJMP START1J_SHU:MOV AH,4CHINT 21HCODES ENDSEND START六、结果显示七、感想、收获及体会学习汇编语言:大一学习的是C语言,因此,在学汇编语言之初,面对格式之类的感觉很不适应。

汇编大作业(四则运算器含代码)

汇编大作业(四则运算器含代码)

汇编程序大作业云南大学软件学院实验报告指导教师 (签名):实验内容:1.设计一个功能完善的四则运算器:①程序有友好的运行界面;②可以方便的输入输出2,10,16进制数据(要求可以处理4位的数据);③可以方便的对数据进行四则运算;④要求程序能够处理基本的错误信息;⑤程序要求菜单控制;⑥其他程序简介:该程序采用了主程序、子程序、宏相结合的编写方式,通过主程序调用了加、减、乘、除的子程序,在这四个子程序中有分别调用了二、十、十六进制输入输出、进制间转化的子程序。

在数值转化为ASCII码的部分,定义了宏进行调整输出。

程序实现了16位的二进制、4位的十进制、4位的十六进制的加、减、乘、除运算,并可以通过用户的选择将其转化为其他相应的进制。

其中乘法运算的进制转化功能尚不完善,当运算结果超过4位时不能正确的将结果进行输出并进行进制转化。

子过程:addition:加法部分subtraction:减法部分multiplication:乘法部分division:除法部分b_in:二进制输入hd_in:十六进制、十进制输入b_out:二进制输出btod:二进制转化十进制并输出both:二进制转化十六进制并输出宏:btth:将数值转化为ASCII码保存算法说明:二进制计算时,要求输入0和1,从高到低为输入,将先输进的数*2+后输入的数,保存到寄存器中,如 1011则按((1*2+0)*2+1)*2+1十进制计算时,要求输入0-9的整数,从高到低输入,将先输进的数*10+后输进的数,保存到寄存器中,如9817 则按((9*10+8)*10+1)*10+7十进制计算时,要求输入0-F的整数,从高到低输入,将先输进的数*10H+后输进的数,保存到寄存器中,如AD17 则按((A*10H+D)*10H+1)*10H+7通过add、sub、mul、div等汇编指令进行计算。

二进制输出,从高位到低位按位依次保存到dl中,加30h后输出十进制输出,将结果分别除以10000、(上一步余数除)1000、(上一步余数除)100、(上一步余数除)10将商分别加30h后输出,将最后的余数加上30h后输出十六进制输出,从高到低每四位依次输出与9比较,大于9加37h调整,小于9加30h 调整程序流程及实验结果:主程序部分:提示用户进行运算符号的选择,并进行子程序部分的调用四则运算部分流程:四则运算的加、减、乘、除四部分子程序的流程大致相同,此处采用同一个流程图表示,该部分提示用户进行进制选择,跳转的相应位置并进行相应的运算,调用输入输出子程序,对结果进行进制转化二进制输入流程:该部分进行二进制数的输入,通过移位将先输入的数保存到高位,后输入的数保存到低位,将最终结果保存到bx中二进制输出:该部分将运算结果以2进制的形式输出,通过加30h将数值转化为ASCII码输出十、十六进制数的输入该部分实现十及十六进制数的输入,将最终结果保存到bx中;二进制转十进制并输出该部分通过将得到的二进制数求商取余的方式将最高位的取到商中并输出;二进制转十六进制:该部分通过移位的方式将二进制数转化为16进制输出,其中判断了所输出值与9的大小关系,大于9则加37h调整,小于9则加30h调整加法部分:二进制加法,并将结果转化为10进制二进制加法,并将结果转化为16进制:十进制加法,并将结果转化为二进制:十进制加法,并将结果转化为16进制:十六进制加法,并将结果转化为二进制:十六进制加法,并将结果转化为十进制减法部分:二进制减法,并将结果转化为十进制输出:二进制减法并将结果转化为十六进制输出:十进制减法,并将结果转化为二进制输出:十进制减法,并将结果转化为十六进制输出:十六进制减法,并将结果转化为二进制输出:十六进制减法,并将结果转化为10进制输出:乘法部分:二进制乘法,并结果转化为10进制输出:二进制乘法并将结果转化为16进制输出:十进制乘法并将结果转化为二进制输出十进制乘法,并将结果转化为16进制输出:十六进制乘法,并将结果转化为二进制输出:十六进制乘法,并将结果转化为十进制输出:除法部分:二进制除法,并将结果转化为十进制输出:二进制除法,并将结果转化为16进制输出:十进制除法,并将结果转化为二进制输出:十进制除法,并将结果转化为16进制输出:十六进制除法,并将结果转化为二进制输出:十六进制除法,并将结果转化为10进制输出:代码:data segmentnote1 db 'Input a-->add,b-->sub,c-->mul,d--div',0ah,0dh,'$'note2 db 0ah,0dh,'Input a-->binary,b-->decimal,c--hexadecimal',0ah,0dh,'$' note3 db 0ah,0dh,'Input addend' ,0ah,0dh,'$'note4 db 0ah,0dh,'Input another addend', 0ah,0dh,'$'note5 db 0ah,0dh,'The answer is',0ah,0dh,'$'note6 db 0ah,0dh,'Change the answer to a-->decimal,b-->hexadecimal,any other key-->exit',0ah,0dh,'$'note7 db 0ah,0dh,'Change the answer to a-->binary,b-->hexadecimal,any other key-->exit',0ah,0dh,'$'note8 db 0ah,0dh,'Change the answer to a-->binary,b-->decimal,any other key-->exit',0ah,0dh,'$'note9 db 0ah,0dh,'Input minuend', 0ah,0dh,'$'note10 db 0ah,0dh,'Input subtrahend', 0ah,0dh,'$'note11 db 0ah,0dh,'Input multiplicand' ,0ah,0dh,'$'note12 db 0ah,0dh,'Input another multiplicand' ,0ah,0dh,'$'note13 db 0ah,0dh,'Input dividend', 0ah,0dh,'$'note14 db 0ah,0dh,'Input divisor', 0ah,0dh,'$'num dw 0num1 dw 0num2 dw 0sig db ?data endscode segmentassume ds:data,cs:codestart:mov ax,datamov ds,axlea dx,note1mov ah,09hint 21hm1:mov ah,01hint 21hcmp al,'a'je adcmp al,'b'je subtcmp al,'c'je multcmp al,'d'je divijmp m1ad:call additionjmp over计算机组成原理与汇编语言程序设计(2013)subt:call subtractionjmp overmult:call multiplicationjmp overdivi:call divisionover:mov ah,01hint 21hmov ah,4chint 21haddition proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_addcmp al,'b'je d_addcmp al,'c'je h_addjmp a_endb_add:lea dx,note3mov ah,09hint 21hcall b_inmov num,bxlea dx,note4mov ah,09hint 21hcall b_inlea dx,note5mov ah,09hint 21hmov ax,numadd bx,axcall b_out;此处存在bug,若产生进位不能进行输出,需提示用户只进行15位的运算lea dx,note6mov ah,09hint 21hmov ah,01h计算机组成原理与汇编语言程序设计(2013)int 21hcmp al,'a'je btdcmp al,'b'je bthjmp a_endbtd:lea dx,note5mov ah,09hint 21hcall btodjmp a_endbth:lea dx,note5mov ah,09hint 21hcall btohjmp a_endd_add:lea dx,note3mov ah,09hint 21hcall hd_inmov num,bxlea dx,note4mov ah,09hint 21hcall hd_inmov ax,numadd bx,axpush bxlea dx,note5mov ah,09hint 21hcall btodlea dx,note7mov ah,09hint 21hmov ah,01int 21hcmp al,'a'je dtbcmp al,'b'je dthjmp a_enddtb:lea dx,note5mov ah,09h计算机组成原理与汇编语言程序设计(2013)int 21hpop bxcall b_outjmp a_enddth:lea dx,note5mov ah,09hint 21hpop bxcall btohjmp a_endh_add:lea dx,note3mov ah,09hint 21hcall hd_inmov num,bxlea dx,note4mov ah,09hint 21hcall hd_inmov ax,numadd bx,axlea dx,note5mov ah,09hint 21hcall btoh;此处存在bug,当产生进位是,不能对进位进行输出lea dx,note8mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je htbcmp al,'b'je htdjmp a_endhtb:lea dx,note5mov ah,09hint 21hcall b_outjmp a_endhtd:lea dx,note5mov ah,09hint 21hcall btod计算机组成原理与汇编语言程序设计(2013)jmp a_enda_end:retaddition endpsubtraction proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_subcmp al,'b'je d_subcmp al,'c'je h_subjmp s_endb_sub:lea dx,note9mov ah,09hint 21hcall b_inmov num,bxlea dx,note10mov ah,09hint 21hcall b_inmov ax,numxchg ax,bxsub bx,axlea dx,note5mov ah,09hint 21hcall b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je btdcmp al,'b'je bthjmp s_end计算机组成原理与汇编语言程序设计(2013)d_sub:lea dx,note9mov ah,09hint 21hcall hd_inmov num,bxlea dx,note10mov ah,09hint 21hcall hd_inmov ax,numxchg ax,bxsub bx,axpush bxlea dx,note5mov ah,09hint 21hcall btodlea dx,note7mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je dtbcmp al,'b'je dthjmp s_endh_sub:lea dx,note9mov ah,09hint 21hcall hd_inmov num,bxlea dx,note10mov ah,09hint 21hcall hd_inmov ax,numxchg ax,bxsub bx,axlea dx,note5mov ah,09hint 21hcall btohlea dx,note8计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je htbcmp al,'b'je htdjmp s_ends_end:retsubtraction endpmultiplication proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_mulcmp al,'b'je d_mulcmp al,'c'je h_mulb_mul:lea dx,note11mov ah,09hint 21hcall b_inmov num,bxlea dx,note12mov ah,09hint 21hcall b_inmov ax,nummul bxmov num1,dxmov num2,axlea dx,note5mov ah,09hint 21hmov num1,dxmov bx,dxcall b_out计算机组成原理与汇编语言程序设计(2013)mov ax,num2mov bx,axcall b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_btdcmp al,'b'je m_bthjmp m_endm_btd:lea dx,note5;此处错误,尚需修改mov ah,09hint 21hmov dx,num1mov bx,dxcall btodmov ax,num2mov bx,axcall btodjmp m_endm_bth:lea dx,note5mov ah,09hint 21hmov dx,num1mov bx,dxcall btohmov ax,num2mov bx,axcall btohd_mul:lea dx,note11mov ah,09hint 21hcall hd_inmov num,bxlea dx,note12mov ah,09hint 21hcall hd_inmov ax,nummul bxpush ax计算机组成原理与汇编语言程序设计(2013)lea dx,note5mov ah,09hint 21hpop axpush axmov bx,axcall btodlea dx,note7mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_dtbcmp al,'b'je m_dthm_dtb:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall b_outjmp m_endm_dth:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall btohh_mul:lea dx,note11mov ah,09hint 21hcall hd_inmov num,bxlea dx,note12mov ah,09hint 21hcall hd_inmov ax,nummul bxpush axlea dx,note5mov ah,09hint 21h计算机组成原理与汇编语言程序设计(2013)pop axpush axmov bx,axcall btohlea dx,note8mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_htbcmp al,'b'je m_htdm_htb:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall b_outjmp m_endm_htd:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall btodm_end:retmultiplication endpdivision proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_divcmp al,'b'je d_divcmp al,'c'je h_divjmp d_endb_div:lea dx,note13计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hcall b_inmov num,bxlea dx,note14mov ah,09hint 21hcall b_inmov ax,numcwdxor dx,dxdiv bxmov num1,axmov num2,dxlea dx,note5mov ah,09hint 21hmov bx,num1call b_outmov cx,6l:mov dl,'.'mov ah,02hint 21hloop lmov bx,num2call b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je d_btdcmp al,'b'je d_bthjmp d_endd_btd:lea dx,note5mov ah,09hint 21hmov bx,num1call btodmov cx,6l4:mov dl,'.'mov ah,02hloop l4mov bx,num2 call btodjmp d_endd_bth:lea dx,note5 mov ah,09hint 21hmov bx,num1 call btohmov cx,6l5:mov dl,'.'mov ah,02hint 21hloop l5mov bx,num2 call btohjmp d_endd_div:lea dx,note13 mov ah,09hint 21hcall hd_inmov num,bxlea dx,note14 mov ah,09hint 21hcall hd_inmov ax,numcwdxor dx,dxdiv bxmov num1,ax mov num2,dx lea dx,note5 mov ah,09hint 21hmov bx,num1 call btodmov cx,6l2:mov dl,'.'mov ah,02hint 21hloop l2mov bx,num2lea dx,note7 mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je d_dtbcmp al,'b'je d_dthjmp d_endd_dtb:lea dx,note5 mov ah,09hint 21hmov bx,num1 call b_outmov cx,6l6:mov dl,'.'mov ah,02hint 21hloop l6mov bx,num2 call b_outjmp d_endd_dth:lea dx,note5 mov ah,09hint 21hmov bx,num1 call btohmov cx,6l7:mov dl,'.'mov ah,02hint 21hloop l7mov bx,num2 call btohjmp d_endh_div:lea dx,note13 mov ah,09hint 21hcall hd_inmov num,bxlea dx,note14 mov ah,09hcall hd_in mov ax,num cwdxor dx,dxdiv bxmov num1,ax mov num2,dx lea dx,note5 mov ah,09h int 21hmov bx,num1 call btohmov cx,6l3:mov dl,'.' mov ah,02h int 21hloop l3mov bx,num2 call btohlea dx,note8 mov ah,09h int 21hmov ah,01h int 21hcmp al,'a' je d_htbcmp al,'b' je d_htdjmp d_endd_htb:lea dx,note5 mov ah,09h int 21hmov bx,num1 call b_out mov cx,6l8:mov dl,'.' mov ah,02h int 21hloop l8mov bx,num2 call b_out jmp d_endd_htd:lea dx,note5计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hmov bx,num1call btodmov cx,6l9:mov dl,'.'mov ah,02hint 21hloop l9mov bx,num2call btodjmp d_endd_end:retdivision endpb_in procxor dx,dxmov bx,2mov cx,16bin2:mov ah,1int 21hxor ah,ahsub al,30hadd dx,axmov ax,dxcmp cx,1je bin1mul bxbin1:mov dx,axloop bin2mov bx,dxretb_in endpb_out procmov ch,8mov cl,1mov dh,bhbot1:rol dx,cland dl,01hadd dl,30hmov ah,02hint 21hdec chja bot1mov ch,8mov dh,bl bot2:rol dx,cland dl,01h add dl,30h mov ah,02h int 21hdec chcmp ch,0ja bot2retb_out endpbtth macroand dx,0div bxmov cx,dxadd al,30h mov dl,almov ah,02h int 21hmov ax,cx endmbtod procmov ax,bxmov bx,10000 btthmov bx,1000 btthmov bx,100 btthmov bx,10btthadd al,30h mov dl,almov ah,02h int 21hretbtod endpbtoh procxor dx,dxmov cl,4mov dh,bh bth1:rol dx,cl cmp dl,9ja bth3add dl,30h jmp bth4 bth3:add dl,37h bth4:mov ah,2int 21hxor dl,dl dec chcmp ch,0ja bth1mov dh,bl mov ch,2mov cl,4 bth2:rol dx,cl cmp dl,9ja bth5add dl,30h jmp bth6 bth5:add dl,37h bth6:mov ah,2int 21hxor dl,dl dec chcmp ch,0ja bth2retbtoh endphd_in procxor dx,dx cmp sig,'c' jne din3mov bx,16 jmp din4 din3:mov bx,10 din4:mov cx,4 din1:mov ah,01h int 21hxor ah,ahja hin1 sub al,30h jmp hin2 hin1:sub al,37h hin2:add dx,ax mov ax,dx cmp cx,1 je din2mul bxdin2:mov dx,ax loop din1 mov bx,dx rethd_in endpcode ends end start。

四则运算

四则运算

四则运算1 课程设计的目的在我们生活中无时无刻不要用到四则运算,虽说四则运算并不是很麻烦,但有的时候复杂的数学四则运算仍需要要花费我们大量的时间去解决,所以要有这样一个程序区解决这个问题。

基于这样的一个目的,在这个学期中,我们又接触到了汇编语言,运用汇编语言编写了计算四则运算程序,来解决这个实际并且常遇到的问题。

该程序主要针对加减乘除运算,可以进行相对复杂的问题,包含括号的相关运算。

该问题主要注意四则运算的优先级问题:乘除运算比加减运算优先级高,同级运算按从左到右的顺序运算,含有括号时应该先计算括号里面的内容。

本程序应采用模块化设计方法,设计几个功能模块。

可以判断括号是否匹配,输入数据是否已经结束,从键盘输入的是否为数字,还设计了一个友好的主菜单,显示出该程序的主要功能。

2 设计方案论证2.1开发环境汇编语言,是面向机器的程序设计语言,汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。

汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。

面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。

它不仅保持了机器语言的优点,具有直接和简捷的特点。

还可以可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。

目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。

汇编语言还经常与高级语言配合使用,应用十分广泛。

汇编语言的开发环境需要TE.EXE编辑软件,主要是进行源程序的编写,汇编软件MASM.EXE,主要作用是对源程序的汇编,调试软件Debug.exe,作用是可执行软件进行调试。

用LINK命令对生成的OBJ文件进行连接可以生成可以执行的EXE文件。

一个汇编程序的编译首先先进入它的根目录,用cd masm 命令进入它的根目录,用masm命令进入根目录,并且生成obj文件,用link命令对程序进行连接,同时生成exe可执行文件,生成可执行文件后,用debug命令对程序进行调试,运用U命令进行反汇编,运用T命令进行单步的执行,等等其他汇编命令。

四则运算解析及计算

四则运算解析及计算

四则运算解析及计算四则运算是中缀表达式,需要将其转化为后缀表达式。

原因是计算中缀表达式很困难。

明确运算符的优先级:优先级(数字越⼤,优先级越⾼)运算符2+-1*/0()格式化四则表达式输⼊的表达式可能出现⽆⽤的字符,需要去除否则影响下⾯的判断逻辑。

处理⽅法为,遍历整个字符串,删除换⾏、空格和制表符。

后缀表达式转化中缀表达式转化为后缀表达式的基本步骤如下:1.初始化⼀个运算符栈。

2.从输⼊的表达式的字符串中依次从左向右每次读取⼀个字符。

3.如果当前读取的字符是操作数,则直接填写到后缀表达式中 (如果后缀表达式末尾已经有操作数,需要使⽤逗号分隔开)。

4.如果当前字符是“(”左括号,将其压⼊运算符栈。

5.如果当前字符为运算符,则分三种情况:(1)当前运算符栈为空,将其压⼊运算符栈。

(2)当前运算符的优先级⼤于栈顶元素,则将此运算符压⼊运算符栈;否则,弹出栈顶的运算符到后缀表达式,反复弹出,直到该运算符优先级⼤于栈顶元素或者栈为空时,然后将当前运算符压栈。

回到步骤2继续读取。

(3)如果上⼀次读到的也是运算符,则中缀表达式错误直接返回6.如果当前字符是“)”右括号,反复将栈顶元素弹出到后缀表达式,直到栈顶元素是左括号“(”为⽌,并将左括号从栈中弹出丢弃。

如果找不到“(”则中缀表达式错误直接返回7.如果读取还未完成,回到步骤2.8.如果读取完成,则将栈中剩余的运算符依次弹出到后缀表达式。

※如果表达式中出现负数或者⼩数,需对负数和⼩数点采取特殊处理:(1)如果是负数,需要把“-”⼀起存放到后缀表达式中同时还要添加⼀个特殊字符“!”⽤于标记负数。

两种情况下出现“-”可判定为负数。

A.“-”为⾸字符且下⼀个字符为数字;B.“-”为⾮⾸字符且位于“(”之后且后⼀个字符为数字;(2)如果有⼩数,需要记录⼩数点的位数举例:输⼊的四则表达式是 -15. *((-5+.6)*87-(-4.592+3.33)*8)处理后的后缀表达式为:!-15.,!-5,.6,+87,*!-4.592,3.33,+8,*-*后缀表达式求值:从左到右读取1、设置⼀个栈,开始时,栈为空;2、然后从左到右读取后缀表达式,若遇操作数,则进栈;3、若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕;4、最后,栈中仅有⼀个元素,即为运算的结果。

汇编语言-四则运算1

汇编语言-四则运算1

华北科技学院课程设计说明书专业:网络工程课程名称:汇编课程设计班级:姓名:学号:设计题目: 四则运算设计时间: 2011-12-05 至2011-12-16评语: ________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:_____一、问题陈述及其需求分析问题要求:利用汇编语言编写四则运算的基本方法。

内容:从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。

并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。

四则运算主要包括以下几个模块:(1)主程序模块.(2)赋权宏模块.(3)加减乘除运算子程序模块.(4)调用赋权宏子程序模块.(5)清屏子程序模块.(6)回车换行宏模块.(7)9号功能显示字符串宏模块.二、总体设计程序设计组成框图程序设计流程图三、详细设计算法说明1.主程序模块.主程序模块首先实现调用子程序clear清屏,初始化数据段,加载附加段,调用显示宏show 显示界面,将寄存器ax,bx,cx,dx初始化赋初值为0,调用回车换行宏,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.2.赋权宏模块.通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.3.加减乘除运算子程序模块.运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.4.调用赋权宏子程序模块.该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.5.清屏子程序模块.本模块先将即将用到的ax,bx,cx,dx寄存器入栈保存,通过ah=06h屏幕上卷功能,用bh=07h 将屏幕设置为黑底白字格式,给dh,dl赋值将其清屏位置设定在30行80列范围.从而实现了清屏功能,然后再将ax,bx,cx,dx寄存器出栈.6.回车换行宏模块.通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.7.9号功能显示字符串宏模块.通过定义宏show,用9号显示功能,通过变元str将字符串显示出来.四、编码和测试1.程序运行结果主界面如图所示。

汇编语言课程设计四则运算

汇编语言课程设计四则运算

计算机与信息工程学院《汇编语言》课程设计四则运算器的设计专业:计算机科学与技术班级:控制11-2班姓名: 倪天天学号:45指导教师:郝维来2013年6月28日摘要计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。

想要用汇编语言实现简单的计算器,就必须通过对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识进行运用,以实现一个基本功能完善,界面友好,操作简便易行的计算器。

用汇编语言实现简单计算器还涉及到输入输出模块的设计,加减乘除运算的判断以及退出程序的判断的设计。

通过对各种指令的合理使用,设计各个功能模块。

当实现各个程序模块后,通过程序的调用最终实现一个简单的计算器。

关键词:计算器,汇编语言,四则运算,功能模块AbstractCalculator is the easiest calculation tools, a simple calculator with addition, subtraction, multiplication, division four arithmetic functions. Want to use assembly language to achieve a simple calculator, you must pass on the data storage, register usage, addition, subtraction, and related instructions such as assembly language module calls the use of knowledge in order to achieve a basic functional, user-friendly, easy to operate easy calculator. Using assembly language to achieve a simple calculator also involves the design of input and output modules, thejudgment of arithmetic operations and exit the program to judge design. Through the rational use of various commands, design various functional modules. When implementing various program modules, through a call to the ultimate realization of the program a simple calculator.Keyword:Calculator, assembly language, four arithmetic, functional modules目录1.背景分析及意义 (6)2.总体设计思想 (6)3.完成的主要功能 (7)4.软硬件环境要求 (7)5.程序流程图 (7)6.使用说明 (9)设计总结 (9)参考文献 (10)程序清单 (10)1.背景分析及意义汇编语言是计算机能够提供给用户使用的最快而又最有效的语言。

汇编语言加减乘除四则运算实现源代码.

汇编语言加减乘除四则运算实现源代码.

汇编语言加减乘除四则运算实现源代码汇编语言加减乘除四则运算实现源代码 MOVBX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1DOUT2: POP AX ADDAL,'0' CMP AL,'9' JBEDOUT3 ADD AL,'A'-'9'-1DOUT3: CALLDISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POPAX RET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEAR PUSHBX PUSH BP PUSH DI XOR AX,AX XOR DX,DXDATE1: MOVDI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHLDI,1 RCL DX,1 Jmp shortDATE4DATE3: ADD DI,BX ADCDX,BPDATE4: ADD AX,DI ADCDX,0 JMP DATE1DATE5: ADDAL,9 JMP DATE2DATE6: JCXZDATE7 CMP AL,'A' JBDATE7 CMP AL,'F' JBEDATE5 CMP AL,'a' JBDATE7 CMP AL,'f' JBEDATE5DATE7: MOV AX,DI DECSI OR DI,DX POP DI POPBP POP BX RET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEAR MOVAX,NUM2 MOV DX,NUM2+2 CMPYSF1,'+' JZ JSJJ1 SUBNUM1,AX SBB NUM1+2,DX JMP SHORTJSJJ2JSJJ1: ADD NUM1,AX ADC NUM1+2,DX上一页[1] [2] [3] 下一页。

四则运算汇编语言程序设计

四则运算汇编语言程序设计

安徽工程大学《汇编语言程序设计》大作业报告班级: XXXXX 学号: XXXXXXXX 完成人: XXXXXXX任课老师: XXXXXXX 时间: XXXXXXXXXX《汇编语言程序设计》大作业任务书大作业题目:四则运算程序程序功能要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。

计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。

1.设计目标运用汇编语言,制作一个计算的程序,实现简单计算器的一般功能,能够在DOS界面下进行简单的加、减、乘、除的简单计算。

程序应有操作提示、输入和输出。

自动闪烁光标,并提示输入信息。

输入正确的数值等符号后可以进行正确的运算,程序计算其结果值并输出。

程序无需查错功能,所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为+、-、*、/,最后结果以十进制数表示。

且程序主界面需为一个由‘*’组成边框的矩形窗口。

2.软件设计2.1程序设计的基本思想主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。

如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。

计算显示完毕后,按提示选择是否要继续计算,不选择继续则结束。

对屏幕上输入字符串的接受,为INPUT语句段,见源代码,主要是将数字和运算符分开存放。

MATCH子程序,子程序内有三次跳转,将运算符选择正确的语句进行计算。

由于操作符只有+、-、*、/,没有涉及到括号,不用考虑括号的匹配问题。

流程图如下:图1 主模块流程图子模块:完成对数据的进一步加工处理,转换格式并得出结果。

首先根据输入调用对应的“+”、“-”、“*”、“/”四个函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几个模块服务的,大致的流程图如下图2:图2 子模块流程图3.系统调试3.1测试目标(1)在屏幕上显示一个由‘*’组成边框的矩形窗口;(2)自动闪烁光标,并提示输入信息;(3)能够完成单项表达式的输入、显示和运算;(4)编制并调试出程序。

汇编语言四则运算

汇编语言四则运算

《微机原理与接口技术》课程设计电气与自动化工程系 通信工程2010-12-28院 系: 专 业: 年级班级: 学 号: 姓 名: 指导教师: 设计日期:一、课程设计目的每个同学在1-2周时间内,用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。

二、课程设计要求从键盘上输入数字参与运算,并在屏幕上显示结果,至少实现加法减法运算。

三、课题分析该程序设计的关键是要根据四则运算中()、*、/、+、-、= 的优先级设置符号的权值,其中(、*、/、+、-、)、= 的权值分别设置为5、4、4、3、3、1、0 ,然后根据权值的大小进行运算。

程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。

程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。

需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/ 及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘ +、-’运算符及紧跟着的权值,然后按照+、- 运算符的左右顺序从左到右进行‘ +、- ’运算,当最后遇到等号‘ = ’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。

四、流程图五、程序源代码DATAS SEGMENT STR1 DB 0AH,0DH,'@******************************************@$' STR2 DB 0AH,0DH,'@* *@$' STR3 DB 0AH,0DH,'@* Welcome you ! *@$' STR4 DB 0AH,0DH,'@* This is programe of sizeyunsuan *@$' STR5 DB 0AH,0DH,'@* Rang(-32768 to 32767) *@$' STR6 DB 0AH,0DH,'@* JikeB082 Hanyou 200807014225 *@$' STR7 DB 0AH,0DH,'@* *@$' STR8 DB 0AH,0DH,'@******************************************@$' MESG DB 0AH,0DH,'Do you want to continue? (y/n) $' SIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 NUMB DW 20 DUP (0) ;保存输入的数值 MARK DB 'M' ;保存输入的运算符 DB 10 DUP (0) ERROR DB 'YOUR INPUT IS WRONG$' DATAS ENDS DISP MACRO STR LEA DX,STR MOV AH,9 INT 21H ENDM CHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值 CMP AL,ASC JNE OTH &HAO MOV CH,H JMP OTH7 ENDM CODES SEGMENT ASSUME CS:CODES,DS:DATAS START :CALL CLEAR MOV AX,DATAS MOV DS,AX LEA DI,NUMB LEA SI,MARK DISP STR1 DISP STR2 DISP STR3 DISP STR4 DISP STR5DISP STR6 DISP STR7 DISP STR8 CALL CR MOV AX,0 MOV BX,0 MOV CX,0 MOV DX,0 START1: CALL CR INPUT: MOV AH,1 INT 21H CMP AL,'=' JE PD ;是等号,进一步判断输入括号是否配对 CMP AL,28H JB INPUT CMP AL,39H JA INPUT CMP AL,2FH ;判断是数字还是符号 JBE JUD ;是符号转入响应操作 INC WORD PTR SIGN1 ;将数字标志位加1 SUB AL,30H ;将ASCII 码转16进制 MOV AH,0XCHG AX,[DI]MUL BXMOV BX,10XCHG AX,[DI]ADD [DI],AXJMP INPUTPD: CMP WORD PTR SIGN2,0 ;判断配对标志位JE JUDJMP BCJUD:CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位JE FUHADD DI,2MOV WORD PTR SIGN1,0 ;将数字标志位复0FUH:CALL ADVANCE ;设定优先级CMP CH,5 ;判断输入的符号是否是左括号JNE PY ;不是则判断输入的是否是右括号INC WORD PTR SIGN2 ;是左括号,括号标志位加1PY:CMP CH,1 ;判断输入的是否是右括号JNE AGAINDEC WORD PTR SIGN2 ;是右括号,括号标志位减1AGAIN:CMP BYTE PTR[SI],'M';判断运算符存储区是否为空如23*56-(8*19)/6+67-8=1322JE SAVECMP CH,[SI] ;[SI]的内容为前一个符号或其权值JA SAVECMP BYTE PTR[SI],'('JNE YIDODEC SIJMP INPUTYIDO:DEC SIMOV CL,[SI]CALL MATCH ;判断是什么运算符并进行相应的计算JMP AGAINSAVE:CMP CH,0 ;判断是否是等号JE OUTPUTCMP CH,1JE INPUT ;“)”不保存,输入下一个数INC SIMOV [SI],AL ;保存符号INC SICMP CH,5 ;判断是否是左括号JNE GO_ONMOV CH,2 ;改变(的权值GO_ON:MOV [SI],CH ;紧跟着保存符号的权值JMP INPUTBC: LEA DX,ERRORMOV AH,9INT 21HJMP J_SHUMATCH PROC NEAR ;子程序,进行相应的运算PUSH AXXOR AX,AXXOR BX,BXCMP CL,2AH ;乘法运算 JNE NEXT1SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXMOV [DI],AXADD DI,2JMP FINISHNEXT1:CMP CL,2FH ;除法运算 JNE NEXT2SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXMOV [DI],AXADD DI,2JMP FINISHNEXT2:CMP CL,2BH ;加法运算 JNE NEXT3SUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISHNEXT3:CMP CL,2DH ;减法运算 JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH:POP AXRETMATCH ENDPADVANCE PROCCHOICE 28H,1,5 ;(OTH1:CHOICE 29H,2,1 ;)OTH2:CHOICE 2AH,3,4 ;*OTH3:CHOICE 2FH,4,4 ;/OTH4:CHOICE 2BH,5,3 ;+OTH5:CHOICE 2DH,6,3 ;-OTH6:CHOICE 3DH,7,0 ;=OTH7:RETADVANCE ENDP CLEAR PROC NEAR ;清屏PUSH AXPUSH BXPUSH CXPUSH DXMOV AX,0600HMOV BH,0FHMOV CX,0MOV DX,184FHINT 10HPOP AXPOP BXPOP CXPOP DXRETCLEAR ENDPCR PROC NEAR ;回车换行PUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21HMOV AH,2MOV DL,0AHINT 21HPOP DXPOP AXRETCR ENDPOUTPUT: ;输出运算结果SUB DI,2CMP WORD PTR[DI],0JGE W1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21HW1: MOV BX,10000MOV CX,5MOV SI,0W2: MOV AX,[DI]CWDDIV BXMOV [DI],DXCMP AL,0JNE W3CMP SI,0JNE W3CMP CX,1JE W3JMP W4W3: MOV DL,ALADD DL,30HMOV AH,2INT 21HMOV SI,1W4: MOV AX,BXMOV DX,0MOV BX,10DIV BXMOV BX,AX LOOP W2CALL CR DISP MESGMOV AH,1INT 21HCMP AL,'n'JE J_SHUCMP AL,'N'JE J_SHUMOV WORD PTR[DI+2],0 CALL CRLEA DI,NUMBLEA SI,MARKJMP START1J_SHU:MOV AH,4CHINT 21HCODES ENDSEND START六、结果显示七、感想、收获及体会学习汇编语言:大一学习的是C语言,因此,在学汇编语言之初,面对格式之类的感觉很不适应。

汇编课程设计报告-四则运算

汇编课程设计报告-四则运算

课程设计报告一.课程设计的性质和目的性质:《汇编语言》是计算机科学与技术专业及网络工程本科学生必修的专业课程。

目的要求:进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。

二.课程设计的要求1.遵循模块化、结构化的程序设计方法。

2.要求程序必须正确。

3.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。

4.要求程序结构合理,语句使用得当。

5.适当追求编程技巧和程序运行效率。

三.主要仪器设备及软件计算机、MASM汇编软件。

四.设计题目四则运算:从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。

并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。

五.题目分析根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分,首先用1号功能以输入字符的形式接收输入的算式,再判断输入字符ASCII码,如果是+、-、*、/、=或数字,则跳转到相应功能模块,并把输入的字符转为数值传入BX寄存器,在各功能模块中继续用1号功能输入字符,执行以上操作,将输入号符转为数据存入DX中,由于*、/优先级要高,加、减模块的实现中要根据输入运算符号进行将BX入栈操作,如果是相同优先级运算符,则直接将BX,DX中的数据进行相应运算,输入=则输出运算结果,这时输出字符串Continue?,用户输入y/n执行继续计算和退出操作六.运行结果输入要计算的式子,按等号输出结果,计算机提示是否继续输入,输入字符y,继续输入,键入n退出程序,如果键入字符为其他,则反回提示输入如图:七.程序流程主程序流程八.代码根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分1、源程序:ASSUME CS:CODES,DS:DATAS,SS:STACKSNEXTLINE MACRO ;显示换行宏MOV AH,2MOV DL,10INT 21HMOV AH,2MOV DL,13INT 21HENDMSTART:MOV AX,DATASMOV DS,AXMOV BX,0INPUT1:MOV AH,1 ;从键盘输入一个字符INT 21HCMP AL,'+' ;判断是否为+JZ ADDITIONCMP AL,'-' ;判断是否为-JZ SUBTRATIONCMP AL,'*' ;判断是否为*JZ MULTIPLICATIONCMP AL,'/' 判断是否为/JZ DIVISIONCMP AL,'=' 判断是否为=JZ RESULTCMP AL,58 判断输入是否为数字JS L1JMP INPUT1L1:CMP AL,47节JNS L2JMP INPUT1L2:SUB AL,48 如果输入为数字,将数值计入BX MOV CL,ALMOV AX,BXMOV CH,10MUL CHADD AL,CLMOV BX,AXJMP INPUT1MOV DX,0INPUT2:MOV AH,1 从键盘输入字符INT 21HCMP AL,'+' 判断是否为+JZ L23CMP AL,'-' 判断是否为-JZ L24CMP AL,'*' 判断是否为*JZ L25CMP AL,'/' 判断是否为/JZ L26CMP AL,'=' 判断是否为=JZ L27CMP AL,58 判断是否为数字JS L21JMP INPUT2L21:CMP AL,47JNS L22JMP INPUT2 如果不是数字,则跳转到INPUT2 L22:SUB AL,48 将输入字符转换为数值MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT2L23:ADD BX,DX 执行加运算JMP ADDITIONL24:ADD BX,DXJMP SUBTRATIONL25:ADD BX,DXJMP MULTIPLICATIONL26:ADD BX,DXJMP DIVISIONL27:ADD BX,DXSUBTRATION: 如果输入-,则执行减法 MOV DX,0INPUT3:MOV AH,1INT 21HCMP AL,'+' 判断是否为+JZ L33CMP AL,'-' 判断是否为-JZ L34CMP AL,'*' 判断是否为*JZ L35CMP AL,'/' 判断是否为/JZ L36CMP AL,'=' 判断是否为=JZ L37CMP AL,58 判断是否为数字JS L31JMP INPUT3L31:CMP AL,47JNS L32JMP INPUT3L32:SUB AL,48 将字符转换为数值MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT3L33:SUB BX,DX 执行减法操作JMP ADDITIONL34:SUB BX,DXJMP SUBTRATIONL35:SUB BX,DXJMP MULTIPLICATIONL36:SUB BX,DXSUB BX,DX JMP RESULTMULTIPLICATION: MOV DX,0 INPUT4: MOV AH,1 INT 21HCMP AL,'+' JZ L43 CMP AL,'-' JZ L44 CMP AL,'*' 判断是否为* JZ L45CMP AL,'/' 判断是否为/ JZ L46CMP AL,'=' 判断是否为= JZ L47CMP AL,58 判断是否为数字 JS L41 JMP INPUT4 L41:CMP AL,47 JNS L42 JMP INPUT4 L42:SUB AL,48 将字符转换为数值 MOV CL,ALMOV AX,DX 将字输入数字加入数值 MOV CH,10 MUL CH ADD AL,CL MOV DX,AX JMP INPUT4 L43:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算 MOV BX,AX 将AX 中的数值返回BX JMP ADDITION L44:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算 判断是否为+ 判断是否为-JMP SUBTRATIONL45:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP MULTIPLICATIONL46:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP DIVISIONL47:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP RESULTDIVISION:MOV DX,0INPUT5:MOV AH,1INT 21HCMP AL,'+' JZ L53CMP AL,'-' JZ L54CMP AL,'*' JZ L55CMP AL,'/' JZ L56CMP AL,'=' JZ L57CMP AL,58 JS L51JMP INPUT5 L51:CMP AL,47 JNS L52JMP INPUT5 L52:SUB AL,48 MOV CL,AL MOV AX,DX MOV CH,10 判断是否为+ 判断是否为- 判断是否为* 判断是否为/ 判断是否为= 判断是否为数字ADD AL,CLMOV DX,AXJMP INPUT5L53:MOV AX,BXDIV DXMOV AH,0MOV BX,AXJMP ADDITIONL54:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP SUBTRATIONL55:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP MULTIPLICATIONL56:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP DIVISIONL57:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP RESULTRESULT:显示结果MOV CH,10MOV CL,100R1: 将BX中的计算结果以十进制输出 MOV AX,BXDIV CLMOV DL,ALMOV DH,AHMOV AL,AHMOV AH,0MOV BX,AXADD DL,48INT 21HMOV AH,0MOV AL,CLDIV CHMOV CL,ALCMP CL,1JZ R2JMP R1R2:MOV DL,DHADD DL,48MOV AH,2INT 21HS2:NEXTLINELEA DX,STRING 询问是否继续输入MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'y' 输入y则跳转到S1JE S1CMP AL,'n' 输入n则跳转到S3,即结束程序JE S3JNE S2S3:MOV AH,4CHINT 21HCODES ENDS九.心得体会程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分本程序基本实现了四则运算的功能,但还没能实现带有括号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象一开始的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。

四则运算实验

四则运算实验

实验二四则运算实验一实验目的1.进一步熟悉CCS5000 2.0版本软件的使用;2、掌握DSP汇编程序的编写;3.熟悉和掌握软件初始化、断点设置、单步运行、MEMORY内容的查看、图表的使用、变量的查看以及快捷键的使用等。

二实验设备计算机、CCS软件仿真平台三实验内容1、编写自定义的算术运算式子(需包括加法、减法、乘法等运算)的程序;2、编写CMD汇编命令文件;3、编译、连接、下载及运行程序;4、熟悉CCS的操作1)有两种方法可以增加一条断点:a)使用断点对话框选择命令Debug-Break Points将弹出断点对话框。

在“Break Point”栏中可以选择“无条件断点(Break at Location)”或“有条件断点(Break at Location if expression is TURE)”。

在“Location”栏中填写需要中断的指令地址。

用户可以观察反汇编窗口,确定指定所处地址。

对C代码,由于一条C语句可能对应若干条汇编指令。

难以用唯一地确定位置。

为此用户可以采用“file Name line line number”的形式定位源程序中的一条C语句。

例如“hello.C line 32”指明在hello.C程序从第32行处语句设置断点。

断点类型和位置设置完成后,依次单击“Add”和“OK”按钮即可。

断点设置成功后,该语句条用彩色光条显示,如果用户选择的是带条件断点,则“Expression”栏有效,输入表达式。

当此表达式运算结果为真(ture=1)时,则程序在此断点位置暂停。

否则继续执行下去。

b)采用工程工具条。

将光标移到需要设置断点的语句上,点击工程工具条上的按钮,则在该语句位置设置一断点,默认情况下为“无条件断点”。

用户也可以使用断点对话框修改断点属性,例如将“无条件断点”改变为“有条件断点”。

再次点击工程工具条上的按钮,则删除该语句的断点设置。

点击工具条上的按钮,则删除程序中的所有的断点2)单步运行单步执行有四种类型,具体如下:a)单步进入(快捷键F8):选择Debug\Step Into或单击调试工具条上的按钮。

试验1:四则运算

试验1:四则运算

湖北工程学院课程设计报告专业 :网络工程课程名称:汇编课程设计班级: 1217142姓名:雷震学号:012301714208设计题目: 四则运算设计时间: 2014-3-27一、实验目的:1.加深对汇编的理解;2.掌握汇编程序的设计方法;3.学会使用顺序结构。

二、实验内容:定义变量A、 B、 C、 D,编写程序实现:(a * b + c - 70) / a。

并将最后的商保存在D中,余数保存在D+2中。

本实验中: a = 15, b = 75, c = 70。

三、实验步骤1.程序设计流程图开始a→15,b→75,c→70a*b→DX, AXAX →CX,DX →BX将数C转换成双精度数→DX, AXa*b+c→DX, AXa*b+c-70→DX, AX(a*b+c-70)/a→AX(商)、DX(余数)AX →DDX →D+2结束2.源代码:DA TA SEGMENTA DW 15B DW 75C DW 70D DW 2 DUP (0)DA TA ENDSSTACK SEGMENT STACKDB 200 DUP (0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:STACKSTART:MOV AX, DA TAMOV DS, AXMOV AX, AIMUL B // a * b →DX,CXMOV CX, AXMOV BX, DX // (DX, AX) →BX,CXMOV AX, CCWD // 将数C转换成双精度数→DX, AXADD AX, CXADC DX, BX // a * b + c →DX, AXSUB AX, 70SBB DX, 0 //a * b + c - 70 →DX, AXIDIV A //(a * b + c - 70) / a →AX(商), DX(余数)MOV D, AXMOV D + 2, DXMOV AH, 4CHINT 21HCODE ENDSEND START3.调试与运行(1)首先进入DOS系统,进入目标文件所在的系统盘和文件夹;(2)输入“MASM TEST”,此命令是调用宏汇编程序MASM对源文件TEST.ASM进行编译,TEST是文件的名称,生成目标文件TEST.OBJ;(3)若汇编无错误,则用命令“LINK TEST”进行连接,生成可执行文件TEST.EXE;(4)若连接成功,则用命令“TEST”运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机原理实验室实验报告课程名称:姓名学号班级成绩设备名称及软件环境实验名称四则运算实验日期一.实验内容从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。

并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。

二.理论分析或算法分析根据题目的要求,可以把整个源程序大致划分为几个基本结构:程序加法、减法、乘法、除法、显示结果五个部分。

首先用1号功能以输入字符的形式接收输入的算式,再判断输入字符ASCII码,如果是+、-、*、/、=或数字,则跳转到相应功能模块,并把输入的字符转为数值传入BX寄存器,在各功能模块中继续用1号功能输入字符,执行以上操作,将输入号符转为数据存入DX中,由于*、/优先级要高,加、减模块的实现中要根据输入运算符号进行将BX入栈操作,如果是相同优先级运算符,则直接将BX,DX中的数据进行相应运算,输入=则输出运算结果,这时输出字符串Continue?,用户输入y/n执行继续计算和退出操作三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)主程序流程:代码 : 根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分源程序:CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSNEXTLINE MACRO ;显示换行宏MOV AH,2MOV DL,10开始 从键盘输入字符 AL=‘+’ AL=‘-’ AL=‘*’ AL=‘=’ AL=‘/’ 输出结果 结束从键盘输入加数并执行加运算 从键盘输入加数并执行减运算从键盘输入加数并执行乘运算 从键盘输入加数并执行除运算 Y Y Y Y Y N N NNMOV AH,2MOV DL,13INT 21HENDMSTART:MOV AX,DATASMOV DS,AXMOV BX,0INPUT1:MOV AH,1 ;从键盘输入一个字符INT 21HCMP AL,'+' ;判断是否为+JZ ADDITIONCMP AL,'-' ;判断是否为-JZ SUBTRATIONCMP AL,'*' ;判断是否为*JZ MULTIPLICATIONCMP AL,'/' 判断是否为/JZ DIVISIONCMP AL,'=' 判断是否为=JZ RESULTCMP AL,58 判断输入是否为数字JS L1JMP INPUT1L1:CMP AL,47节JNS L2JMP INPUT1L2:SUB AL,48 如果输入为数字,将数值计入BX MOV CL,ALMOV AX,BXMOV CH,10MUL CHADD AL,CLMOV BX,AXJMP INPUT1ADDITION: 输入+后,进入加法运算MOV DX,0INPUT2:MOV AH,1 从键盘输入字符INT 21HCMP AL,'+' 判断是否为+JZ L23CMP AL,'-' 判断是否为-JZ L24CMP AL,'*' 判断是否为*JZ L25CMP AL,'/' 判断是否为/JZ L26CMP AL,'=' 判断是否为=JZ L27CMP AL,58 判断是否为数字JS L21JMP INPUT2L21:CMP AL,47JNS L22JMP INPUT2 如果不是数字,则跳转到INPUT2 L22:SUB AL,48 将输入字符转换为数值MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT2L23:ADD BX,DX 执行加运算JMP ADDITIONL24:ADD BX,DXJMP SUBTRATIONL25:ADD BX,DXJMP MULTIPLICATIONL26:ADD BX,DXJMP DIVISIONL27:ADD BX,DXJMP RESULTSUBTRATION: 如果输入-,则执行减法MOV DX,0MOV AH,1INT 21HCMP AL,'+' 判断是否为+JZ L33CMP AL,'-' 判断是否为-JZ L34CMP AL,'*' 判断是否为*JZ L35CMP AL,'/' 判断是否为/JZ L36CMP AL,'=' 判断是否为=JZ L37CMP AL,58 判断是否为数字 JS L31JMP INPUT3L31:CMP AL,47JNS L32JMP INPUT3L32:SUB AL,48 将字符转换为数值 MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT3L33:SUB BX,DX 执行减法操作 JMP ADDITIONL34:SUB BX,DXJMP SUBTRATIONL35:SUB BX,DXJMP MULTIPLICATIONL36:SUB BX,DXJMP DIVISIONL37:SUB BX,DXJMP RESULTMULTIPLICATION:MOV DX,0INPUT4:MOV AH,1INT 21HCMP AL,'+' JZ L43 CMP AL,'-' JZ L44 CMP AL,'*' 判断是否为*JZ L45CMP AL,'/' 判断是否为/JZ L46CMP AL,'=' 判断是否为=JZ L47CMP AL,58 判断是否为数字JS L41JMP INPUT4L41:CMP AL,47JNS L42JMP INPUT4L42:SUB AL,48 将字符转换为数值MOV CL,ALMOV AX,DX 将字输入数字加入数值MOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT4L43:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算MOV BX,AX 将AX 中的数值返回BXJMP ADDITIONL44:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算MOV BX,AX 将AX 中的数值返回BXJMP SUBTRATIONL45:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算判断是否为+判断是否为-JMP MULTIPLICATIONL46:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP DIVISIONL47:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP RESULTDIVISION:MOV DX,0INPUT5:MOV AH,1INT 21HCMP AL,'+' JZ L53CMP AL,'-' JZ L54CMP AL,'*' JZ L55CMP AL,'/' JZ L56CMP AL,'=' JZ L57CMP AL,58 JS L51JMP INPUT5 L51:CMP AL,47 JNS L52JMP INPUT5 L52:SUB AL,48 MOV CL,AL MOV AX,DX MOV CH,10 MUL CHADD AL,CL MOV DX,AX JMP INPUT5 L53: 判断是否为+ 判断是否为- 判断是否为* 判断是否为/ 判断是否为= 判断是否为数字DIV DXMOV AH,0MOV BX,AXJMP ADDITIONL54:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP SUBTRATIONL55:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP MULTIPLICATIONL56:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP DIVISIONL57:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP RESULTRESULT:显示结果MOV CH,10MOV CL,100R1: 将BX中的计算结果以十进制输出 MOV AX,BXDIV CLMOV DL,ALMOV DH,AHMOV AL,AHMOV AH,0MOV BX,AXADD DL,48MOV AH,2INT 21HMOV AH,0MOV AL,CLDIV CHCMP CL,1JZ R2JMP R1R2:MOV DL,DHADD DL,48MOV AH,2INT 21HS2:NEXTLINELEA DX,STRING 询问是否继续输入MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'y' 输入y则跳转到S1JE S1CMP AL,'n' 输入n则跳转到S3,即结束程序JE S3JNE S2S3:MOV AH,4CHINT 21HCODES ENDS四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)运行结果输入要计算的式子,按等号输出结果,计算机提示是否继续输入,输入字符y,继续输入,键入n 退出程序,如果键入字符为其他,则反回提示输入如图:五.结论程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分本程序基本实现了四则运算的功能,但还没能实现带有括号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象一开始的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。

由于能力有限,程序还是有不完美的地方。

这次的综合实验让我对汇编有了更深刻的认识,对各种指令有了进一步的理解。

报告提交日期。

相关文档
最新文档