?? b.asm
字號:
;模塊B:
PUBLIC ASC_TO_BIN , BIN_TO_ASCII
DATA SEGMENT COMMON
INPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'
IN_ASC_BUF DB 6 ;十進制數的輸入緩沖區,共可接收6個字符
DB ? ;保留,用于10號調用時DOS填入實際輸入字符個數
DB 6 DUP(?) ;一個符號位,四位數字ASCII碼,加上一個回車符,
;共計6字符
BIN_BUF1 DW ? ;將第一個數轉換為二進制后,放于此處
OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'
OUT_ASC_SUM DB 6 DUP(?) , '$' ;將二個數的和轉換為ASCII碼后,放于此處,
;以供9號調用顯示
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG , DS:DATA
ASC_TO_BIN PROC FAR
;ASCII碼轉換為二進制數
;入口:十進制數的ASCII碼在IN_ASC_BUF內
;出口:轉換后的二進制數在AX內
;算法:先將其轉換成十進制數字,再用累加和乘10加X的方法變成二進制數,如將
;358轉換為二進制數,可先將累加和賦0,再計算(((0*10+3)*10+5)*10+8),結果為二
;進制數,再由符號位決定是否需要求補。
MOV CL , IN_ASC_BUF+1 ;取字符個數
MOV CH , 0
DEC CL ;扣除符號位
MOV BX , OFFSET IN_ASC_BUF+3 ;調整BX指向十進制數的最高位
PUSH BX
PUSH CX
L1:
MOV AL , [BX]
AND AL , 0FH
MOV [BX] , AL
INC BX
LOOP L1 ;將所有數字字符的高四位清0,使之變為數字值
POP CX
POP BX
MOV AX , 0 ;累加和賦初值
MOV SI , 10
L2:
MUL SI
ADD AL , [BX]
ADC AH , 0
INC BX
LOOP L2 ;累加乘10
CMP IN_ASC_BUF+2 , '+'
JZ L3 ;符號是正號,轉移
NEG AX ;符號是負號,求補
L3:
RET
ASC_TO_BIN ENDP
BIN_TO_ASCII PROC FAR
;將二進制數轉換為對應十進制數數字的ASCII碼
;入口:二進制數在AX內
;出口:轉換后的ASCII碼在OUT_ASC_SUM變量內
;算法:AX中的數范圍在+32767到-32768之間,先檢查AX中的符號位,以決定輸出“+”
;還是“-”,若是負數,應先求補,得到原碼后即可與正數作統一處理。轉換方法為將被轉換的
;二進制數先除以10000,商;即為萬位數,再將余數除以1000,商為千位數,以此類推,求出
;百、十位數,剩下的為個位數。最后,將各個數加上30H,即成為對應字符。
MOV OUT_ASC_SUM , '+'
CMP AX , 0
JGE L4 ;不是負數,轉移
NEG AX
MOV OUT_ASC_SUM , '-'
L4:
CWD
MOV BX , 10000
DIV BX
ADD AL , 30H ; 將萬位轉換為數字(商應在AX內,但因為商不大于3,
;所以有效部分在AL內)
MOV OUT_ASC_SUM+1 , AL ;保存萬位數字
MOV AX , DX ;將余數置入AX內,以便當作被除數
CWD
MOV BX , 1000
DIV BX
ADD AL , 30H
MOV OUT_ASC_SUM+2 , AL ;保存千位數字
MOV AX , DX ;將余數置入AX內,以便當作被除數
MOV BL , 100
DIV BL
ADD AL , 30H
MOV OUT_ASC_SUM+3 , AL ;保存百位數字
MOV AL , AH
CBW
MOV BL , 10
DIV BL
ADD AL , 30H
MOV OUT_ASC_SUM+4 , AL ;保存十位數字
ADD AH , 30H
MOV OUT_ASC_SUM+5 , AH ;保存個位數字
RET
BIN_TO_ASCII ENDP
CSEG ENDS
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -