1. 程式人生 > 實用技巧 >組合語言進位制轉換

組合語言進位制轉換

目錄

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