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