當前位置:編程學習大全網 - 編程語言 - 匯編十進制數制轉換二進制和十六進制

匯編十進制數制轉換二進制和十六進制

; 本程序通過編譯,運行正確

Code Segment

Assume CS:Code,DS:Code

CR equ 000DH

LF equ 000AH

KBBack equ 0008H

; -----------------------------------------

; 功能:顯示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在數據段)

; 用法: Output Str_Addr

; 用法舉例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

; -----------------------------------------

; 功能:輸出回車換行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

; -----------------------------------------

; 功能:取光標位置

; 入口:無

; 出口:DH=行號,DL=列號

GetCursor Proc Near

PUSH AX

PUSH BX

PUSH CX

XOR BX,BX

MOV AH,3

INT 10H

MOV Cursor_Row,DH

MOV Cursor_Col,DL

POP CX

POP BX

POP AX

RET

Cursor_Row DB ?

Cursor_Col DB ?

GetCursor EndP

; -----------------------------------------

; 功能:置光標位置

; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)

SetCursor Proc Near

PUSH CX

PUSH BX

PUSH AX

MOV DH,Cursor_Row

MOV DL,Cursor_Col

XOR BX,BX

MOV AH,2

INT 10H

POP AX

POP BX

POP CX

RET

SetCursor EndP

; -----------------------------------------

; 功能:鍵盤輸入壹個指定位數的十進制數字,將其轉換成二進制數並保存在指定的內存單元。

; 入口:@@Digits=數字位數;di=保存輸入的數字首地址

; @@Type_Data=保存的數據類型,B=字節類型,W=字類型。

; 出口:轉換後的二進制數保存在di所指的單元

Input_Digit Proc Near

push dx

push cx

push bx

push di

lea di,@@Save_Tmp

push di

cld

mov cl,@@Digits

xor ch,ch

push cx

@@Input: call GetCursor ;取光標位置

mov ah,1 ;從鍵盤接受壹個字符

int 21h

cmp al,CR ;若鍵入的是回車,已經鍵入的數字不足N位

jz @@ASC_Dec ;轉去處理已經鍵入的數字

cmp al,KBBack

jz @@KB_Back ;若是回空鍵,重新輸入

cmp al,'0'

jb @@KBBack ;若低於數字'0',重新輸入

cmp al,'9'

ja @@KBBack ;若低於數字'9',重新輸入

jmp @@Save_Dig

@@KB_Back: dec Cursor_Col

inc cx

dec di

@@KBBack: call SetCursor ;置光標位置

jmp @@Input

@@Save_Dig: and al,0fh ;轉換成二進制數

stosb ;保存

loop @@Input ;接受下壹個數字

@@ASC_Dec: mov ax,cx

pop cx

pop si

sub cx,ax ;實際輸入的數字位數

xor bp,bp

xor dx,dx

xor ax,ax

jcxz @@Save_Ret ;若直接回車,沒有輸入任何數字,按輸入'0'處理

dec cx ;實際輸入的數字位數減1,準備把輸入的這壹串數字轉換成二進制數

jcxz @@One_Digit ;若輸入的數字只有壹位,轉去直接保存這個二進制數

mov bx,10

@@Mul_Ten: lodsb

cbw

add ax,bp

mul bx

mov bp,ax

loop @@Mul_Ten

@@One_Digit:lodsb

cbw

add ax,bp

@@Save_Ret: pop di

cmp @@Type_Data,'B' ;字節類型?

jz $+5

stosw

jmp $+3

stosb

pop bx

pop cx

pop dx

ret

@@Digits db ? ;十進制數字位數

@@Type_Data db 'B' ;保存的數據類型。B=字節類型,W=字類型

@@Save_Tmp db 16 dup(?)

Input_Digit EndP

; -----------------------------------------

; 功能:將AL中的低4位二進制數轉換成十六進制顯示的ASCII碼

; 入口:AL

; 出口:AL=轉換後的ASCII碼

AL_ASCII Proc Near

cmp al,10 ;AL<10?

jb @@To_ASCII ;AL<10,按數字處理

add al,7 ;AL>=10,按大寫字母處理

@@To_ASCII: add al,'0' ;轉換成相應的數字或大寫字母

ret

AL_ASCII EndP

; -----------------------------------------

Number dw ?

prompt_One db 'Please input a decimal number(2-4bits): $'

prompt_Two db 'The binary: $'

prompt_Thr db 'The heximal: $'

Start: push cs

pop ds

push cs

pop es ;使數據段、附加段與代碼段同段

mov @@Digits,4 ;十進制數字位數

mov @@Type_Data,'W' ;保存的數據類型。B=字節類型,W=字類型

Input_Deci: Output prompt_One ;提示輸入壹個十進制數

lea di,Number ;變量Number的地址

call Input_Digit ;鍵盤輸入壹個指定位數的十進制數字,將其轉換成二進制數並保存在指定的內存單元

cmp Number,10

jb Input_Deci ;少於2位十進制數,重新輸入

call Output_CTLF ;輸出壹個回車、換行

call Output_CTLF ;輸出壹個回車、換行

; -----------------------------------------

; 轉換為對應的二進制數

Output prompt_Two

lea di,@@Save_Tmp[14]

mov word ptr [di],'$B'

mov ax,Number

@@L0: dec di

test ax,0ffffh

jz @@L1

shr ax,1

jc $+7

mov byte ptr [di],'0'

jmp @@L0

mov byte ptr [di],'1'

jmp @@L0

@@L1: inc di

mov dx,di

mov ah,9

int 21h

; -----------------------------------------

; 轉換為對應的十六進制數

call Output_CTLF ;輸出壹個回車、換行

Output prompt_Thr

mov ax,Number

lea di,@@Save_Tmp[14]

mov word ptr [di],'$H'

mov cl,4

mov ax,Number

@@L2: dec di

test ax,0ffffh

jz @@L3

mov bx,ax

shr bx,cl

and ax,0fh

call AL_ASCII ;將AL中的低4位二進制數轉換成十六進制顯示的ASCII碼

mov [di],al

mov ax,bx

jmp @@L2

@@L3: inc di

mov dx,di

mov ah,9

int 21h

Exit_Proc: mov ah,4ch ;結束程序

int 21h

Code ENDS

END Start ;編譯到此結束

  • 上一篇:新壹屆的“憋氣大賽”開啟,全明星周末日程安排公布
  • 下一篇:GeForce FX 5200的觀點
  • copyright 2024編程學習大全網