一、实验名称:实验6 输入一个16进制数,把它转换为10进制数输出
- 实验目的:
培养汇编中设计子程序的能力
- 实验过程:
源代码:
data segmentbuff1 db 'Please input a number(H):$'buff2 db 30,?,30 dup(?),13,10buff3 db 'The consequent is:$'data endscode segmentassume cs:code,ds:datamain proc farpush dsxor ax,axpush axmov ax,datamov ds,axcall tips1 ;调用第一个字符串,提示用户输入call input1 ;调用程序,将数字输入进缓冲区保存call get4h ;将缓冲区的ASCII码转换成实际的二进制xor ax,axmov al,byte ptr[buff2+1] ;di用来计数(处理4位的十六进制)mov di,axlea si,buff2+2mov bx,0;mov bp,1000h ;dx位权call functioncall tips2 ;调用第三个字符串,显示结果call btod ;将缓冲区的二进制转换成10进制ASCII码输出mov ah,4chint 21hretmain endptips1 proc nearmov dx,offset buff1mov ah,9int 21hrettips1 endptips2 proc nearmov dx,offset buff3mov ah,9int 21hrettips2 endpinput1 proc nearlea dx,buff2mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretinput1 endpget4h proc nearlea si,buff2+2 ;将第二个字符串的首地址给si寄存器保存mov bx,0 ;用bx当作计数器和相对偏移量input:mov al,byte ptr[si+bx]cmp al,30hjl exitcmp al,39hjle dig ;>='0'&&<='9'cmp al,41h ;<'A',exit 判断输入的合法性jl exitcmp al,46h ;>='A'&&<='F' 如果是0~9,就进入dig,如果是A~F就进入hexjle hexcmp al,61hjl exitcmp al,66hjle shex ;如果是在a~f之间jmp exitdig:sub al,30hmov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值jmp exithex:sub al,37h mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值jmp exitshex:sub al,57h mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值jmp exitexit:inc blmov dl,buff2+1cmp bl,dl ;计数功能jz returnjmp inputreturn:retget4h endpfunction proc nearlea si,buff2+2 ;用si寄存器保存第二个字符串的首地址mov bx,0 mov bp,1000hxor ax,axstart0:mov al,byte ptr[si] ;内层循环,用cx计数start1:mul bp ;存在(DX,AX)mov cx,4ror bp,cl ;得到新的位权dec diadd bx,axxor ax,ax ;清零inc si ;下一个字符cmp di,0 ;结束je exit1 jmp start0exit1:retfunction endpbtod proc nearmov ax, bx ;把bp寄存器的值给axmov cx, 1 ;计数器mov bx, 10 ;10作除数xor dx,dxdiv1:idiv bx push dx ;保存ax/10后的结果,ah存放余数,al存放商cmp ax, 0 ;商为0则开始输出jz outputmov dx, 0 ;置余数为0,继续除inc cxjmp div1output:pop dx add dl, 30hmov ah, 2int 21hloop outputretbtod endpcode endsend main
实验运行结果:
- 实验小结:
本次实验,一开始我理解题意错误,以为是分开输出对应的BCD码,这提醒我们看清题意很重要。
在本次代码中,首先我们做一个输入提示:
然后我们把缓冲区输入的所有数,进行真实数值处理
假如我们输入的是1011,那么现在在缓冲区存放的就不是31,30,31,31了,而是01,00,01,01,这一步操作方便我们接下来输出成10进制。
这一步是将二进制数全部乘以它对应的位权,得到实际的十进制数值,方法就是,向左移动寄存器,将其乘以对应位权后保存下来。
这一步就是,我们把最后的数分别输出,方法就是除以10得到余数,然后把余数压栈最后输出。
这是本学期最后一次汇编实验课,但是整体感觉自己的汇编编程能力,还有很多不足,平时还是应该要多上机实验。