彙編 求十進位制數的補碼並轉二進位制和十六進製制輸出

2021-08-13 19:15:35 字數 4505 閱讀 6938

(多組輸入輸出,使用巨集庫檔案)

**如下,有詳細注釋

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轉...