首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

十进制数(含两位小数)转换成十六进制数,该怎么处理

2012-06-06 
十进制数(含两位小数)转换成十六进制数STACKSEGMENT STACK STACKDW 100H DUP(?)TOP LABEL WORDSTACK END

十进制数(含两位小数)转换成十六进制数
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”了。下一位小数也就会算了吧?

整数部分和小数部分中间仍用“.”隔开。

热点排行