汇编语言,最好写出整个程序代码,关键在于两个子程序的代码,一定要带注释!!!谢!高分求

[复制链接]
查看11 | 回复7 | 2011-8-19 07:21:03 | 显示全部楼层 |阅读模式
编写一个程序,能从键盘读入两个5位十进制数(1位符号位和4位数值位),并将这两个十进制数分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。要求:提示从键盘输入第一个数,按回车完成输入;然后提示从键盘输入第二个数,按回车完成输入。然后显示输入的两个数的和。能够从键盘输入-9999~9999之间的数值。相互转化那个功能要用两个子程序(即十进制变二进制、二进制变十进制)完成,本人就是在这个子程序这里,不太会多位数字的转换,.....急求!!!!!!!!
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
;编写一个程序,能从键盘读入两个5位十进制数(1位符号位和4位数值位),并将这两个;十进制数分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。;;要求:提示从键盘输入第一个数,按回车完成输入;然后提示从键盘输入第二个数,按回;车完成输入。然后显示输入的两个数的和。能够从键盘输入-9999~9999之间的数值。;相互转化那个功能要用两个子程序(即十进制变二进制、二进制变十进制)完成,;本人就是在这个子程序这里,不太会多位数字的转换,.....急求!!!!!!!!;用MASM5.0编译通过datasegmentS0DB0DH,0AH,\'CTRLCTOEXIT.\',0DH,0AH,24Hs1db0dh,0ah,\'EnterfirstNUM:$\'s2db0dh,0ah,\'EntersecondNUM:$\'S3DB0DH,0AH,24HADD_SDB\'()$\'D1DW0;输入的第一个数D2DW0;输入的第二个数D3DW0;两数相加的结果TDW0;输入数字的临时存放位置FUDB0;正负号,0为正1为负COUNTDB0;数位计数器(限于4位)dataendscodesegmentassumecs:code,ds:datamainprocfarstart:pushdsxorax,axpushaxmovax,datamovds,ax;-------------------------MOVAH,9MOVDX,OFFSETS0INT21HAGAIN:movah,09movdx,offsets1int21hcallinputMOVAX,TMOVD1,AXmovah,09movdx,offsets2int21hcallinputMOVAX,TMOVD2,AXADDAX,D1MOVD3,AXmovah,09movdx,offsets3int21hMOVAX,D1ADDAX,D2MOVAX,D1CALLDISPMOVAH,9MOVDX,OFFSETADD_SINT21HMOVAX,D2CALLDISPMOVAH,2MOVDL,\'=\'INT21HMOVAX,D3CALLDISP;-------------------------JMPAGAINretmainendp;=============inputprocnearmovax,0;初始化movT,AXMOVFU,ALMOVCOUNT,AL;NEXT:MOVAH,08;不回显输入(可CTRLC中断)INT21HCMPAL,0DHJNZN1JMPSAVE;回车输入完毕N1:MOVAH,COUNT;是否输入了4位数CMPAH,4JENEXT;已达4位,不允许再输入CMPAL,\'-\'JNEPD0_9MOVAH,FU;检测到输入\'-\',检查先前是否已输入过CMPAH,0JNENEXT;FU=0未输入\'-\',FU=1已输入\'-\'MOVBX,T;如果前面已输入数字位,则不允许在数字中间再输入\"-\"CMPBX,0JAnextFU_INC:INCFU;置FU=1表示已输入\'-\'MOVAH,2MOVDL,ALINT21HJMPNEXTPD0_9:CMPAL,\'0\';只允许输入0-9JBNEXTCMPAL,\'9\'JANEXTPUSHAXMOVDL,AL;显示输入的0-9MOVAH,2INT21HPOPAXSUBAL,30H;以下:T=[将已输入在T中的数*10d现在输入的数]PUSHAXMOVAX,TMOVBX,10MULBXPOPBXMOVBH,0ADDAX,BXMOVT,AXINCCOUNT;输入位数计数器1JMPNEXTSAVE:;保存输入的数据MOVBX,TMOVAL,FUCMPAL,0JESAVE1NEGBX;若输入的是负数,则求补SAVE1:MOVT,BXRETinputENDP;================DISPPROCNEAR;以10进制显示数字TESTAX,8000H;高位为1是负数,否则为正JZZZNEGAX;数字为负,求补PUSHAXMOVAH,2MOVDL,\'-\';显示\"-\"INT21HPOPAXZZ:;数字为正MOVDX,0MOVBX,10000;转换成10进制的万位数值DIVBXPUSHDXMOVAH,2MOVDL,ALADDDL,30HINT21HPOPAXMOVDX,0MOVBX,1000;转换成10进制的千位数值DIVBXPUSHDXMOVAH,2MOVDL,ALADDDL,30HINT21HPOPAXMOVBL,100;转换成10进制的百位数值DIVBLPUSHAXMOVDL,ALADDDL,30HMOVAH,2INT21HPOPAXMOVAL,AHMOVAH,0MOVDL,10;转换成10进制的十位和个位数值DIVDLADDAX,3030HPUSHAXMOVDL,ALMOVAH,2INT21HPOPDXMOVDL,DHMOVAH,2INT21HRETDISPENDP;================codeendsendstart追问我用的RadASM.....是不是用这个也可以?????
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
对不起,我没用过RadASM。。。程序运行截图:
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
呵呵,看到这里想起了以前学校搞个这些东东,也搞出来了。说句实话搞这些真的一点都没用!除非毕业后你是搞X86asm,搞单片机的最好学习单片机方面的知识,比这实用多。
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
试一下要多久,现在开始,阿门。。。emu8086编译测试通过,附运行测试截图====================================;multi-segmentexecutablefiletemplate.datasegment;addyourdatahere!oper1dw0000h;oper2sumdb5dup(00h)altempdb00hmessage1db\'Thefirstnumber:\',\'$\'message2db\'Thesec0ndnumber:\',\'$\'message3db\'Thesumofthemis:\',\'$\'message4db0dh,0ah,\'Theinputnumberbeginswith-orandendwithenterorfourbits\',\'$\'message5db\'PressESCtoexitoranyotherkeytocontiune\',\'$\'endsstacksegmentdw128dup(0)endscodesegmentstart:;setsegmentregisters:movax,datamovds,axmoves,ax;addyourcodehere;inputoper1:callnewlinebeginleadx,message1movah,09hint21h;outputstringatds:dxcallreadsign;thesignwouldbeindl(zerolabel\'-\';nzerolabel\'\')callreadabsval;theasbvalwouldbeinbxcmpdl,00hjznegative1movoper1,bxjmpinputoper2negative1:xorax,axsubax,bxmovoper1,axinputoper2:callnewlinebeginleadx,message2movah,09hint21h;outputstringatds:dxcallreadsign;thesignwouldbeindl(zerolabel\'-\';nzerolabel\'\')callreadabsval;theasbvalwouldbeinbxcmpdl,00hjznegative2movax,bxjmpout_resultnegative2:xorax,axsubax,bxout_result:pushaxcallnewlinebeginleadx,message3movah,09hint21h;outputstringatds:dxpopax;ax=oper2movbx,oper1;bx=oper1addax,bx;ax=sumofoper1andoper2calloutresult;callnewlinebeginleadx,message5movah,09hint21h;outputstringatds:dxmovah,08hint21hcmpal,1bhjzexitcallnewlinebeginleadx,message4movah,09hint21h;outputstringatds:dxjmpstartexit:movax,4c00h;exittooperatingsystem.int21h;---------------------------------------;callreadabsvalreadabsvalprocnear;in:none;out:bx=theoperatorpushaxpushcxpushdxxorbx,bxmovcx,04hmax4bcd:callreadchar_numorentercmpal,0dhjzreadabsvaloutmovaltemp,almovax,bxmovbx,0ahmulbxmovbx,axmoval,altempxorah,ahaddbx,axloopmax4bcdreadabsvalout:popdxpopcxpopaxretreadabsvalendp;---------------------------------------;callreadchar_numorenterreadchar_numorenterprocnear;in:none;out:al=thenumvalorenterpushdxreadchar_numorenterredo:movah,08hint21hcmpal,0dhjzreadchar_numorenteroutcmpal,30hjlreadchar_numorenterredocmpal,39hjgreadchar_numorenterredomovah,02hmovdl,alint21hsubax,0230hreadchar_numorenterout:popdxretreadchar_numorenterendp;---------------------------------------;callreadsignreadsignprocnear;in:none;out:dl=zero-ornzeropushaxrereadsign:movah,08hint21hcmpal,2bhjzoppsigncmpal,2dhjznegsignjmprereadsignnegsign:movdl,2dhmovah,02hint21hxordl,dlpopaxretoppsign:movdl,2bhmovah,02hint21hmovdl,01hpopaxretreadsignendp;---------------------------------------;calloutresult;outresultprocnearmovbx,axjsoutnegtivemovdl,2bhjmpoutresultvaloutnegtive:movdl,2dhnegbxoutresultval:;outsignmovah,02hint21h;outabsvalleadi,sumadddi,04hmovax,bxmovbx,0ahmovcx,05hsent:xordx,dxdivbxadddl,30hmov[di],dldecdiloopsentleasi,summovbl,00h;asaflatofheadzeromovah,02hmovcx,05hout_Dnum:movdl,[si]cmpdl,30hjnzoutnumtestbl,01hjnzoutnumcmpcx,01hjzoutnumjmpoutvalcontinueoutnum:movbl,01hint21houtvalcontinue:incsiloopout_Dnumretoutresultendp;---------------------------------------;callnewlinebeginnewlinebeginprocnearpushaxpushdxmovah,02hmovdl,0dhint21hmovdl,0ahint21hpopdxpopaxretnewlinebeginendpendsendstart;setentrypointandstoptheassembler.====================================masm5.0测试通过版本datasegmentoper1dw0000hsumdb5dup(00h)altempdb00hmessage1db\'Thefirstnumber:\',\'$\'message2db\'Thesec0ndnumber:\',\'$\'message3db\'Thesumofthemis:\',\'$\'message4db0dh,0ah,\'Theinputnumberbeginswith-orandendwithenterorfourbits\',\'$\'message5db\'PressESCtoexitoranyotherkeytocontiune\',\'$\'dataendsstacksegmentdw128dup(0)stackendscodesegmentassumecs:code,ds:data,ss:stack,es:datastart:movax,datamovds,axmoves,axcallnewlinebeginleadx,message1movah,09hint21hcallreadsigncallreadabsvalcmpdl,00hjznegative1movoper1,bxjmpinputoper2negative1:xorax,axsubax,bxmovoper1,axinputoper2:callnewlinebeginleadx,message2movah,09hint21hcallreadsigncallreadabsvalcmpdl,00hjznegative2movax,bxjmpout_resultnegative2:xorax,axsubax,bxout_result:pushaxcallnewlinebeginleadx,message3movah,09hint21h;outputstringatds:dxpopax;ax=oper2movbx,oper1;bx=oper1addax,bx;ax=sumofoper1andoper2calloutresult;callnewlinebeginleadx,message5movah,09hint21h;outputstringatds:dxmovah,08hint21hcmpal,1bhjzexitcallnewlinebeginleadx,message4movah,09hint21h;outputstringatds:dxjmpstartexit:movax,4c00h;exittooperatingsystem.int21h;---------------------------------------;callreadabsvalreadabsvalprocnear;in:none;out:bx=theoperatorpushaxpushcxpushdxxorbx,bxmovcx,04hmax4bcd:callreadchar_numorentercmpal,0dhjzreadabsvaloutmovaltemp,almovax,bxmovbx,0ahmulbxmovbx,axmoval,altempxorah,ahaddbx,axloopmax4bcdreadabsvalout:popdxpopcxpopaxretreadabsvalendp;---------------------------------------;callreadchar_numorenterreadchar_numorenterprocnear;in:none;out:al=thenumvalorenterpushdxreadchar_numorenterredo:movah,08hint21hcmpal,0dhjzreadchar_numorenteroutcmpal,30hjlreadchar_numorenterredocmpal,39hjgreadchar_numorenterredomovah,02hmovdl,alint21hsubax,0230hreadchar_numorenterout:popdxretreadchar_numorenterendp;---------------------------------------;callreadsignreadsignprocnear;in:none;out:dl=zero-ornzeropushaxrereadsign:movah,08hint21hcmpal,2bhjzoppsigncmpal,2dhjznegsignjmprereadsignnegsign:movdl,2dhmovah,02hint21hxordl,dlpopaxretoppsign:movdl,2bhmovah,02hint21hmovdl,01hpopaxretreadsignendp;---------------------------------------;calloutresult;outresultprocnearmovbx,axjsoutnegtivemovdl,2bhjmpoutresultvaloutnegtive:movdl,2dhnegbxoutresultval:;outsignmovah,02hint21h;outabsvalleadi,sumadddi,04hmovax,bxmovbx,0ahmovcx,05hsent:xordx,dxdivbxadddl,30hmov[di],dldecdiloopsentleasi,summovbl,00h;asaflatofheadzeromovah,02hmovcx,05hout_Dnum:movdl,[si]cmpdl,30hjnzoutnumtestbl,01hjnzoutnumcmpcx,01hjzoutnumjmpoutvalcontinueoutnum:movbl,01hint21houtvalcontinue:incsiloopout_Dnumretoutresultendp;---------------------------------------;callnewlinebeginnewlinebeginprocnearpushaxpushdxmovah,02hmovdl,0dhint21hmovdl,0ahint21hpopdxpopaxretnewlinebeginendpcodeendsendstart;setentrypointandstoptheassembler.=======================================测试运行截图:
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
谢谢,我用的是RadASM,和这个还是有一定差别的.....谢谢您了
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
其实你留意的话,我那是包含了emu98086版和masm5.0版的,对于masm5.0版,在dos下编译通过;找了个radasm2.2.1.9试了一下,对于masm5.0版在Radasm中建立dosapi工程编译通过,调试j结果截图如下
回复

使用道具 举报

千问 | 2011-8-19 07:21:03 | 显示全部楼层
;输入的五位数字,第一位为符号位,当符号位为0时为正数,否则为负数;后四位为参数计算的数字,输出结果同上assumecs:codesg,ds:datasg,ss:stacksgdatasgsegmentinput1db\'Inputfirstnumber!\',\'$\'input2db\'Inputsecondnumber!\',\'$\'resultdb\'resultis:\',\'$\';21号中断10号例程,存放输入数据add1db6;缓冲区最大容量db?;实际上接收字符的个数,不包括最后的回车db6dup(?);存放输入的字符,回车结尾add2db6db?db6dup(?)numdw?;存放中间结果signdb?;两个数和的符号位sumdw10dup(?);两个数的和datasgendsstacksgsegmentstacksgendscodesgsegmentstart:movax,datasgmovds,axleadx,input1movah,9int21h;读取第一个加数movdx,offsetadd1movah,10int21h;取光标位置,ah为行,al为列movah,3movbh,0int10h;设置光标位置movah,2movbh,0incdhmovdl,0int10hleadx,input2movah,9int21h;读取第二个加数movdx,offsetadd2movah,10int21h;取光标位置,ah为行,al为列movah,3movbh,0int10h;设置光标位置movah,2movbh,0incdhmovdl,0int10hleabx,add1movax,[bx1]movah,0decax;除去符号位,得到数字个数pushax;压入字符数量addbx,3pushbx;压入字符串首地址callDeciToBinaleabx,add1movdl,[bx2];取输入的数字的符号位cmpdl,\'0\'jzposi1negax;符号位不为0,则表示负数,所以求补得到负数posi1:leabx,nummov[bx],ax;保存第一个数leabx,add2movax,[bx1]movah,0decaxpushax;压入字符数量addbx,3pushbx;压入字符串首地址callDeciToBinaleabx,add2movdl,[bx2]cmpdl,\'0\'jzposi2negaxposi2:leabx,numadd[bx],ax;保存两个数相加的结果leadx,resultmovah,9int21hleabx,nummovax,[bx];取出两个数的和pushax;保存一个备份;测试结果的符号位andax,1000000000000000b;取最高位negaxsbbax,axnegax;ax的值是0或1addax,30h;转为0或1的ascii码leabx,signmov[bx],al;存入符号位popax;取出备份cmpbyteptr[bx],30h;测试结果是否为正数jzposinegax;不为正,则求补取绝对值posi:pushax;压入第二个参数,即待转换的十六进制数的绝对值leadi,sumpushdi;压入第一个参数,接收结果的缓冲区callBinaToDecileadx,signmovah,9int21hmovax,4c00hint21h;***********************************************************************;作用:将十六进制数,转为十进制字符,用以输出;形式:voidBinaToDeci([buff],int),从右向左依次压入堆栈;参数1:第一个参数[buff]:接收结果的缓冲区地址;参数2:第二个参数int:待转换的十六进制数字;返回值:无,直接保存到内存中;***********************************************************************BinaToDeciprocpushbpmovbp,sppushaxpushbxpushcxpushdxmovcx,0;初始化计数器,记录循环次数,即十进制数的位数movax,[bp6];取出传入的待转换十六进制数,段内调用只加6,段间调用加8;计算出十进制各位数字,并保存到堆栈bina_next:xordx,dxmovbx,10divbxpushdxinccxcmpax,0jzbina_endjmpbina_nextbina_end:movbx,[bp4];取出保存十进制数的缓冲区首地址;将十进制的各个位数转换成ascii码,并存入指定的内存区域bina_next2:popaxaddax,30hmovbyteptr[bx],alincbxloopbina_next2;字符串以\'$\'结尾,用以调用21号中段的9号例程movbyteptr[bx],\'$\'popdxpopcxpopbxpopaxmovsp,bppopbpret4BinaToDeciendp;***********************************************************************;***********************************************************************;作用:将十进制字符,转换为十六进制数,用以计算;形式:voidDeciToBina([buff],int),从右向左依次压入堆栈;参数1:第一个参数[buff]:放置十进制数字字符串的缓冲区的首地址;参数2:第二个参数int:十进制字符串的字符个数;返回值:十六进制的数字;***********************************************************************DeciToBinaprocpushbpmovbp,sppushbxpushcxpushdxpushsimovbx,[bp4];取放置十进制字符串缓冲区的首地址movcx,[bp6];十进制数字字符串的字符个数xorax,ax;将ascii码还原为数字,并保存到堆栈deci_next:moval,byteptr[bx];依次取缓冲区内的字符subal,30hpushaxincbxloopdeci_nextmovcx,[bp6];再次获得字符的个数xorax,axxordx,dxmovbx,1;用作乘数xorsi,si;各位相乘然后累加获得十六进制数值;结果=个位*1十位*10百位*100千位*1000deci_next1:popax;取出数字mulbx;相乘addsi,ax;累加结果;计算下次相乘时的乘数movax,bxmovbx,10mulbxmovbx,axloopdeci_next1;将结果存入ax,为返回值movax,sipopsipopdxpopcxpopbxmovsp,bppopbpret4DeciToBinaendp;***********************************************************************codesgendsendstart=====================================================masm5测试通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行