汇编语言进制转换

ASCII码说明

48~57: '0'~'9'

65~90: 'A'~'Z'

97~122: 'a'~'z'

十进制转二进制

(输入十进制数保存到BX)

dec2bin	 	proc	near
		mov	bx, 0    ; 清空BX
newchar:	                 ; 读取一个字符
		mov ah, 1        ; 字符输入的中断
		int 21h		 ; 输入到al
		sub al, '0'      ; ASCII转换成数字
		jl  exit         ; 小于'0'则停止
		cmp al, 9d       
		jg	exit     ; 大于'9'则停止
		cbw		 ; 将AL扩展到AX
		xchg ax, bx	 ; 下面几步是将BX原本的内容乘10
		mov  cx, 10d	 
		mul  cx		 ; 隐含的乘数在AX中
		xchg ax, bx	 ; BX已经乘10
		add  bx, ax	 ; 将输入的数字加到BX
		jmp  newchar
exit:
		ret
dec2bin  endp

十六进制转二进制

(输入十六进制数保存到BX)

hex2bin		proc	near
		mov bx, 0
newchar:
		mov ah, 1
		int 21h
		sub al, '0'	   ; 转换成数字
		jl  exit           ; 不是0~F则停止
		cmp al, 10d
		jl  add_to         ; 是0~9
		or al, 20h         ; 转化成小写字母
		sub al, 'a'-10-'0' ; 可能是'a'~'f',转换成实际的值10~15
		cmp al, 10d
		jl  exit
		cmp al, 15d
		jg exit
add_to:			           ; 加到BX上
		mov cl, 4
		shl bx, cl         ; BX乘16(逻辑左移4位)
		mov ah, 0
		add bx, ax
		jmp newchar
exit:
		ret
hex2bin  endp

二进制转十进制

(将BX中的数值按十进制输出)

bin2dec		proc	near
		mov cx, 10000d
		call dec_div	; 万
		mov cx, 1000d
		call dec_div 	; 千
		mov cx, 100d	
		call dec_div 	; 百
		mov cx, 10d 	
		call dec_div	; 十
		mov cx, 1d
		call dec_div	; 个
		ret
bin2dec  endp
;-------------------------
dec_div		proc	near            ; BX/CX,并输出商
		mov ax, bx		; 被除数低16位在AX
		mov dx, 0		;      高16位在DX
		div cx		        ; 除以CX,商在AX,余数在DX
		mov bx, dx		; 余数放回BX
		mov dl, al		; 只需要商的8位
		add dl, '0'		; 转换成ACSII并输出
		mov ah, 2
		int 21h
		ret
dec_div  endp

二进制转十六进制

(将BX中的数值按十六进制输出)

bin2hex		proc	near
		mov ch, 4		  ; 输出4位十六进制数
rotate:
		mov cl, 4		  ; 下面是输出BX的高4位
		rol bx, cl		  ; BX循环左移4位(高四位到了低四位)
		mov al, bl
		and al, 0fh		  ; 现在al保存的就是BX高四位的值
		add al, '0'
		cmp al, '9'
		jle printit		
		add al, 'A'-10-'0'        ; 如果是大于9,则转成16进制字符'A'~'F'
printit:
		mov dl, al		  ; 输出字符
		mov ah, 2
		int 21h
		dec ch
		jnz rotate
		ret
bin2hex  endp
原文地址:https://www.cnblogs.com/yl-xy/p/14216913.html