汇编数值转换器大作业

合集下载

汇编数值转换器大作业解读

汇编数值转换器大作业解读

《汇编语言程序设计》综合程序设计实验报告题目:数制转换器班级:信1101-2班姓名:王兵茹李夏蕾胡佳奇学号:******** ********20113013完成日期:2013-11-24目录一、简介二、小组成员及具体分工三、需求分析与设计四、代码及分析五、总结一、简介本设计利用汇编语言来实现数制转换设计,用于方便进制之间的互换。

设计的内容可以使十六进制、八进制、二进制、十进制的数制互相转换。

二.小组成员及具体分工小组成员:王兵茹李夏蕾胡佳奇具体分工:我们三个一开始是各自的分工查资料,先看看单个数制转换,王兵茹负责的是十六进制,李夏蕾负责的是十进制,胡佳琪负责的是二进制。

最后我们几个一起完成了程序的主要设计,由于大体思路相同,最后加上了八进制的转换。

在程序的修改方面,王兵茹进行了后期的加工,增加了dios中断,把单调的退出改成文本形式下的退出,在退出之前,执行清屏。

最后我们几个商量着完成了实验报告和ppt的制作,经过我们几个人的努力,虽然做的不是特别好,但还是各有收获。

三、需求分析与设计●需求分析通过编程实现显示菜单,然后通过键盘输入菜单相应的选项进入相应的数制转换,然后通过选项对应的子程序跳转来实现转换,子程序中通过宏定义定义数制前后的数制,并且在宏定义过程中实现数制转换算法,最后输出转换后的进制数。

●设计①运行的设计框图②整个系统的设计框图③子程序之间调用关系框图我们的这个程序主要就是用到的子程序的调用和大量的宏定义,对于输入时的宏定义有charin,strin,numin,输出时的宏定义有charout,strout,numout,输出的时候用到的是栈push和pop,在压栈push时,用到了irp不定重复伪操作。

定义通用inax宏,确定转换之前的进制,例如inax cx、cx=2是把转换之前的进制确定为2存到cx中定义通用outax宏,确定转换之后的进制,例如outax bx、bx=2是把转换之后的进制确定为2存到bx中通用宏charin逐个输入转换之前进制字符四、代码及分析程序运行源代码如下:;******************************************************************** *****************data segmentspace db 1000 dup(' ')str1 db 10 dup(' '),9 dup(' '),'Welcome to shuzhizhuanhuan',52 dup(' ')str12 db 240 dup (' '),9 dup(' '),'Thank you',412 dup(' ')clear_screen MACRO ;清屏宏定义mov ah,06hmov al,0mov bh,0f0h ;白底黑字mov ch,0 ;从0行0列到23行79列清屏mov cl,0mov dh,23mov dl,79int 10hmov dx,0 ;光标在左上角mov ah,2int 10h ;调用biosENDMmenu db 10,13,'*************************************************' db10,13,'*************************************************'db10,13,'* please choice action: *'db10,13,'* a.binary 2 to octal 8 *'db10,13,'* b.binary 2 to decimal 10 *'db10,13,'* c.binary 2 to hexadecimal 16 *'db10,13,'* d.octal 8 to binary 2 *'db10,13,'* e.octal 8 to decimal 10 *'db10,13,'* f.octal 8 to hexadecimal 16 *'db10,13,'* g.decimal 10 to binary 2 *'db10,13,'* h.decimal 10 to octal 8 *'db10,13,'* i.decimal 10 to hexadecimal 16 *'db10,13,'* j.hexadecimal 16 to binary 2 *'db10,13,'* k.hexadecimal 16 to octal 8 *'db10,13,'* l.hexadecimal 16 to decimal 10 *'db10,13,'* m.exit *'db10,13,'*************************************************',10,13,' $';**************************************************************;2进制转换为16进制和10进制和8进制str2 db10,13,'please input the binary string:',10,13, '$'str21 db'the hexadecimal string is:',10,13, '$'str22 db'the decimal string is:',10,13, '$'str23 db'the octal string is:',10,13, '$';16进制转换为2进制和8进制和10进制str3 db10,13,'please input the hexadecimal string:',10,13, '$' str31 db'the binary string is:',10,13, '$'str32 db'the octal string is:',10,13, '$'str33 db'the decimal string is:',10,13, '$';10进制转换为2进制和8进制和16进制str4 db10,13,'please input the decimal string:',10,13, '$'str41 db'the binary string is:',10,13, '$'str42 db'the octal string is:',10,13, '$'str43 db'the hexadecimal string is:',10,13, '$';8进制转换为2进制和10进制和16进制str5 db10,13,'please input the octal string:',10,13, '$'str51 db'the binary string is:',10,13, '$'str52 db'the decimal string is:',10,13, '$'str53 db'the hexadecimal string is:',10,13, '$'str0 db 10,13,'ERROR! please input a~m:',13,10,'$';在数据段定义字符,数字,字符串的输入输出的宏定义;*************************************************charin macro ;字符输入mov ah,01hint 21hendm;************************************************numin macro ;数字输入charin ;调用charin宏定义sub al,48 ;48d=30h,将字符转换为数字endm;****************************************************strin macro stringin ;字符串输入lea dx,stringinmov ah,0ahint 21hendm;****************************************************charout macro outchar ;字符输出irp rec,<ax,dx>;不定重复伪操作push recendm;push ax;push dxmov dl, outcharmov ah, 02hint 21hpop dxpop axendm;*************************************************** numout macro outnum ;数字输出push axpush dxmov dl, outnumadd dl, 48mov ah, 02hint 21hpop dxpop axendm;**************************************************strout macro stringout ;字符串输出push axpush dxlea dx, stringoutmov ah, 9int 21hpop dxpop axendmdata endsstack segment stackdw 200 dup(?)stack ends;*************************************************code segmentassume cs:code,ds:data,es:data,ss:stack;******************************************************** endl macroirp x,<ax,bx,cx,dx>;不定重复伪操作push xendm;push ax;push bx;push cx;push dxmov dl, 0ah ;回车换行mov ah, 2int 21hmov dl, 0dhint 21hpop dxpop cxpop bxpop axendm;******************************************************* outax macro basenumpush axpush bxpush cxpush dxmov bx, basenumcall outaxppop dxpop cxpop bxpop axendm;******************************************************* outaxp procmov dx,0mov cx,0outaxp_circle:cmp ax,0je outaxp_nextdiv bxpush dxmov dx,0jmp outaxp_circleoutaxp_next:pop axcmp al,10jb noutadd al,55 ;55d=37hcharout aljmp coutnout:numout alcout:loop outaxp_nextretoutaxp endp;************************************************** inax macro basenumpush bxpush cxpush dxmov cx, basenumcall inaxppop dxpop cxpop bxendm;************************************************ inaxp procmov ax, 0inaxp0:push axinaxp1: charincmp al, 13 ;判断输入的是不是回车je inaxecmp al, '0'jb inaxp1cmp al, '9'ja inaxnext1sub al, 48jmp inaxnuminaxnext1:cmp al, 'A'cmp al, 'F'ja inaxnext2sub al, 55jmp inaxnuminaxnext2:cmp al, 'a'jb inaxp1cmp al, 'z'ja inaxp1sub al, 87jmp inaxnuminaxnum:mov bh, 0mov bl, alpop axcmp ax, 0je inaxaddmul cxinaxadd:add ax, bxjmp inaxp0inaxe:pop axretinaxp endp;*************************************************** start:mov ax,datamov ds,axmov es,axlea bp,spacemov dx,0b00hmov cx,1000mov bx,0020hmov ax,1300hint 10hlea bp,str1;显示welcomemov dx,0600hmov cx,120mov bx,000ehmov ax,1301hint 10hdisplay:strout menucharincmp al,'a'je bin2_oct8jl errcmp al,'b'je bin2_dec10cmp al,'c'je bin2_hex16cmp al,'d'je oct8_bin2cmp al,'e'je oct8_dec10cmp al,'f'je oct8_hex16cmp al,'g'je dec10_bin2cmp al,'h'je dec10_oct8cmp al,'i'je dec10_hex16cmp al,'j'je hex16_bin2cmp al,'k'je hex16_oct8cmp al,'l'je hex16_dec10cmp al,'m'je exitcmp al,'n'jnl errclear_screenjmp displayerr:strout str0jmp display;***************************************************** bin2_hex16: ;二进制转换strout str2inax 2endlstrout str21outax 16jmp displaybin2_dec10:strout str2inax 2endlstrout str22outax 10jmp displaybin2_oct8:strout str2inax 2endlstrout str23outax 8jmp display;************************************************* hex16_bin2: ;十六进制转换strout str3inax 16endlstrout str31outax 2jmp displayhex16_oct8:strout str3inax 16endlstrout str32outax 8jmp displayhex16_dec10:strout str3inax 16endlstrout str33outax 10jmp display;**************************************************** dec10_bin2: ;十进制转换strout str4inax 10endlstrout str41outax 2jmp displaydec10_oct8:strout str4inax 10endlstrout str42outax 8jmp displaydec10_hex16:strout str4inax 10endlstrout str43outax 16jmp display;*********************************************************** oct8_bin2: ;八进制转换strout str4inax 8endlstrout str41outax 2jmp displayoct8_dec10:strout str4inax 8endlstrout str42outax 10jmp displayoct8_hex16:strout str4inax 8endlstrout str43outax 16jmp display;********************************************************** exit: clear_screen ;调用宏定义,清屏lea bp,str12mov dx,0600hmov cx,520mov bx,004ehmov ax,1301hint 10hmov ah,4chint 21h;********************************************************** code endsend start程序运行结果截图:(包括正确输入和错误输入)五、总结本次大作业,考虑到我们平时对数制转换的应用,并且各个进制转换起来使人头痛,我们组做的是一个数制转换器。

汇编语言实现十进制加减计算器资料

汇编语言实现十进制加减计算器资料

课程设计题目十进制数加减计算器学院计算机科学与技术专业计算机科学与技术班级计算机0808班姓名何爽指导教师袁小玲2010 年12 月31 日课程设计任务书学生姓名:何爽专业班级:计算机0808班指导教师:袁小玲工作单位:计算机科学与技术学院题目: 十进制数加减计算器的设计初始条件:理论:学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。

实践:计算机学院科学系实验中心提供计算机和软件平台。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)十进制数加减计算器的设计。

(2)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。

(3)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。

(4)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:在正文第一行写课程设计题目;1.需求说明(要求、功能简述)或问题描述;2.设计说明(简要的分析与概要设计);3.详细的算法描述;4.源程序与执行结果(含测试方法和测试结果);5.使用说明;6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。

时间安排:设计时间一周:周1:查阅相关资料。

周2:系统分析,设计。

周3~4:编程并上机调试。

周5:撰写课程设计报告。

设计验收安排:20周星期五8:00起到计算机学院科学系实验中心进行上机验收。

设计报告书收取时间:20周的星期五下午5:00之前。

指导教师签名: 2010年12月31日系主任(或责任教师)签名: 2010年12月31日目录1.需求说明 (4)2.设计说明 (4)2.1 简要分析 (4)2.2 概要设计 (4)2.2.1 主要模块 (4)2.2.2 主函数结构 (5)3.详细的算法描述 (6)3.1 详细的算法描述 (6)3.2 算法流程图 (11)3.2.1 程序流程图 (11)3.2.2 输入函数(inputdec)流程图 (12)3.2.3 输出函数(outputdec)流程图 (12)3.2.4 输出算术表达式函数(show)流程图 (13)4.源程序与执行结果 (13)4.1 源程序 (13)4.2 执行结果 (19)4.2.1 测试方法 (19)4.2.2 测试结果 (19)5.使用说明 (20)6.总结 (21)十进制数加减计算器的设计1.需求说明十进制数加减计算器的设计,要求完成:(1)用汇编语言正确编写程序,完成简单的十进制数的加减运算,(2)求能正确进行输入和输出操作,界面追求友好,尽量实现菜单操作(3)用若干测试用例来测试程序的正确性2.设计说明2.1 简要分析要正确、友好地完成用汇编语言设计十进制数的加减计算器,我们应该完成以下几个功能:(1)相关菜单及字符输出的设计(2)十进制数的输入(3)十进制数的输出(4)加法运算(5)减法运算(6)输出运算表达式(7)回车换行功能(因为为了控制格式,经常要用到)2.2 概要设计2.2.1 主要模块(1)菜单及字符menu db ‘|--------------------------------------|’0dh,0ahdb ‘| 1.Add |’0dh,0ahdb ‘| 2.Sub |’0dh,0ahdb ‘| 0.Exit |’0dh,0ahdb ‘|--------------------------------------|’0dh,0ahdb ‘Please input your choice:$’mess1 db 'Please input the first number: $'mess2 db 'Please input the second number: $'mess3 db 'The result is : $'mess4 db '-$'mess5 db '+$'mess6 db '=$'(2)十进制数的输入inputdec proc实现代码retinputdec endp(3)十进制数的输出outputdec proc实现代码retoutputdec endp(4)加法运算addfun proc显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做加法运算显示mess3 ;提示输入第一个数call show ;输出运算表达式retaddfun endp(5)减法运算subtract proc显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做减法运算显示mess3 ;提示输入第一个数call show ;输出运算表达式retsubtract endp(6)输出运表达算式函数show proccall outputdec ;输出第一个数输出运算符号call outputdec ;输出第二个数输出等号call outputdec ;输出运算结果retshow endp(7)回车换行crlf proc实现代码retcrlf endp2.2.2 主函数结构main proc显示menu ;供选择输入选项判断选项Case 1: call addfunCase 2: call subtractCase 3: 退出程序main endp3.详细的算法描述3.1详细的算法描述(1)main函数main procpush dsxor ax,axpush axmov ax,datamov ds,axks:lea dx,menu ;输出菜单项mov ah,09hint 21hmov al,0mov ah,01h ;输入选择项int 21hsub al,30hcmp al,2 ;判断选择项jz l2 ;如果输入为2 ,则跳转到l2cmp al,1jz l1 ;如果输入为1,则跳转到l1mov ah,4ch ;这两句为正常返回dos界面int 21hl1:call addfun ;调用加法函数jmp ks ;返回到菜单l2: call subtract;调用减法操作jmp ks ;返回到菜单main endp(2)addfun函数(加法运算函数)addfun proccall crlfmov bp,1 ;给下面的show输出中间的运算符做标记,1为加号 lea dx,mess1 ;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov si,bx ;第一个数保存在si中lea dx,mess2 ;给出输入第二个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第二个数mov di,bx ;第二个数保存在di中mov bx,si ;将第一个数保存到bx中,再进行操作,以免影响到的输出 add bx,di ;第一个数和第二个数相加,结果保存在bx中lea dx,mess3 ;给出输出结果的提示信息mov ah,09hint 21hcall show ;调用show函数,输出算术表达式ret ;返回函数调用处addfun endp(3)subtract函数(减法运算函数)subtract proccall crlfmov bp,2 ;给下面的show输出中间的运算符做标记,2为减号lea dx,mess1;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov si,bx ;第一个数保存在si中lea dx,mess2 ;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov di,bx ;第二个数保存在di中mov bx,sicmp bx,di ;比较第一个数和第二人数的大小js subl1 ;如果为负(第一个数小一些)则跳转sub bx,di ;否则直接进行计算,结果保存在bx中jmp subl2subl1:mov bp,3 ;为show里面是否输出负号作准备,3的时候要输出负号push di ;先将第二个操作数进栈,否则下面的减法操作会将其值改变 sub di,bxmov bx,dipop di ;第二个操作数出栈,再赋给di寄存器subl2:lea dx,mess3 ;输出运算表达式的提示mov ah,09hint 21hcall show ;调用show函数,输出运算表达式retsubtract endp(4)inputdec函数(十进制输入函数)inputdec procmov bx,0il0:mov ah,01h ;输入数字int 21hcmp al,0dh ;判断是否为回车jz iexit ;如果是回车,则返回到函数调用处sub al,30h ;得到输入数字的真实大小mov ah,0xchg bx,ax ;将bx值与ax值交换,因为下面乘以10是将ax中的值乘10 mov cx,10 ;注意,这里不能用CL,否则数较大时就会出现问题mul cx ;将ax中的值乘以10,也就是将bx中原来的值乘以10add bx,axjmp il0 ;进行输入下一数值位iexit:call crlfretinputdec endp(5)outputdec函数(十进制输出函数)outputdec procpush bpmov bp,0 ;前导0输出与否的标志,0时不输出,1时输出mov ax,bxmov dx,0 ;在进行除法之前,要对dx赋0,否则结果出错mov cx,10000div cx ;除法,字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp dl,0 ;将万位同0比较jz ol0 ;如果万位为0则不输出万位mov bp,1 ;如果万位不为0,则应将bp设为1,以后的0都要输出or dl,30hmov ah,02hint 21h ;输出万位ol0:mov ax,bx ;输出千位的方法与万位相同mov dx,0mov cx,1000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol1or dl,30hmov ah,02hint 21h ;输出千位jmp ol2ol1:cmp dl,0jz ol2mov bp,1or dl,30hmov ah,02hint 21h ;输出千位ol2:mov ax,bx ;输出百位与千位、万位方法相同mov dx,0mov cx,100div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol3mov bp,1or dl,30hmov ah,02hint 21h ;输出百位jmp ol4ol3:cmp dl,0jz ol4or dl,30hmov ah,02hint 21h ;输出百位ol4:mov ax,bx ;输出十位的方法与前面几位方法相同mov cl,10div cl ;字节操作,商在al中,余数在ah中mov bl,ah ;保存余数,作为下一次裤除数,也就是个位数mov dl,alcmp bp,0jz ol5mov bp,1or dl,30hmov ah,02hint 21h ;输出十位jmp ol6ol5:cmp dl,0jz ol6or dl,30hmov ah,02hint 21h ;输出十位ol6:mov dl,bl ;在上面,bl中的数直接就应该为个位,所以直接输出or dl,30hmov ah,02hint 21hpop bp ;恢复bpretoutputdec endp(6)show函数(输出运算表达式函数)show procpush bx ;把运算结果保存起来mov bx,si ;第一个数放在si中call outputdec;输出第一个数cmp bp,3 ;是否为减号jz sl0cmp bp,2 ;判断是否为减号jz sl0lea dx,mess5 ;输出加号mov ah,09hint 21hjmp sl1sl0:lea dx,mess4 ;输出减号mov ah,09hint 21hsl1:mov bx,di ;第二个数放在di中call outputdec ;输出第二个数lea dx,mess6 ;输出等号mov ah,09hint 21hcmp bp,3 ;判断是否需要输出负号 jnz sl2lea dx,mess4 ;输出负号mov ah,09hint 21hsl2:pop bx ;得到运算结果call outputdec;输出运算结果call crlfretshow endp(7)crlf函数(输出回车换行函数)crlf procpush axpush dxmov ah,02hmov dl,0dh ;输出回车int 21hmov dl,0ah ;输出换行int 21h ;ah值被改变 pop dxpop axretcrlf endp3.2 算法流程图3.2.2 十进制输入(inputdec)流程图3.2.3 十进制输出3.2.4 输出算术表达式(show)流程图4.4.1 源程序assume cs:code,ds:datadata segment ;定义数据段menu db ‘|--------------------------------------|’0dh,0ah db ‘| 1.Add |’0dh,0ah db ‘| 2.Sub |’0dh,0ah db ‘| 0.Exit |’0dh,0ahdb ‘|--------------------------------------|’0dh,0ahdb ‘Please input your choice:$’mess1 db 'Please input the first number: $'mess2 db 'Please input the second number: $'mess3 db 'The result is : $'mess4 db '-$'mess5 db '+$'mess6 db '=$'data ends ;数据段结束code segment ;定义代码段main proc ;主函数push dsxor ax,axpush axmov ax,datamov ds,axks:lea dx,menumov ah,09hint 21hmov al,0mov ah,01hint 21hsub al,30hcmp al,2jz l2cmp al,1jz l1mov ah,4chint 21hl1:call addfunjmp ksl2: call subtractjmp ksmain endp ;主函数结束addfun proc ;加法运算函数call crlfmov bp,1 ;给下面的show输出中间的运算符做标记 lea dx,mess1mov ah,09hint 21hcall inputdecmov si,bx ;第一个数保存在si中lea dx,mess2int 21hcall inputdecmov di,bx ;第二个数保存在di中mov bx,siadd bx,dilea dx,mess3mov ah,09hint 21hcall show ;输出结果retaddfun endp ;加法运算函数结束subtract proc ;减法运算函数call crlfmov bp,2 ;给下面的show输出中间的运算符做标记 lea dx,mess1mov ah,09hint 21hcall inputdecmov si,bx ;第一个数保存在si中lea dx,mess2mov ah,09hint 21hcall inputdecmov di,bx ;第二个数保存在di中mov bx,sicmp bx,dijs subl1 ;如果为负则跳转sub bx,dijmp subl2subl1:mov bp,3 ;为show里面是否输出负号作准备push disub di,bxmov bx,dipop disubl2:lea dx,mess3mov ah,09hint 21hcall showretsubtract endp ;减法运算函数结束inputdec proc ;十进制输入函数il0:mov ah,01hint 21hcmp al,0dh ;判断是否为回车jz iexitsub al,30hmov ah,0xchg bx,axmov cl,10mul cladd bx,axjmp il0iexit:call crlfretinputdec endp ;十进制输入函数结束outputdec proc ;十进制输出函数push bp ;用来做前导0的标记mov bp,0mov ax,bxmov dx,0 ;在进行除法之前,要对dx赋0,否则结果over devide mov cx,10000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp dl,0jz ol0mov bp,1or dl,30hmov ah,02hint 21h ;输出万位ol0:mov ax,bxmov dx,0mov cx,1000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol1or dl,30hmov ah,02hint 21h ;输出千位jmp ol2ol1:cmp dl,0jz ol2mov bp,1or dl,30hmov ah,02hint 21h ;输出千位ol2:mov ax,bxmov dx,0mov cx,100div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol3or dl,30hmov ah,02hint 21h ;输出百位jmp ol4ol3:cmp dl,0jz ol4mov bp,1or dl,30hmov ah,02hint 21h ;输出百位ol4:mov ax,bxmov cl,10div cl ;字节操作,商在al中,余数在ah中 mov bl,ah ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol5or dl,30hmov ah,02hint 21h ;输出十位jmp ol6ol5:cmp dl,0jz ol6mov bp,1or dl,30hmov ah,02hint 21h ;输出十位ol6:mov dl,blor dl,30hmov ah,02hint 21hpop bp ;恢复bpretoutputdec endp ;十进制输出函数结show proc ;输出运算式函数push bx ;把运算结果保存起来 mov bx,si ;第一个数放在si中 call outputdeccmp bp,3 ;是否为减号jz sl0cmp bp,2jz sl0lea dx,mess5mov ah,09hint 21hjmp sl1sl0:lea dx,mess4mov ah,09hint 21hsl1:mov bx,di ;第二个数放在di中 call outputdeclea dx,mess6mov ah,09hint 21hcmp bp,3jnz sl2lea dx,mess4mov ah,09hint 21hsl2:pop bx ;得到运算结果call outputdeccall crlfretshow endp ;输出运算式函数结束crlf proc ;回车换行函数push axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21h ;ah值被改变pop dxpop axretcrlf endp ;回车换行函数结束code ends ;代码段结束end main ;程序结束4.2 执行结果4.2.1 测试方法本次测试我们采用的是通过菜单形式,输出选择项,然后根据提示信息,输入相关数字,进行举例测试。

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

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

汇编程序大作业云南大学软件学院实验报告指导教师 (签名):实验内容: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。

汇编语言实验4涉及压缩BCD码数据的转换程序及DEBUG练习[优质参考]

汇编语言实验4涉及压缩BCD码数据的转换程序及DEBUG练习[优质参考]

ASCII码与BCD码之间的转换1)字符的ASCII码表示计算机中存储的信息很多,其中一部分是用于数学计算的数据,另一部分则是表示某种含义的字符或字符串。

由于从键盘输入的或屏幕显示的信息,都是用字符串的形式表示的。

因此,微机中必须能够存储和处理字符和字符串。

计算机中使用的字符包括有如下4类:·字母:A、B、C、…、Y、Z、a、b、c、…、y和z。

.数字:0、1、2、3、 (9)·专用符号:!、@、+、-、﹡、/、……·控制字符:BEL(响铃)、LF(换行)、CR(回车)……这些字符在计算机内部都由特定的二进制数表示。

目前在微机中,最常用的字符表示法是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)。

在这种表示法中,每一个字符可以表示为一个8位的二进制数,即一个字节。

其中。

低7位用于表示该字符的ASCII值,最高位未定义,一般可用作奇偶校验位。

常用字符的ASCII码表见表1.2。

2)、十进制数的BCD码表示BCD码(Binary Code Decimal),又称“二进制表示的十进制数”,是一种非常适合数据输出的编码。

一般而言,它可分为如下两种:(1)、压缩型BCD码:它用4位二进制数表示一位十进制数。

即采用二进制数0000~1001分别表示十进制数中的0~9,而另6种组合1010~1111在BCD中则不允许出现;(2)、非压缩型BCD码:它用8位二进制数,即一个字节表示一位十进制数。

其高4位固定为0,而低4位采用二进制数0000~1001分别表示十进制数中的0~9。

亦即用0000 0000~0000 1001分别表示十进制数中的0~9。

而其余组合则不允许出现。

表1列出了十进制数与BCD编码的对应关系。

1.按如下步骤操作,了解DEBUG 命令及其使用方法。

(1)打 DEBUG 进入 DEBUG 控制,显示提示符 '_ '。

数之间相互转化汇编实验报告

数之间相互转化汇编实验报告

数之间相互转化一、程序设计要求1.转化内容选择下列一项:二进制数→十六进制数显示,二进制数→十进制数显示,十进制数→二进制数显示,十进制数→十六进制数显示,十六进制数→二进制数显示。

2.给出适当的文字提示3.程序要求保护措施,对于非法键入不受理,但回显,显示错误信息。

4.具体显示格式,例如:0111100010011010=789AH二、程序设计思路程序实现功能:1.提示用户输入小于10000的十进制数;2.判断输入是否合法,在输入非法时给出错误信息;3.将用户输入小于10000的十进制数其以十六进制形式输出。

主程序设计思路:第一步:调用INT21的0A号功能等待用户键入一串字符串,要求用户输入小于10000的十进制数即输入字符个数不能超过4,并将输入字符串送入数据缓冲区;第二步:判断输入的字符串长度是否超过4,若超过则输出错误信息,返回DOS;若没有超过继续;第三步:将用户输入的十进制数转化成二进制数保存;第四步:将二进制数转化为十六进制数保存;第五步:输出十六进制数;输入十进制数转化成二进制数的设计思路:第一步:判断输入的字符串是否为十进制数,若字符串中有不是数字的立即退出;第二步:将输入的字符串中的各字符转化成数字,由此得到十进制数各位上的数;第三步:通过1000千位数字百位数字100+十位数字10+个位数字求得该十进⨯+⨯⨯制数,存在于计算机中即为二进制数。

二进制数转化成十六进制数的设计思路:第一步:定义一个4个字节的单元用来存放十六进制形式;第二步:将二进制数存入DX寄存器中,将EDX寄存器中的数左移十六位,将十六位二进制数全部置于EDX的高十六位;第三步:将置于EDX高十六位的数从高位开始,每次取出四位数,并将其转化成字符存于存储单元,直至十六位数全部转化完。

其中,每次取四位数是通过循环左移四位数到DL的低四位实现的。

三、程序设计流程图开始显示操作提示输入字符串->BUF1光标移至输入的字符串后实际键入字符个数->CX调用S_N2ASCCX>4?调用N10_N2ASC输出十六进制数显示错误信息结束返回DOSNY主程序流程图AX->DX将EDX 算术左移16位BUF2+1->SI 4->COUNT将EDX 循环左移4位DL 高4为清零DL>=10DL+7->DLDL+30->DL SI+1->SI COUNGT 减1COUNT=0?返回主程序YYNN子程序N2_16ASC流程图BUF1+2地址->SI0->AX[SI]->BLBL>=3AH?BL<30H?BL-30H->BL 0->BHCALL MUL10SI+1->SI CX-1->CXCX=0?显示错误信息返回DOS返回主程序NY YNYN子程序S_N2ASC流程图四、源程序;--------------------------------------------------------------------------------------------------------------------- ;程序功能:将用户输入小于10000的十进制数其以十六进制形式输出;---------------------------------------------------------------------------------------------------------------------.486 DA TASEGMENT USE16 ;数据段MESG1 DB 'Please enter a decimal number less than 10000!',0DH,0AH,'$' MESG2 DB 0DH,0AH,'Error! Y our input is larger than 10000!',0DH,0AH,'$' MESG3 DB 0DH,0AH,'Error! Y our input is not a number!',0DH,0AH,'$' BUF1 DB 6DB ?DB 6 DUP(?)BUF2 DB '=',4 DUP(?),'H $' COUNT DB 4DA TA ENDS;---------------------------------------------------------------------------------------------------------------------CODE SEGMENT USE16 ;代码段ASSUME CS:CODE,DS:DA TABEG: ;数据段初始化MOV AX,DA TAMOV DS,AXMOV AH,9 ;显示操作提示MOV DX,OFFSET MESG1INT 21H;等待键入一个不超过4位的十进制数MOV AH,0AHMOV DX,OFFSET BUF1INT 21HMOV AH,3 ;读取光标当前的位置MOV BH,0INT 10HMOV CL,BUF1+1 ;实际键入字符个数->CXMOV CH,0;将光标预置到用户输入的字符后MOV AH,2ADD DL,CLINT 10H;判断输入的字符是否超过4个CMP CX,5JNC ERROR1CALL S_N2ASC ;调用S_N2ASC;将输入的十进制数转换成二进制数CALL N2_16ASC ;调用N2_16ASC;将二进制数转换成十六进制数MOV AH,9 ;输出BUF2的内容MOV DX,OFFSET BUF2INT 21HJMP EXITERROR1: ;显示错误信息MOV AH,9MOV DX,OFFSET MESG2INT 21HEXIT:MOV AH,4CHINT 21H;---------------------------------------------------------------------------------------------------------------------;子程序功能:实现AX*10+BX->AX;---------------------------------------------------------------------------------------------------------------------MUL10 PROCMOV DX,10MUL DXADD AX,BXRETMUL10 ENDP;---------------------------------------------------------------------------------------------------------------------;子程序功能:将输入的十进制数的字符串转换成二进制数;---------------------------------------------------------------------------------------------------------------------S_N2ASC PROCMOV SI,OFFSET BUF1+2MOV AX,0 ;AX清零AGIN:MOV BL,[SI]CMP BL,3AH ;判断输入的字符是否是'0'~'9',若不是转JNC ERROR2CMP BL,30HJC ERROR2SUB BL,30H ;字符转成ACSII码MOV BH,0CALL MUL10 ;完成AX*10+BX->AXINC SILOOP AGINJMP WELL ;成功转换转WELLERROR2:MOV AH,9 ;显示错误信息并返回DOSMOV DX,OFFSET MESG3INT 21HMOV AH,4CHINT 21HWELL: RETS_N2ASC ENDP;---------------------------------------------------------------------------------------------------------------------;子程序功能:将DX中的二进制数转十六进制ACSII码;---------------------------------------------------------------------------------------------------------------------N2_16ASC PROCMOV DX,AXSAL EDX,16 ;左移16位,为实现从高位取4位数准备MOV SI,OFFSET BUF2+1 ;MESG2+6的地址->SIMOV COUNT,4 ;计数LAST:ROL EDX,4 ;循环左移4位AND DL,0FH ;将DL的高4为清零;保证DL中只存在4位二进制数CMP DL,10 ;将4位的十六进制数转化成ACSII码JC NEXTADD DL,7NEXT:ADD DL,30HMOV [SI],DL ;将得到的ACSII->[SI]INC SIDEC COUNT ;计数JNZ LASTRETN2_16ASC ENDP;---------------------------------------------------------------------------------------------------------------------CODE ENDSEND BEG五、测试用例及结果分析1.运行程序,输入12345时,在屏幕上显示错误信息,如下:结果分析:输入的数超过了10000,故显示以上信息。

用汇编实现大数的加减运算

用汇编实现大数的加减运算

⽤汇编实现⼤数的加减运算1.⼤数加法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;进位标志位len1 db 0;记录A的位数len2 db 0;B的位数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:MOV AX,DATASMOV DS,AXmov es,axxor ax,axin1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1inc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz sajg xymov count,alsub al,blmov cl,al@@:mov [di],0xy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bsa:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志clcfg:;2个数组addmov bl,[si]cmp temp,1clcjnz p3stcp3:mov temp,0adc bl,[di]cmp bl,10jl p2sub bl,10mov temp,1p2:push bxinc diinc siloop fgcmp temp,1jnz p1mov bl,1;最⾼位有进位,加1位并置1 push bxinc countp1:mov cl,0@@:;清除前⾯多余的0cmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:4986746546546879879849867553453442.⼤数减法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;标志位len1 db 0;记录A的位数len2 db 0;BDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:in1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9 jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1@@:;将数组A倒置pop axmov [di],alinc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9 cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:lea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz comjg xymov count,alsub al,blmov cl,al@@:mov [di],0inc diloop @Bjmp sbaxy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bjmp sabmov cl,countlea di,Alea si,B;⽐较a/b⼤⼩com:mov bl,[di]cmp bl,[si]sab:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg1:mov bl,[di]sub bl,tempmov temp,0cmp bl,[si]jge p3add bl,10mov temp,1p3:sub bl,[si]push bxinc diinc siloop fg1jmp p1;;a<b是让b-asba:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg2:;2个数组submov bl,[si]sub bl,tempmov temp,0cmp bl,[di]jge p32add bl,10mov temp,1p32:mov dl,2DH ;输⼊‘-’mov ah,2int 21h;p1:mov cl,0@@:;清除前⾯多余的0 pop axinc clcmp cl,countjz @Fcmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:416546546 87987987979-87571441433。

基于汇编语言的32位二进制、十进制转换及应用

基于汇编语言的32位二进制、十进制转换及应用

基于汇编语言的32位二进制、十进制转换及应用随着计算机技术的发展,汇编语言已经成为了一种非常重要的编程语言之一。

在汇编语言中,二进制和十进制数的转换是非常常见的操作。

在本文中,我们将介绍如何使用汇编语言进行32位二进制和十进制数的转换,并探讨其应用。

在汇编语言中,我们可以使用MOV指令将数据从一个寄存器移动到另一个寄存器中。

对于32位二进制数,我们可以使用MOV指令将其存储到EAX寄存器中。

例如,要将二进制数1010 1011 1101 0001 0000 0011 1110 0011存储到EAX寄存器中,我们可以使用以下指令: MOV EAX, 0xABD103E3对于十进制数,我们可以使用IMUL指令进行乘法运算,并将结果存储到指定的寄存器中。

例如,要将十进制数4294967295存储到EBX寄存器中,我们可以使用以下指令:MOV EAX, 4294967295IMUL EBX, EAX在进行二进制和十进制数之间的转换时,我们可以使用循环和移位操作来实现。

对于二进制数转换为十进制数,我们可以使用以下代码:MOV EAX, 0xABD103E3 ; 将二进制数存储到EAX寄存器中MOV ECX, 0 ; 用于统计位数的计数器MOV EBX, 0 ; 存储十进制结果的寄存器convert_loop:SHR EAX, 1 ; 右移一位JC carry ; 如果最低位为1,跳转到carry标签 INC ECX ; 统计位数JNZ convert_loop ; 如果EAX不为0,跳转到convert_loop 标签MOV EAX, 0xABD103E3 ; 重新将二进制数存储到EAX寄存器中 convert_loop2:SHL EAX, 1 ; 左移一位JC over ; 如果最高位为1,跳转到over标签ADD EBX, EBX ; 将结果乘2JNZ convert_loop2 ; 如果EBX不为0,跳转到convert_loop2标签JMP donecarry:ADD EBX, 2^ECX ; 将2^ECX加到结果中INC ECX ; 统计位数JNZ convert_loop ; 如果EAX不为0,跳转到convert_loop 标签JMP doneover:ADD EBX, 1 ; 将1加到结果中JMP convert_loop2done:; EBX中存储的即为转换后的十进制数对于十进制数转换为二进制数,我们可以使用以下代码:MOV EAX, 123456789 ; 将十进制数存储到EAX寄存器中MOV EBX, 0 ; 存储二进制结果的寄存器MOV ECX, 31 ; 计数器,从高位开始计算convert_loop:CMP ECX, 0 ; 如果计数器为0,跳转到done标签 JE doneMOV EDX, 2MOV ESI, ECXconvert_loop2:SUB ESI, 1CMP ESI, 0JE convert_loop3IMUL EDX, 2JMP convert_loop2convert_loop3:CMP EAX, EDXJB convert_loop4SUB EAX, EDXOR EBX, 1 << ECXJMP convert_loopconvert_loop4:JMP convert_loop2done:; EBX中存储的即为转换后的二进制数除了进行二进制和十进制数之间的转换外,汇编语言还可以应用于其他方面,例如位运算、加密算法、驱动程序等。

总汇编语言实验4涉及压缩BCD码大数据地转换程序及DEBUG练习

总汇编语言实验4涉及压缩BCD码大数据地转换程序及DEBUG练习

实用文档ASCII码与BCD码之间的转换1)字符的ASCII码表示计算机中存储的信息很多,其中一部分是用于数学计算的数据,另一部分则是表示某种含义的字符或字符串。

由于从键盘输入的或屏幕显示的信息,都是用字符串的形式表示的。

因此,微机中必须能够存储和处理字符和字符串。

计算机中使用的字符包括有如下4类:·字母:A、B、C、…、Y、Z、a、b、c、…、y和z。

.数字:0、1、2、3、 (9)·专用符号:!、、+、-、﹡、/、……·控制字符:BEL(响铃)、LF(换行)、CR(回车)……这些字符在计算机部都由特定的二进制数表示。

目前在微机中,最常用的字符表示法是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)。

在这种表示法中,每一个字符可以表示为一个8位的二进制数,即一个字节。

其中。

低7位用于表示该字符的ASCII值,最高位未定义,一般可用作奇偶校验位。

常用字符的ASCII码表见表1.2。

2)、十进制数的BCD码表示BCD码(Binary Code Decimal),又称“二进制表示的十进制数”,是一种非常适合数据输出的编码。

一般而言,它可分为如下两种:(1)、压缩型BCD码:它用4位二进制数表示一位十进制数。

即采用二进制数0000~1001分别表示十进制数中的0~9,而另6种组合1010~1111在BCD中则不允许出现;(2)、非压缩型BCD码:它用8位二进制数,即一个字节表示一位十进制数。

其高4位固定为0,而低4位采用二进制数0000~1001分别表示十进制数中的0~9。

亦即用0000 0000~0000 1001分别表示十进制数中的0~9。

而其余组合则不允许出现。

表1列出了十进制数与BCD编码的对应关系。

1.按如下步骤操作,了解DEBUG 命令及其使用方法。

(1)打 DEBUG 进入 DEBUG 控制,显示提示符 '_ '。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
str12db240dup(' '),9dup(' '),'Thank you!!!',412dup(' ')
clear_screen MACRO;清屏宏定义
movah,06h
moval,0
movbh,0f0h;白底黑字
movch,0;从0行0列到23行79列清屏
movcl,0
movdh,23
movdl,79
●设计
1运行的设计框图
2整个系统的设计框图
3子程序之间调用关系框图的宏定义,对于输入时的宏定义有charin,strin,numin,输出时的宏定义有charout,strout,numout,输出的时候用到的是栈push和pop,在压栈push时,用到了irp不定重复伪操作。
最后我们几个商量着完成了实验报告和ppt的制作,经过我们几个人的努力,虽然做的不是特别好,但还是各有收获。
三、需求分析与设计
●需求分析
通过编程实现显示菜单,然后通过键盘输入菜单相应的选项进入相应的数制转换,然后通过选项对应的子程序跳转来实现转换,子程序中通过宏定义定义数制前后的数制,并且在宏定义过程中实现数制转换算法,最后输出转换后的进制数。
程序运行源代码如下:
;*************************************************************************************
datasegment
spacedb1000dup(' ')
str1db10dup(' '),9dup(' '),'Welcome to shuzhizhuanhuan!!!',52dup(' ')
db10,13,'* d.octal 8 to binary 2 *'
db10,13,'* e.octal 8 to decimal 10 *'
db10,13,'* f.octal 8 to hexadecimal 16 *'
db10,13,'* g.decimal 10 to binary 2 *'
定义通用inax宏,确定转换之前的进制,例如inax cx、cx=2是把转换之前的进制确定为2存到cx中
定义通用outax宏,确定转换之后的进制,例如outax bx、bx=2是把转换之后的进制确定为2存到bx中
通用宏charin逐个输入转换之前进制字符
输入的具体框图如下:
输出的具体框图如下
四、代码及分析
str32db'the octal string is:',10,13,'$'
str33db'the decimal string is:',10,13,'$'
;10进制转换为2进制和8进制和16进制
str4db10,13,'please input the decimal string:',10,13,'$'
db10,13,'* h.decimal 10 to octal 8 *'
db10,13,'* i.decimal 10 to hexadecimal 16 *'
db10,13,'* j.hexadecimal 16 to binary 2 *'
db10,13,'* k.hexadecimal 16 to octal 8 *'
;2进制转换为16进制和10进制和8进制
str2db10,13,'please input the binary string:',10,13,'$'
str21db'the hexadecimal string is:',10,13,'$'
str22db'the decimal string is:',10,13,'$'
二.小组成员及具体分工
小组成员:王兵茹李夏蕾胡佳奇
具体分工:我们三个一开始是各自的分工查资料,先看看单个数制转换,王兵茹负责的是十六进制,李夏蕾负责的是十进制,胡佳琪负责的是二进制。
最后我们几个一起完成了程序的主要设计,由于大体思路相同,最后加上了八进制的转换。
在程序的修改方面,王兵茹进行了后期的加工,增加了dios中断,把单调的退出改成文本形式下的退出,在退出之前,执行清屏。
db10,13,'* l.hexadecimal 16 to decimal 10 *'
db10,13,'* m.exit *'
db10,13,'*************************************************',10,13,'$'
;**************************************************************
db10,13,'* please choice action: *'
db10,13,'* a.binary 2 to octal 8 *'
db10,13,'* b.binary 2 to decimal 10 *'
db10,13,'* c.binary 2 to hexadecimal 16 *'

《汇编语言程序设计》
综合程序设计实验报告
题目:数制转换器
班级:信1101-2班
姓名:王兵茹李夏蕾
胡佳奇
学号:20112917 20112912
20113013
完成日期:2013-11-24
一、简介
二、小组成员及具体分工
三、需求分析与设计
四、代码及分析
五、总结
一、简介
本设计利用汇编语言来实现数制转换设计,用于方便进制之间的互换。设计的内容可以使十六进制、八进制、二进制、十进制的数制互相转换。
str23db'the octal string is:',10,13,'$'
;16进制转换为2进制和8进制和10进制
str3db10,13,'please input the hexadecimal string:',10,13,'$'
str31db'the binary string is:',10,13,'$'
int 10h
movdx,0;光标在左上角
movah,2
int 10h;调用bios
ENDM
menudb10,13,'*************************************************'
db10,13,'*************************************************'
相关文档
最新文档