(多組輸入輸出,使用巨集庫檔案)
**如下,有詳細注釋
include macro_lib.mac
data segment
string db 10,?,10 dup(?) ;用於存放輸入的十進位制數 這裡十進位制數在-32768~32767之間(16位有符號數)
;可以出現負數,此程式功能為用二進位制和十六進製制顯示這個十進位制數的補碼
data ends
code segment
assume cs:code ,ds:data
;輸入多個十進位制數,輸入q字元(ascii碼為113)結束程式
start:
sta: inputs string ;呼叫巨集指令庫中的輸入字串
crlf ;回車換行
;第一位有三種情況
;1.0~9 轉正數處理 ascii碼為48~57
;2.'-' 轉負數處理 ascii碼為45
;3.'q' 退出 ascii碼為113
;下面取第一位
lea bx,string
add bx,2
mov cl,[bx] ;借助cl
cmp cl,113
jz ex ;如果zf=1,即輸入為q則結束程式
cmp cl,45
jz nega ;如果zf=1,即輸入為負數
;bx是string 的偏移位址
;正數,沒有跳ex和nega
posi:
sub bx,2
mov cx,0
mov cl,[bx+1];cx存放實際串長
;cx+1指向串最後一位
mov ax,1
;初始權值為1
mov bx,0
;bx存放值
mov dx,10
;常量lp1:
push dx
mov dh,0
;高位置0
push bx
mov bx,cx
mov dl,[bx+1];將當前位置的ascii碼給dl,由於是數字為48~57
pop bx
sub dl,48
;轉為數值,dx為數字
push ax;保留當前權值
mul dx;數字乘以當前權值,結果低位在ax中,高位在dx中,即dx這裡會被0覆蓋(數比較小)
;但沒關係,會pop,即只有ax的數值有用
add bx,ax
pop ax
mov dx,10
;mul dx
pop dx ;dx再恢復10 此時ax權值已經在以前基礎上*10了
loop lp1 ;loop進行前會對cx--,不為零則迴圈
;迴圈結束,bx為所求值,由於正數的補碼是其本身,下面直接輸出二進位制和十六進製制即可
;2進製
mov cx,16
;迴圈16次
shift1:
rol bx,1
mov al,bl
and al,01h ;取最右1位
add al,30h ;轉為ascii碼
putchar al ;輸出al中的ascii碼對應的字元 0/1
loop shift1 ;迴圈16次後bx不變
put3space ;輸出3個空格
;16進製制
mov cx,4
;迴圈4次
shift2:
rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov al,bl
and al,0fh ;取最右四位
add al,30h ;轉為ascii碼
cmp al,39h
jle dig1 ;是0~9 則轉dig
add al,7
;是a~f
dig1:
putchar al ;輸出al中的ascii碼對應的字元
loop shift2 ;迴圈4次後bx不變
;輸出回車換行
crlf
jmp sta;再次輸入
;負數nega:
sub bx,2
mov cx,0
mov cl,[bx+1];cx存放實際串長
dec cx
;cx+2指向串最後一位
mov ax,1
;初始權值為1
mov bx,0
;bx存放值
mov dx,10
;常量lp2:
push dx
mov dh,0
;高位置0
push bx
mov bx,cx
mov dl,[bx+2];將當前位置的ascii碼給dl,由於是數字為48~57
pop bx
sub dl,48
;轉為數值,dx為數字
push ax;保留當前權值
mul dx;數字乘以當前權值,結果低位在ax中,高位在dx中,即dx這裡會被0覆蓋(數比較小)
;但沒關係,會pop,即只有ax的數值有用
add bx,ax
pop ax
mov dx,10
;mul dx
pop dx ;dx再恢復10 此時ax權值已經在以前基礎上*10了
loop lp2 ;loop進行前會對cx--,不為零則迴圈
;迴圈結束,bx為所求值的正直,下面求其補碼,並以二進位制和十六進製制輸出
;由於是負數,所以其補碼是各位取反 由於高位是0 所以也要取反 所以
;各位異或1
xor bx,0ffffh
add bx,1
;現在bx為補碼了,下面直接輸出二進位制和十六進製制即可
;2進製
mov cx,16
;迴圈16次
shift3:
rol bx,1
mov al,bl
and al,01h ;取最右1位
add al,30h ;轉為ascii碼
putchar al ;輸出al中的ascii碼對應的字元 0/1
loop shift3 ;迴圈16次後bx不變
put3space ;輸出3個空格
;16進製制
mov cx,4
;迴圈4次
shift4:
rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov al,bl
and al,0fh ;取最右四位
add al,30h ;轉為ascii碼
cmp al,39h
jle dig2 ;是0~9 則轉dig
add al,7
;是a~f
dig2:
putchar al ;輸出al中的ascii碼對應的字元
loop shift4 ;迴圈4次
;輸出回車換行
crlf
jmp sta;再次輸入
ex:mov ah,4ch
int 21h
code ends
end start
macro_lib.mac
cr equ 13
lf equ 10
spa equ 32
getchar macro
mov ah,1
int21h ;al為輸入字元
endm
putchar macro asc
mov ah,2
mov dl,asc;輸出dl上的字元
int21h endm
inputs macro conbuf
mov ah,10
mov dx,offset conbuf ;ds:dx為緩衝區的首位址 其分別存放緩衝區大小(位元組數)、實際填充數、串內容
int21h endm
prints macro msg
mov ah,9
mov dx,offset msg; ds:dx為串位址,字串應以'$'結尾
int21h endm
crlf macro
putchar cr ;回車19d 13h
putchar lf ;換行16d 10h
endm
put3space macro
putchar spa
putchar spa
putchar spa
endm
exit macro
mov ah,4ch
int21h endm
執行效果截圖
二進位制補碼和十進位制數的轉換
先考慮如何將二進位制補碼轉換為十進位制整數 若符號位是0,則該數是正數,原碼等同於補碼.可以由原碼 也就是補碼 得知代表的正整數.若符號為是1,則該數一定是負數,可按照以下方式轉換 方式一 先把符號位去掉,把剩下的非符號位取反後得到乙個無符號位的二進位制序列,將該二進位制序列轉換為十進位制整數 注意...
二進位制如何轉十進位制,十進位制如何轉二進位制
學計算機的朋友剛開始學習時都要接觸進製之間的轉換,二進位制 十進位制 八進位制 十六進製制等,這個是很枯燥的,轉來轉去就轉矇圈了,別蒙別蒙,今天咱們乙個乙個搞定,看看二進位制和十進位制之間如何相互轉換的。轉成二進位制主要有以下幾種 正整數轉二進位制,負整數轉二進位制,小數轉二進位制 1 正整數轉成二...
二進位制如何轉十進位制,十進位制如何轉二進位制
二進位制如何轉十進位制,十進位制如何轉二進位制 1 正整數轉成二進位制。要點一定一定要記住哈 除二取餘,然後倒序排列,高位補零。也就是說,將正的十進位制數除以二,得到的商再除以二,依次類推知道商為零或一時為止,然後在旁邊標出各步的餘數,最後倒著寫出來,高位補零就ok咧。哎呀,還是舉說明吧,比如42轉...