您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 多字节加减法汇编程序
16位10进制正整数加减法汇编程序代码说明:将代码复制到MasmforWindows集成实验环境2012.5软件当中保存后点击运行如图:出现如下窗口:在屏幕上输入被加数(被减数)按‘+’结束,然后再输入加数(减数)按‘=’结束,最后窗口会显示运算结果。例如要计算123456+123456789,步骤如下:显然运算结果是正确的。进行减法运算:123456-123456789,结果如下:(注:由于n=16所以本程序最多只能进行16位数以内的正整数加减运算,如需进行任意位数的运算只需对n进行更改即可,这是本程序的最大优点。但是本程序只能完成正整数的加减运算,对负数和小数的运算就无能为力了,另外也无法进行连加与连减的运算。因此程序还有待进一步的改进。)汇编程序代码:DATASSEGMENTnEQU16;n表示和的最大位数mEQU8;因为和是ASCII码要转换成BCA码所以m=n/2kEQU9*m+6;BUF0DB1DUP(30H);BUF1DBnDUP(0);被加数(ASCII),n=8DB1DUP(30H)BUF2DBnDUP(0);加数(ASCII)BUF3DBmDUP(0);被加数(BCD)BUF4DBmDUP(0);加数(BCD)FHADB4DUP(?);用于保存‘+’、‘-’、数据长度SBCDBmDUP(?);BCD码形式的和SASDBnDUP(?);ASCII码形式的和BUF5DB30H,nDUP(0),30H,nDUP(0),nDUP(0),4DUP(?),mDUP(?),nDUP(?)DATASENDSSTACKSSEGMENTDB100DUP(?);此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSINPT1PROC;输入被加数到BUF1按‘+’结束LEASI,BUF1MOVCX,0;CX用来统计输入数的字长IN1:MOVAH,01HINT21HCMPAL,'+'JZBJS1CMPAL,'-'JZBJS1MOV[SI],ALINCSIINCCLJMPIN1;将BUF1中的ASCII转换成BCD码到BUF3BJS1:MOV[FHA],ALMOV1[FHA],CLLEADI,BUF3MOVBX,2MOVAX,CXDIVBLADDAL,AHMOVCL,ALAB1:DECSI;AB1--ASCII转换成BCD码MOVAL,[SI]SUBAL,30HDECSIMOVAH,[SI]SUBAH,30HPUSHCXMOVCL,4SHLAH,CLPOPCXADDAL,AHMOV[DI],ALINCDILOOPAB1;输入加数到BUF2按‘=’结束LEASI,BUF2MOVCX,0;CX用来统计输入数的字长IN2:MOVAH,01HINT21HCMPAL,'='JZJASMOV[SI],ALINCSIINCCXJMPIN2;将BUF2中的ASCII转换成BCD码到BUF4JAS:MOV2[FHA],CLLEADI,BUF4MOVBX,2MOVAX,CXDIVBLADDAL,AHMOVCL,ALAB2:DECSI;AB2--ASCII转换成BCD码MOVAL,[SI]SUBAL,30HDECSIMOVAH,[SI]SUBAH,30HPUSHCXMOVCL,4SHLAH,CLPOPCXADDAL,AHMOV[DI],ALINCDILOOPAB2RETINPT1ENDP;加法子程序JAFPROCCLCMOVCL,m;m=8LEABX,BUF3LEASI,BUF4LEADI,SBCADC_:MOVAL,[BX]ADCAL,[SI]DAAMOV[DI],ALINCSIINCDIINCBXLOOPADC_RETJAFENDP;减法子程序JIAFPROCSBB_:MOVAL,1[FHA]CMPAL,2[FHA]JABDJ1;被加数长度大于加数长度,即被加数大于加数JZBZJ1;被加数长度等于加数长度,进行大小比较JMPBBJ;被加数长度小于加数长度,即被加数小于加数BZJ1:MOVCL,AL;被加数长度等于加数长度,进行大小比较LEASI,BUF1LEADI,BUF2BZJ3:MOVAL,[SI]CMPAL,[DI]JABDJ1;被加数当前位大于加数当前位即被加数大于加数跳转JBBBJ;被加数当前位小于加数当前位即被加数小于加数跳转INCSI;被加数当前位等于加数当前位,调整指针继续比较INCDILOOPBZJ3JMPBDJ1;被加数等于加数BBJ:MOVAH,02HMOVDL,'-'INT21HCLCMOVCL,mLEABX,BUF4LEASI,BUF3LEADI,SBCJMPBDJBDJ1:CLCMOVCL,mLEABX,BUF3LEASI,BUF4LEADI,SBCBDJ:MOVAL,[BX]SBBAL,[SI]DASMOV[DI],ALINCSIINCBXINCDILOOPBDJRETJIAFENDP;BCD码转ASCII码子程序BCD_ASCPROCMOVCX,m;m=8LEASI,SBCLEADI,SASBC_as:MOVAL,[SI]MOVAH,ALANDAL,0FHADDAL,30HMOV[DI],ALINCDIPUSHCXMOVCX,4SHRAH,CLPOPCXADDAH,30HMOV[DI],AHINCDIINCSILOOPBC_asMOVCL,n;这里n等于16DIS1:DECDI;把首位的0去掉例如:0+1=00000001显示结果1CMPBYTEPTR[DI],30HJNZDISP;首位不为0跳转LOOPDIS1JNZDISP;CX不等于0即结果不为0跳转MOVDL,'0';CX等于0即结果为0则显示0结束MOVAH,02HINT21HJMPDIS2DISP:MOVDL,[DI]MOVAH,02HINT21HDECDILOOPDISPDIS2:RETBCD_ASCENDP;数据段初始化子程序CLC1PROCMOVCX,KLEASI,BUF5LEADI,BUF0CLC2:MOVAL,[SI]MOV[DI],ALINCSIINCDILOOPCLC2RETCLC1ENDPSTART:;主程序:16位数以内整数加减法MOVAX,DATASMOVDS,AX;此处输入代码段代码CALLINPT1;调用输入子程序CMP[FHA],'+';判断加减号JNZJiha;是'-'跳转到减法CALLJAF;调用加法子程序JMPB_A1;跳转到BCD转ACSII子程序Jiha:CALLJIAF;调用减法子程序B_A1:CALLBCD_ASC;将和转换成十进制数保存在SAS中MOVDL,0DH;回车换行MOVAH,02HINT21HMOVDL,0AHMOVAH,02HINT21HCALLCLC1;调用数据段初始化子程序JMPSTART;重新输入MOVAH,4CHINT21HCODESENDSENDSTART
本文标题:多字节加减法汇编程序
链接地址:https://www.777doc.com/doc-5609752 .html