输入四位十六进制的数值,将十六进制数值转二进制输出

程序运行:

 

代码:


datas segment
     maxLength                 db 5
	 hexLength                 db 0
     hex                       db 5 dup(?)
     
     bin	                   db 100h dup(?)
	 inputPrompt               db 'input 4 bit hexadecimal:$'
	 outputBinary              db 0dh,0ah,'output binary:$'
	 outputInputError          db 0dh,0ah,'input error!$'
	 
datas ends

stacks segment stack

    db  100h dup(?)

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks
main   proc  far
start:
       push ds
	   mov ax,0h
	   push ax
       mov ax,datas          ;初始化ds
	   mov ds,ax
       
	   lea dx,inputPrompt      ;输入提示
	   mov ah,9
	   int 21h
	   
	   lea dx,maxLength        ;输入十六进制字符
       mov ah,10
       int 21h
	   
	   mov cl,hexLength        ;若字符串长度不为4,则输入错误
	   cmp cl,4
	   jne inputError
	   
	   mov ch,0                ;设置ch,使得cx为字符串的长度
	   lea si,hex              
	   lea di,bin
	   s:
	     mov al,[si]           
		 cmp al,'9'            ;判断字符是否大于'9'
		 ja english            ;大于9则跳转去判断是否为其他十六进制字符
		 cmp al,'0'            ;判断字符是否大于'0' 
		 jb inputError         ;若小于'0',则输出
         jmp tobinary          ;否则,则转换为二进制
		 
		 english:
		  or al,32             ;将字符变成小写字母,不是小写字母的运算结果不变
	      cmp al,'a'            ;判断字符是否大于'a'
		  jb inputError         ;若小于'a',则输入错误
		  cmp al,'f'            ;判断字符是否大于'f'
		  ja inputError         ;若大于'f',则输入错误 
		   sub al,7             ;先减7,变成数字的值+30h
		  tobinary:
		  sub al,30h            ;减去30h,剩下数值
		  call binary           ;转换二进制,使用al,di
		  inc si                ;数组下标加一
		  loop s
		
        lea dx,outputBinary       ;输出二进制提示
        mov ah,9
        int 21h
		
	    mov byte ptr [di],'$'     ;设置二进制字符串的结束字符
		lea dx,bin                 ;输出二进制字符串
		mov ah,9
	    int 21h
		jmp exit
		
	   inputError:                   ;输入错误提示
	    lea dx,outputInputError
        mov ah,9
        int 21h	
		
	   exit:
       ret
	   
main endp

binary proc near

      push cx                  ;保存cx
	  mov cl,4                 ;将al左移4位,使al的高半字节为原来al的低半字节
	  shl al,cl
	  
      mov cx,4
     sbin:
     	shl al,1                   ;左移一位
	    jc one                     ;进位为1,跳转到one
		mov byte ptr [di],'0'      ;否则,二进制数组置'0'
		jmp restart                 ;跳转到restart
		one:                        ;置'1'
		mov byte ptr [di],'1'
		restart:
		add di,1
		loop sbin
		
	 pop cx                        ;恢复cx
		ret
		
binary endp
codes ends

end main

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐