汇编数值转换器大作业

合集下载

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

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

《汇编语言程序设计》综合程序设计实验报告题目:数制转换器班级:信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 控制,显示提示符 '_ '。

用汇编语言做成计算器

用汇编语言做成计算器

用汇编语言做成计算器(论文)摘要:用汇编语言做成计算器;首先从键盘输入合法中缀算术表达式,并将其存储到S1中;然后调用子程序CHANGE将中缀式转化为后缀式;第三,调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中;第四,POP AX,AX->STORAGE,即用STORAGE 存放最终运算结果将栈中保存的最后运算结果弹出,并保存到STORAGE中;最后,调用子程序OUTPUT将运算结果输出。

关键词:计算器寻址方式汇编程序寄存器数据传送流程图引言:作此课程设计前我用数据结构将中缀表达式转换为后缀表达式,并用后缀表达式计算出表达式结果,再转化为汇编语言确实遇到些困难:首先遇到的问题是如何判断运算符号的优先级;其次遇到的问题是如何输出一个负数;再一个就是该如何输入一个负数;还有就是如何输出两位及两位以上的数据。

但一切困难在经过努力思考后都解决了。

编程时应先进行需求分析,将程序分成几个功能模块,然后将功能一个一个地实现,这是一种比较好也比较快的编程方法。

正文:一、计算器的具体功能:输入一个正数后按回车可以直接输出该正数;输入一个负数后按回车可以直接输出该负数;可以进行有符号数的加运算;可以进行有符号数的减运算;可以进行有符号数的加、减运算;可以进行有符号数的乘运算;可以进行有符号数的除运算;可以进行有符号数的乘、除运算;可以进行有符号数的加、减、乘、除四则运算;支持使用括号改变运算顺序;输入一个数值不是很大的合法的算术表达式并按回车,可以得到正确的结果。

二、程序设计中用到的汇编知识点:寄存器寻址方式;变址寻址方式;立即寻址方式;变量的使用;标号的使用;数据传送指令MOV ;加1指令INC;比较指令CMP;键盘输入(1号调用);顺序程序设计;简单条件转移指令JNE;无条件转移指令JMP;循环程序设计;进栈指令PUSH;出栈指令POP;地址表达式的使用;类型运算符PTR;简单条件转移指令JE;有符号条件转移指令JG,JGE,JLE;无条件转移指令JMP;分支程序设计;循环程序设计;子程序调用指令CALL;子程序返回指令RET;有符号乘指令IMUL;有符号除指令IDIV;逻辑乘指令AND;求补指令NEG;有符号除指令IDIV;显示字符串(9号调用);有符号条件转移指令JGE等。

数制转化实验报告

数制转化实验报告

一、实验目的1. 理解数制转化的基本原理和方法。

2. 掌握十进制、二进制、八进制和十六进制之间的相互转换。

3. 熟悉汇编语言编程,提高编程能力。

二、实验环境1. 操作系统:Windows 102. 编译器:Keil uVision 53. 汇编语言:x86汇编语言三、实验内容1. 十进制到二进制的转换2. 二进制到八进制的转换3. 八进制到十六进制的转换4. 十六进制到十进制的转换四、实验步骤1. 十进制到二进制的转换(1)定义变量:src为十进制数,dst为二进制数。

(2)编写程序:```assemblymov ax, src ; 将十进制数src存入寄存器axmov cx, 32 ; 初始化循环计数器cx为32(二进制数32位)mov bx, 0 ; 初始化二进制数dst为0convert_loop:shl ax, 1 ; 将ax左移一位,最高位进入进位标志位jc carry_bit; 如果进位标志位为1,则跳转到carry_bitjmp next_bitcarry_bit:or bx, 1 ; 如果进位标志位为1,则将bx最低位设为1next_bit:loop convert_loop ; 循环32次mov dst, bx ; 将转换后的二进制数存入变量dst```(3)运行程序,查看结果。

2. 二进制到八进制的转换(1)定义变量:src为二进制数,dst为八进制数。

(2)编写程序:```assemblymov ax, src ; 将二进制数src存入寄存器axmov cx, 3 ; 初始化循环计数器cx为3(二进制数每3位转换一位八进制数)mov bx, 0 ; 初始化八进制数dst为0convert_loop:mov dx, ax ; 将ax的值复制到dxand dx, 0x07 ; 将dx与0x07进行按位与操作,保留最低3位add dl, '0' ; 将dl的值转换为对应的字符mov [dst], dl; 将转换后的八进制数存入变量dstshr ax, 3 ; 将ax右移3位,准备下一组3位loop convert_loop ; 循环3次```(3)运行程序,查看结果。

实验1-汇编语言语法练习与代码转换

实验1-汇编语言语法练习与代码转换
8
六、指导教师评语 (含学生能力达成度的评价)
成绩
批阅人
日期
评分项 评 遵守实验室规章制度
学习态度
算法思想准备情况
程序设计能力

解决问题能力
课题功能实现情况
算法设计合理性
算法效能评价
回答问题准确度

报告书写认真程度
内容详实程度
文字表达熟练程度
其它评价意见
则 本次实验能力达成评价 (总成绩)
优秀
良好
; 程序跳转,如果最高位 是 1 那么就输出 1
JNC print0_max ;程序跳转, 如果最高位 是 0 那么就输出 0
Hale Waihona Puke print1_max: MOV DL , 31h ;把要在屏幕上输出的 字符 预先放到DL寄存器里边 ,
31h 表示字符 1
MOV AH , 2 ;把 要调用的系统功能的 第几号功能值放入 AH里边
2.运行截图 有3个负数,接下来分别显示最大和最小数的16位补码
实验报告
7
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
(一) 实验中遇到的主要问题及解决方法 1.普通的 DB 型只有 8 位,放不下 255 这个数 解决方法:改用 16 位 DW 型
(二)实验心得 第一次尝试用汇编写程序感觉很难,为了实现一个很简单的功能,不仅需要编写一长串代码, 期间还需要注意各种规范,如数据类型问题、运算时的正负号问题等。其中寄存器的数量少,感觉不 够用,很容易被新数据覆盖,所以需要及时把寄存器中的数据存入储存器中。虽然这次实验给人的体 验十分不友好,但是我也从中学到一段合格的程序的确是需要这样精打细磨出来的,通过实验我对数 据在内存中的二进制存放形式有了更深刻的理解。现在我还需要工具书的帮助,但相信熟能生巧,加 以时日我一定可以更流畅地编写一段程序。 (三)意见与建议(没有可省略)

汇编数值转换

汇编数值转换

汇编语言是一种低级编程语言,通常用于编写与计算机硬件紧密相关的程序。

在汇编语言中,数值转换可以通过使用特定的指令或宏来实现。

以下是一些常见的数值转换方法:1. 十进制转二进制:使用移位指令(例如SHL 或SHR)将十进制数转换为二进制数。

例如,将十进制数23 转换为二进制数可以执行以下指令:```assemblyMOV AX, 23 ; 将十进制数23 加载到AX 寄存器中SHL AX, 4 ; 将AX 寄存器中的值左移4 位,相当于将十进制数转换为二进制数```2. 二进制转十进制:使用加法指令将二进制数转换为十进制数。

例如,将二进制数1010010 转换为十进制数可以执行以下指令:```assemblyMOV AX, 01010010b ; 将二进制数1010010 加载到AX 寄存器中ADD AX, AX ; 将AX 寄存器中的值加到自身,相当于将二进制数转换为十进制数```3. 十六进制转十进制:使用移位和加法指令将十六进制数转换为十进制数。

例如,将十六进制数A3 转换为十进制数可以执行以下指令:```assemblyMOV AX, A3h ; 将十六进制数A3h 加载到AX 寄存器中SHL AX, 4 ; 将AX 寄存器中的值左移4 位,相当于将十六进制数转换为十进制数```4. 十进制转十六进制:使用移位和取模指令将十进制数转换为十六进制数。

例如,将十进制数255 转换为十六进制数可以执行以下指令:```assemblyMOV AX, 255 ; 将十进制数255 加载到AX 寄存器中SHR AX, 4 ; 将AX 寄存器中的值右移4 位,相当于将十进制数转换为十六进制数```这些是常见的数值转换方法,具体实现方式可能会因汇编语言的语法和编译器而有所不同。

汇编进制转换实验

汇编进制转换实验

一、实验目的与要求1.熟悉二进制、十进制、十六进制转换规则2.熟悉算数运算指令及移位指令的运用。

二、实验逻辑原理图与分析(汇编—流程图)2.1 画实验逻辑原理图2.2 逻辑原理图分析(所应用单板机内部资源及外围接口芯片的核心分析)通过从键盘输入16进制的数,存入BX中,然后判断BX是否为0,如果BX不为0,则将BX/10余数压栈,如果BX为0,则出栈所有余数,这样输出来的数据就全部是10进制数了。

三、程序分析STACK SEGMENTDW 100H DUP(?)STACK ENDSdata segmentdat db 0dh,0ah,'$'data endscode segmentassume cs:code,ds:data,SS:STACKstart:mov ax,datamov ds,axmov dl,16;mov cx,2mov bx,0lp: ;从键盘输入字符,如果不是回车键或者是换行的话,就讲该字符转换成数字*16,保存到bx中mov ah,01hint 21hcmp al,0dhjz binarycmp al,3ahjl nextsub al,07hjmp nextnext:sub al,30h ;字符al减去30H得到相对应的数字cbwxchg ax,bxmul dl ;数字乘以16得到输入相对应的16进制数xchg ax,bxadd bx,axjmp lpbinary : lea dx,datmov ah,09hint 21hmov ax,bxmov cx,0MOV BX,10JYB1: XOR DX,DXDIV BX ;将BX除以10,将余数压栈ADD DL,30HPUSH DXinc cxcmp ax,0jnz JYB1JYB2: POP DX ;最后将余数都出栈,结合每次输出的10进制数,得带最终的10进制数MOV AH,2INT 21HLOOP JYB2mov dl,'D' ;输出'D'mov ah,2int 21hexit:mov ah,4chint 21hcode endsend start四、实验数据和结果分析4.1 实验结果数据4.2 结果数据分析输入数据是FF,当有数据,当第一个F输入时,转换成对应的数字15然后*16的到的值是240,然后当输入第二个F时,转换成对应的数字是15,与第一个数累加结果是255,存入BX,然后BX不断的除10,将余数压栈,直到BX为0时,余数全部出栈,第一次输出的值是2第二次输出的值是5,第三次输出的值也是5,所以全部的值是255也就是转换之后的结果。

基于汇编语言实现的通用数制转换程序

基于汇编语言实现的通用数制转换程序

基于汇编语言实现的通用数制转换程序[摘要]汇编语言是计算机相关专业的一门基础课程,在使用该语言时,将程序的计算结果按不同的数制形式显示输出是一个难点。

本文讨论了如何将数据通过转换,按照不同进制数的形式显示在显示器上,并给出了一个通用的数制转换程序具体实现这一过程。

[关键词]汇编语言;数制转换汇编语言是一种面向机器的语言,但它是计算机能提供给用户的最快最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言,因而汇编语言在程序设计中仍然占有很重要的位置,是不可取代的。

但是对于汇编语言编程来说,常常需要把十进制数转换为二进制数、十六进制数和八进制数,或者把十六进制数转换为十进制数、二进制数等等,并要求将结果在显示器上显示输出。

而汇编语言中实现数据的显示没有类似高级语言的输入输出语句,转换输出的工作是比较困难的。

下面我们来探讨一个通用的数制转换程序,使任何进制的数据按照编程者的要求转换为需要的数制形式显示在显示器上。

1 通用数制转换的原理通用数制转换的基本原理是:除N取余法。

1.1 十进制数转换为N进制数。

将十进制数转换为N进制数,我们常常使用的是除N取余法:将十进制数据除以N进制数的基数N,所得余数即为N 进制数个位上的数码,再将商除以N,余数为N进制数十位上的数码,如此反复进行,直到商是0为止。

例如,将十进制数5050转换为十六进制数,我们采用除N取余法实现:所以,(5050)10=(13BA)161.2P进制数转换为N进制数。

实际上,任何进制的数据需要转换成N进制数都可以采用“除N取余法”。

把一个P进制数转化为一个N进制数的过程,实际上是一个不断除N取余的过程。

转换原理:将需要转换的P进制数据除以N进制数的基数N,所得余数即为N进制数个位上的数码,再将商除以N,余数为N进制数十位上的数码,如此反复进行,直到商为0为止。

例如,将十六进制数13BA转换为十进制数。

采用除N取余法:用13BA不断的除以A(即使十进制基数10),所得的第一个余数为所求十进制数个位上的数码,再将商除以A,余数即所求十进制数十位上的数码,如此循环,直到商为0,结束运算。

汇编语言进制转换器

汇编语言进制转换器

这是一个用汇编语言编写的视线二、十、十六进制之间相互转换的程序代码。

data segment;*****主程序中的提示信息*****str1 DB 0AH,0DH, '********************************************$'str2 DB 0AH,0DH, '** **$'str3 DB 0AH,0DH, '*ca* welcome you ! **$'str4 DB 0AH,0DH, '** **$'str5 DB 0AH,0DH, '** this is programme of shuzhizhuanghuan **$'str6 db 0AH,0DH, '** **$'str7 db 0AH,0DH, '** press b to begin exchange! **$'str8 DB 0AH,0DH, '** press q to exit ! **$'str9 DB 0AH,0DH, '** **$'str10 DB 0AH,0DH, '********************************************$'str11 db 0ah,0dh,'input error,please repess!','$'ALTER db 0ah,0dhdb 0ah,0dhdb 'Please alter your option',0AH,0DHdb ' 1:Decimal number change into binary number',0AH,0DH;十进制转化为二进制db ' 2:Binary number change into decimal number',0AH,0DH;二进制转化为十进制db ' 3:Decimal number change into hexadecimal number',0AH,0DH;十进制转化为十六进制db ' 4:Hexadecimal number change into decimal number',0AH,0DH;十六进制转化为十进db ' 5:Binary number change into hexadecimal number',0AH,0DH;二进制转化为十六进制db ' 6:Hexadecimal number change into binary number',0AH,0DH;十六进制转化为二进制db ' 7:EXIT',0AH,0DH,'$'SHI db 'Please input a decimal number',0AH,0DH,'$';输入十进制数ER db 'Please input a Binary number',0AH,0DH,'$';输入二进制数SLIU db 'Please input a Hexadecimal number',0AH,0DH,'$';输入十六进制数WRO db 'You have input a wrong number,please input again!',0AH,0DH,'$' RES db 'The result is:',0AH,0DH,'$'data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dl,0AHmov ah,2int 21hdisp macro mlea dx,mmov ah,9int 21hendmdisp str1disp str3disp str4disp str5disp str6disp str7disp str8disp str9disp str10lop:mov ah,8int 21hcmp al,'b'jz ltolcmp al,'q'jz EXITdisp str11jmp lopltol:lea dx,ALTER;显示输入选择mov ah,9int 21hmov ah,1;输入选择int 21hcmp al,'1';如果是第一项跳转到子程序Onechange jz LAB1cmp al,'2';如果是第二项跳转到子程序Twochangejz LAB2cmp al,'3';如果是第三项跳转到子程序Therechange jz LAB3cmp al,'4';如果是第四项跳转到子程序Fourchangejz LAB4cmp al,'5'jz LAB5;如果是第五项跳转到子程序Fivechangecmp al,'6'jz LAB6;如果是第五项跳转到子程序Fivechange cmp al,'7';如果是第七项跳转到子程序EXITjz altcall WRONG;jmp STARTalt: lea dx,str1jmp startLAB1 : call Onechange;跳转到子程序Onechange jmp ltolLAB2:call Twochange;跳转到子程序Twochangejmp ltolLAB3:call Threechange;跳转到子程序Threechange jmp ltolLAB4:call Fourchange;跳转到子程序Fourchangejmp ltolLAB5:call Fivechange;跳转到子程序Fivechangejmp ltolLAB6:call Sixchange;跳转到子程序Fivechangejmp ltolEXIT:mov ah,4ch;退出DOS界面int 21h; 子程序Onechange;功能:把十进制转化为二进制数Onechange proc nearmov dl,0AHmov ah,2int 21hlea dx,SHI;显示输入十进制数mov ah,9int 21hMOV BX,0MOV SI,16newchar7:MOV AH,1INT 21hSUB AL,30hJL show1CMP AL,9dJG show1CBWXCHG AX,BX MOV CX ,10d MUL CXXCHG AX,BX ADD BX,AX JMP newchar7 show1:mov dl,0AHmov ah,2int 21hLEA DX,RES MOV AH,9INT 21hshow7:ROL BX,1MOV AL,BLAND AL,1hADD AL,30hMOV DL,ALMOV AH,2INT 21hDEC SIJNZ show7RETOnechange ENDP; 子程序Twochange;功能:把二进制转化为十进制数Twochange proc nearmov dl,0AHmov ah,2int 21hlea dx,ER;显示输入二进制数mov ah,9int 21hMOV BX,0MOV SI,16newchar2:MOV AH,1INT 21hSUB AL,30hJL show3CMP AL,10dJL add_to4JMP show3add_to4:MOV CL,1SHL BX,CLMOV AH,0ADD BX,AXJMP newchar2show3:mov dl,0AHmov ah,2int 21hLEA DX,RES; 显示输出结果MOV AH,9INT 21hMOV CX,10000dCALL dec_div4MOV CX,1000CALL dec_div4MOV CX,100CALL dec_div4MOV CX,10CALL dec_div4MOV CX,1CALL dec_div4RETdec_div4 PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30hMOV AH,2INT 21hRETdec_div4 ENDPTwochange ENDP; 子程序Threechange;功能:把十进制转化为十六进制Threechange PROC NEARMOV BX,0mov dl,0AHmov ah,2int 21hLEA DX,SHIMOV AH,9INT 21hMOV SI,4newchar6:MOV AH,1INT 21hSUB AL,30hJL next6CMP AL,9dJG next6CBWXCHG AX,BXMOV CX,10dMUL CXXCHG AX,BXADD BX,AXJMP newchar6next6:mov dl,0AHmov ah,2int 21hMOV SI,4LEA DX,RES; 显示输出结果MOV AH,9INT 21hrotate6:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0fhADD AL,30hCMP AL,3ahJL print6ADD AL,7hprint6:MOV DL,ALMOV AH,2INT 21hDEC SIJNZ rotate6RETThreechange ENDP Fourchange PROC NEAR mov dl,0AHmov ah,2int 21hLEA DX,SLIUMOV AH,9INT 21hMOV BX,0newchar5:MOV AH,1INT 21hSUB AL,30hJL next5CMP AL,10dJL add_to5SUB AL,27hCMP AL,0ahJL next5CMP AL,10hJGE next5add_to5:MOV CL,4SHL BX,CLMOV AH,0ADD BX,AXJMP newchar5next5:mov dl,0AHmov ah,2int 21hLEA DX,RES ; 显示输出结果MOV AH,9INT 21hMOV CX,10000dCALL dec_div5MOV CX,1000dCALL dec_div5MOV CX,100dCALL dec_div5MOV CX,10dCALL dec_div5MOV CX,1dCALL dec_div5RETFourchange ENDPdec_div5 PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30hMOV AH,2INT 21hRETdec_div5 ENDP;子程序名:Fivechange;子程序功能:二进制转化为十六进制Fivechange proc nearmov dl,0AHmov ah,2int 21hlea dx,ER;显示输入二进制数mov ah,9int 21hXOR AX,AXMOV BX,AXMOV SI,4newchar1:MOV AH,1INT 21hSUB AL,30hJL rotate1CMP AL,10dJL add_to1JMP rotate1add_to1:MOV CL,1SHL BX,CLMOV AH,0ADD BX,AXJMP newchar1rotate1:mov dl,0AHmov ah,2int 21hLEA DX,RES; 显示输出结果MOV AH,9INT 21hrotate1_1:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0fhADD AL,30hCMP AL,3ahJL print1ADD AL,7hprint1:MOV DL,ALMOV AH,2INT 21hDEC SIJNZ rotate1_1RETFivechange ENDP;子程序名:Sixchange;子程序功能:十六进制转化为二进制Sixchange PROC NEAR mov dl,0AHmov ah,2int 21hMOV BX,0LEA DX,SLIUMOV AH,9INT 21hMOV SI,16 newchar8:MOV AH,1INT 21hSUB AL,30hJL print3CMP AL,10dJL add_to2SUB AL,27hCMP AL,0ahJL print3CMP AL,10hJGE print3add_to2:MOV CL,4SHL BX,CLMOV AH,0ADD BX,AXJMP newchar8print3:mov dl,0AHmov ah,2int 21hLEA DX,RESMOV AH,9INT 21hprint2:ROL BX,1MOV AL,BLAND AL,1h ADD AL,30h MOV DL,AL MOV AH,2INT 21hDEC SIJNZ print2RETSixchange ENDP WRONG proc near mov dl,0AHmov ah,2int 21hlea dx,WROmov ah,9int 21hretWRONG endp code endsend start。

用汇编语言对字母大小写转换

用汇编语言对字母大小写转换

⽤汇编语⾔对字母⼤⼩写转换物理与电⽓⼯程学院课程实践报告⽤汇编语⾔对字母⼤⼩写转换姓名** ***********专业电⽓⼯程及其⾃动化班级电⽓⼯程及其⾃动化1班年级 2000级指导教师 00 00成绩⽇期 0000.6.20⼀.概述在计算机系统中有多种数制和编码,常⽤的数制有⼆进制、⼋进制以及⼗六进制,常⽤的代码有BCD 码、ASCll码和七段显⽰码等。

这些数制和编码根据其作⽤的不同,在存储形式上也有差异。

在实际应⽤中,它们也因使⽤的要求不同⽽有所差异。

在配备操作系统管理程序的计算机中,有些代码转换程序已在系统管理软件中编好。

还有些代码转换需要根据使⽤要求通过编程完成。

因此,代码转换是⾮数据处理中最常见的情况。

⼆.设计要求完成⼀个字母或数制之间的转化程序,主程序分别具有可选择的⼦功能,按相应的字符,可分别进⼊相应的⼦功能并在屏幕上显⽰结果。

可选择的⼦功能分别为:(1)实现⼩写字母向⼤写字母的转换(2)实现⼤写字母向⼩写字母的转换三.设计思想与⼯作原理⼩写字母的ASC码⽐⼤写字母的ASC码⼤20H,因此,⼤写转⼩写就是将⼤写字母的ASC码加20H,反之,将⼩写字母的ASC码减20H。

⼤⼩写字母转换功能,是通过调⽤⼦函数input实现对字符串的输⼊,然后调⽤宏gaixie来实现对⼤⼩写的转换,其中宏是通过参数的传递来确定是⼩写转换成⼤写,还是⼤写转换成⼩写的。

从⽽决定是对操作数进⾏加或减20H。

80x86从功能上分执⾏单元EU(Execution Unit),和总线接⼝单元BIU(Bus Interface Unit),执⾏单元由算术逻辑单元(ALU)、标志寄存器、通⽤寄存器组和EU控制器等部件组成。

指令执⾏部件EU由算术逻辑单元、标志寄存器、通⽤寄存器和EU控制器等部件组成。

主要功能是执⾏指令:⼀般顺序执⾏,EU不断地从指令队列中取指令连续执⾏,⽽省去访问存储器取指令的时间。

需要访问存储器取操作数时,EU将访问地址送给BIU后,将要等待操作数到来后才能继续操作;遇到转移类指令时,要将指令队列中的后续指令作废,等待BIU重新从存储器取出⽬标地址中的指令代码进⼊指令队列后,EU才能继续执⾏指令。

汇编语言代码转换程序实验报告

汇编语言代码转换程序实验报告

课程设计说明书题目: 代码转换程序院系:专业班级:学号:学生姓名:指导教师:2010 年 12 月 31 日安徽理工大学课程设计(论文)任务书计算机科学与工程学院硬件教研室2010年 12月 17安徽理工大学课程设计(论文)成绩评定表摘要本次课程设计的题目是代码转换,这是一个基于计算机和汇编环境的程序,主要就是通过完成这次设计,实现二进制,十进制,十六进制代码的转换,以及大小写字母之间的转换。

从而掌握不同进制数及编码相互转换的程序设计方法,知道将存储在内存单元中的数据以十六进制数、十进制数形式和二进制数形式显示在屏幕上的方法,加深对数码转换的理解。

而且学会用INT21功能实现人机对话掌握代码转换的基本方法。

该程序界面友好,能够通过键盘输入选择相应的转换,结果也能够比较直观的显示在我们眼前,具有一定的人机交互性。

关键词:代码,进制,大小写字母,转换,INT21,人机交互性目录1设计目的 (1)2概要设计 (2)2.1 系统总体分析 (2)2.2 主模块框图及说明 (2)3 详细设计 (4)3.1 主模块及子模块说明 (4)3.2 各模块详细设计 (4)4程序调试 (11)4.1 运行界面分析 (11)4.2算法的分析 (12)4.3 调试过程及分析 (13)5心得体会 (14)5.1 设计体会 (14)5.2 系统改进 (14)参考文献 (15)1设计目的在做本次课程设计之前,首先要了解设计的目的。

本次课程设计的题目是代码转换,这是一个基于计算机和汇编环境的程序,主要就是通过完成这次设计,实现二进制,十进制,十六进制代码的转换,以及大小写字母之间的转换。

从而掌握不同进制数及编码相互转换的程序设计方法,知道将存储在内存单元中的数据以十六进制数、十进制数形式和二进制数形式显示在屏幕上的方法,加深对数码转换的理解。

而且学会用INT21功能实现人机对话掌握代码转换的基本方法。

该程序界面友好,能够通过键盘输入选择相应的转换,结果也能够比较直观的显示在我们眼前,具有一定的人机交互性。

汇编语言实验2数据转换实验

汇编语言实验2数据转换实验

程序如下所示:DATA SEGMENTBUF DB 5 DUP(?) ;预留5单元空间D0 DW 2A5HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DA TAMOV DS,AXMOV DI,OFFSET D0 ;将DI指向BUF的下一单元MOV AX,D0 ;取要用来变十进制数的数到AXMOV BX,10 ;准备除以10MOV CX,0 ;准备统计余数的个数CHANGE10: DEC DI ;准备存放余数,往前倒存INC CXMOV DX,0 ;将除数的高16位(在DX中)清0,DX也将用来存放余数DIV BX ;DX,AX除以BX (BX=10)ADD DL,30H ;余数变为ASCII码值MOV BYTE PTR[DI],DL ;存储十进制数CMP AX,0 ;是否为0?JNZ CHANGE10 ;不为0转CHANGE10 CHANGE11: MOV DL,BYTE PTR[DI] ;取出存放在BUF中的十进制数到DL供显示MOV AH,2 ;显示1个字符INT 21HINC DILOOP CHANGE11MOV AH,4CH ;程序结束并返回DOSINT 21HCODE ENDSEND START(1)请改变第三行的3A5H改变为4A3FH、0ABH、0A37BH后分别说明运行结果,并做解释。

不做修改改3A5H为4A3FH改3A5H为0ABH改3A5H为0A37BH(2)分析其中INC与DEC语句的作用是什么,用”;”号屏蔽这二句后运行结果又是什么?请解释。

(3)将MOV BX,10 ;准备除以10 中的10改为8,结果如何?意义是什么?4A3FH0A37BH(4)如果改为16,结果如何,试分析为什么是这样的结果?0A37BH0ABH4A3FH2.ASCII码表示的十进制数转换为二进制数并显示将SI指向的缓冲区BUF中保存的五位ASCII码十进制数(0-65535)转换成对应的二进制数并存放在DX中,再以二进制形式显示。

  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,'*************************************************'
相关文档
最新文档