例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 |