組合語言進位制轉換
阿新 • • 發佈:2020-12-31
目錄
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