- 实验名称:实验五 分支与循环程序设计
二、实验内容:从键盘输入一个四位的16进制数(其中字母为大写),将其转化为二进制数提示输出。
- 实验过程:
源代码:
data segmentbuff1 db 'Please input a number(H):$'buff2 db 10,?,10 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码转换成实际的二进制call tips2 ;调用第三个字符串,显示结果call output ;将缓冲区的二进制转换成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 hexjmp exitdig:sub al,30hmov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值jmp exithex:sub al,37h mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值jmp exitexit:inc blcmp bl,4 ;计数功能jz returnjmp inputreturn:retget4h endpoutput proc nearlea si,buff2+2 ;用si寄存器保存第二个字符串的首地址mov bx,0 ;bx充当计数器和相对偏移量,外层循环start0:xor cx,cxmov cx,4mov al,[si+bx] ;内层循环,用cx计数start1:shr al,1 ;将al右移,判断CFjc put1 ;是1,就用dx保存1,压栈mov dx,0 ;是0,就用dx保存0,压栈push dxdec clcmp cl,0 ;判断四位有没有全部入栈jz start2 ;全部入栈了,就开始输出jmp start1put1:mov dx,1push dxdec clcmp cl,0jz start2jmp start1start2:mov cx,4 ;再用cx当作内层循环计数器start3:pop dxadd dl,30hmov ah,2int 21hdec clcmp cl,0 jz exit1jmp start3 ;出栈输出exit1:inc bx ;进行外层循环计数mov dl,0mov ah,2int 21hcmp bx,4jz return1jmp start0return1:retoutput endpcode endsend main
运行结果:
- 实验小结:
经过本次实验,我对使用汇编语言进行编程有了更高能力的提升,和第四次实验相比,这次实验更为简单,只需要把输入的16进制转换成二进制,保存后,再写一个子程序将2进制的值以ASCII码的方式输出出来,在这次实验中,我还提升了运用debug的能力,通过运用debug我找出了许多错误,解决了我逻辑算法上的缺陷,希望在以后的不断编程中,我的能力能得到进一步提升。