例11.10 从键盘上读入一个带小数的数字字符串,然后把它转换成单精度浮点数,并存入内存单元DATA中。
| 解: | ||||
| .MODEL SMALL | ||||
| .386 | ||||
| .387 | ||||
| .DATA | ||||
| 
       DATA  | 
    DD 0 | |||
| 
       TEN  | 
    DD 10.0 | |||
| 
       TEMP  | 
    DW ? | |||
| 
       SIGN  | 
    DB ? | |||
| .CODE | ||||
| GETCH | MACRO | ;宏GETCH的功能是从键盘读入一个字符 | ||
| MOV | AH, 1 | |||
| INT | 21H | |||
| ENDM | ||||
| .STARTUP | ||||
| FLDZ | ;ST=0 | |||
| GETCH | ||||
| .IF AL == ‘+’ | ;判定是否输入正号‘+’ | |||
| 
       MOV  | 
    SIGN, 0 | |||
| 
       GETCH  | 
  ||||
| .ENDIF | ||||
| .IF AL == ‘-‘ | ||||
| 
       MOV  | 
    SIGN, 1 | ;判定是否输入负号‘-’ | ||
| 
       GETCH  | 
  ||||
| .ENDIF | ||||
| .REPEAT | ||||
| 
       FMUL  | 
    TEN | |||
| 
       MOV  | 
    AH,0 | |||
| 
       SUB  | 
    AL, 30H | |||
| 
       MOV  | 
    TEMP, AX | |||
| 
       FIADD  | 
    TEMP | ;部分数×10.0+(字符-‘0’) | ||
| 
       GETCH  | 
  ||||
| .UNTIL AL<’0’ || AL>’9’ | ;完成整数部分的处理 | |||
| CMP | AL, ‘.’ | |||
| JNE | exit | |||
| FLD1 | ;开始处理小数部分 | |||
| .WHILE1 | ||||
|  
       FDIV  |  
    TEN | |||
|  
       GETCH  |  
  ||||
|  
       .BREAK .IF AL<’0’ || AL>’9’  |    
  ||||
|  
       MOV  |  
    AH, 0 | |||
|  
       SUB  |  
    AL, 30H | |||
|  
       MOV  |  
    TEMP, AX | |||
|  
       FILD  |  
    TEMP | |||
|  
       FMUL  |  
    ST, ST(1) | |||
|  
       FADD  |  
    ST(2), ST | |||
|  
       FCOMP  |  
  ||||
| .ENDW | ||||
| FCOMP | ||||
| exit: | ||||
| .IF SIGN == 1 | ;如果是负数,那么需要改变符号 | |||
|  
       FCHS  |  
  ||||
| .ENDIF | ||||
| FSTP | DATA | ;保存最终转换的结果 | ||
| .EXIT 0 | ||||
| END | ||||