• 汇编语言进制转换


    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
    
  • 相关阅读:
    POJ 3468_A Simple Problem with Integers(树状数组)
    POJ 3468_A Simple Problem with Integers(线段树)
    ZOJ 2770_Burn the Linked Camp
    ZOJ 2770_Burn the Linked Camp
    POJ 3169_Layout
    POJ 3169_Layout
    POJ 3684_Physics Experiment
    POJ 3255_Roadblocks
    POJ 3723 Conscription【最小生成树】
    POJ 3279 Fliptile【枚举】
  • 原文地址:https://www.cnblogs.com/yl-xy/p/14216913.html
Copyright © 2020-2023  润新知