十进制数(含两位小数)转换成十六进制数
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
BUFF DB100
DB ?
DB 100 DUP(?)
BUFF1 DW 100
DW ?
DW 100 DUP(?)
STRING1 DB 0AH,0DH,'PLEASE INPUT DECIMAL DATA:$'
STRING2 DB 0AH,0DH,'PRESS ANY BUTTON TO CONTINUE;PRESS ESC TO SORT','$'
STRING3 DB 0AH,0DH,'THE ORIGNIAL DATAS IS:$'
STRING4 DB 0AH,0DH,'THE SORTED DATAS IS:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
LEA DI,BUFF1
ADD DI,4
MOV CX,0
L1: INC CX
LEA DX,STRING1
MOV AH,09H
INT 21H
MOV AH,0AH
LEA DX,BUFF
INT 21H
LEA SI,[BUFF+1]
CALL TRANS10TO16
CALL DISPCR
CALL DISPAX
CALL DISPCR
INC DI
INC DI
MOV [DI],AX
LEA DX,STRING2
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
CMP AL,27
JZ SORT
JMP L1
MOV AH,4CH
MOV AL,0
INT 21H
DISPAX PROC NEAR
XCHG AL,AH
CALL DISPAL
XCHG AH,AL
CALL DISPAL
RET
DISPAX ENDP
DISPAL PROC NEAR
PUSH AX
PUSH CX
PUSH DX
PUSH AX
MOV CL,4
SHR AL,CL
CALL CHANG
MOV AH,02H
MOV DL,AL
INT 21H
POP AX
AND AL,0FH
CALL CHANG
MOV AH,02H
MOV DL,AL
INT 21H
POP DX
POP CX
POP AX
RET
DISPAL ENDP
CHANG PROC NEAR
CMP AL,10
JNGE CHANG1
ADD AL,7
CHANG1:
ADD AL,30H
RET
CHANG ENDP
DISPCR PROC NEAR
PUSH AX
PUSH DX
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
POP DX
POP AX
DISPCR ENDP
TRANS10TO16 PROC NEAR
PUSH CX
PUSH DX
PUSH SI
XOR AX,AX
XOR CX,CX
MOV CL,[SI]
INC SI
MOV AL,[SI]
INC SI
SUB AL,30H
DEC CX
JCXZ TRANSF2
MOV BX,10
TRANSF1:
MUL BX
JC TRANSF_ERR
MOV DL,[SI]
INC SI
SUB DL,30H
ADD AL,DL
ADC AH,0
JC TRANSF_ERR
LOOP TRANSF1
MOV BX,0
TRANSF2:
JMP TRANSF_OK
TRANSF_ERR:
MOV BX,-1
TRANSF_OK:
POP SI
POP DX
POP CX
RET
TRANS10TO16 ENDP
SORT:PUSH CX
CALL DISPCR
LEA SI,BUFF1
ADD SI,6
LEA DX,STRING3
MOV AH,09H
INT 21H
L2:
MOV AH,02H
MOV DL,20H
INT 21H
MOV AX,[SI]
CALL DISPAX
INC SI
INC SI
DEC CX
JA L2
CALL DISPCR
POP CX
MOV BX,CX
DEC CX
XOR SI,SI
LEA SI,BUFF1
ADD SI,6
MOV DX,CX
SHL DX,1
ADD SI,DX
LP1:
PUSH CX
PUSH SI
LP2:
MOV AL,[SI]
CMP AL,[SI-2]
JAE NOXCHG
XCHG AL,[SI-2]
MOV [SI],AL
NOXCHG:
DEC SI
DEC SI
LOOP LP2
POP SI
POP CX
LOOP LP1
MOV CX,BX
CALL DISPCR
LEA SI,BUFF1
ADD SI,6
XOR DX,DX
LEA DX,STRING4
MOV AH,09H
INT 21H
L4:
MOV AH,02H
MOV DL,20H
INT 21H
MOV AX,[SI]
CALL DISPAX
INC SI
INC SI
DEC CX
JA L4
MOV AH,4CH
INT 21H
CODE ENDS
END START
这个没有小数转换怎么加进去啊
[解决办法]
不用浮点数。原理就是输入一个字符串,它是以“.”隔开的两串数,其中后面那串只有2个字符。
“.”前面的字符串转化成十六进制大家很熟悉,就是把这个整数除以16,得到的余数是整数的低位数,用商再反复除以16,得到的一系列余数就是整数由低向高的各位数字。
小数部分类似,若原来的数字是“0.xx”,则用它乘以16,得到的整数部分就是十分位,小数部分再乘以16,可得到百分位,这个小数也许是无限的,现在保留有限位(比如2位)即可。
现在没有浮点数的运算,那可以把“0.xx * 16”的运算化成“xx * 16”,得到的成绩除以100的商不就是“0.xx * 16”的整数部分吗?这样就得到了十分位。“xx * 16/100”的余数(若是yy),则“0.xx * 16”的小数部分一定就是“0.yy”了。下一位小数也就会算了吧?
整数部分和小数部分中间仍用“.”隔开。