例11.9 把内存单元DATA中存放的单精度浮点数以小数的形式显示在屏幕上。
| 解: | ||||
| .MODEL SMALL | ||||
| .386 | ||||
| .387 | ||||
| .DATA | ||||
| 
       DATA  | 
    DD -1234.75 | |||
| 
       STATUS  | 
    DW ? | |||
| 
       WHOLE  | 
    DD ? | |||
| 
       FRACT  | 
    DD ? | |||
| .CODE | ||||
| DISPS | PROC NEAR | ;子程序:显示AL中的字符 | ||
| MOV | AH, 6 | |||
| MOV | DL, AL | |||
| INT | 21H | |||
| RET | ||||
| DISPS | ENDP | |||
| .STARTUP | ||||
| FSTCW | STATUS | ;以小数形式显示浮点数DATA | ||
| OR | STATUS,0C00H | ;设定截取舍入方式 | ||
| FLDCW | STATUS | |||
| FLD | DATA | |||
| FTST | ||||
| FSTSW | AX | |||
| AND | AX, 4500H | |||
| CMP | AX, 0100H | |||
| JNZ | Positive | |||
| MOV | AL, ‘-‘ | |||
| CALL | DISPS | |||
| FABS | ||||
| Positive: | ||||
| FLD | ST | |||
| FRNDINT | ||||
| FIST | WHOLE | ;保存整数部分 | ||
| FSUBR | ||||
| FABS | ||||
| FSTP | FRACT | ;保存小数部分 | ||
| MOV | EAX, WHOLE | |||
| MOV | EBX, 10 | |||
| MOV | CX, 0 | |||
| PUSH | BX | |||
| Again1: | ||||
| MOV | EDX, 0 | |||
| DIV | EBX | |||
| ADD | DL, 30H | |||
| PUSH | DX | |||
| INC | CX | |||
| CMP | EAX, 0 | |||
| JNZ | Again1 | |||
| Disp1: | ||||
| POP | AX | |||
| CALL | DISPS | ;显示整数部分 | ||
| LOOP | Disp1 | |||
| MOV | AL, ‘.’ | |||
| CALL | DISPS | ;显示小数点 | ||
| MOV | EAX, FRACT | |||
| FSTCW | STATUS | |||
| XOR | STATUS, 0C00H | |||
| FLDCW | STATUS | |||
| FLD | FRACT | |||
| FXTRACT | ||||
| FSTP | FRACT | |||
| FABS | ||||
| FISTP | WHOLE | |||
| MOV | ECX, WHOLE | |||
| MOV | EAX, FRACT | |||
| SHL | EAX, 9 | |||
| RCR | EAX, CL | |||
| Again2: | ||||
| MUL | EBX | |||
| PUSH | EAX | |||
| XCHG | EAX, EDX | |||
| ADD | AL, 30H | |||
| CALL | DISPS | |||
| POP | EAX | |||
| CMP | EAX, 0 | |||
| JNZ | Again2 | |||
| .EXIT 0 | ||||
| END | ||||