Assembler







8087,
, . ,
..
= ,
8087. 8087, ,
, .
,
,
.


- . 7.23.

10 103 1039. ,
, IBM
.

10.
,
.
 
10,
.
, ,
,
, 10.
.
 
-
8087.
, .EXE.
, ,
STACK, .EXE.
CODE ,
CALCULATE_POWER. , END,
, ,
CALCULATE_POWER, END.
 
.
CODE DS
.EXE.
FINIT 8087,
. 8087
,
. FINIT
8087,
. FINIT
. FINIT
8087.
 
1000 ST1 1
ST0. 8087
. ST0
, ST1 103.
ST1
ST0 . POWER
10, ST0.
 
POWER_LOOP ST0 ST1,
( 1000),
ST0 103 . FST .
POWER_LOOP
. TRANSLATE
ASCII ,
. POWER (
), ,
8087, ASCII. DOS
. POWER_LOOP ,
1038.
, 1038 - ,
.
,
10308. . 7.23 ,
.
 

Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:04:33
. 7.23 10 Page 1-1
 
 
PAGE ,132
TITLE . 7.23 10
 
0000 STACK SEGMENT STACK
0000 0040[ DW 64 DUP (?)
????
]
 
0080 STACK ENDS
 
0000 CODE SEGMENT
ASSUME CS:CODE
 
0000 ???????? POWER_OF_TEN DD ? ; 10**x,
;
0004 0002[ OUTPUT_POWER DB 2 DUP (' ') ;
20
]
 
0006 48 20 20 20 20 DB 'H ' ;
000B 0008[ OUTPUT_STRING DB 8 DUP (' ') ; -
20 20 20 20 20
20 20 20 20
]
0053 48 0D 0A 24 DB 'H',13,10,'$' ;
0057 00 POWER DB 0 ; 10
0058 03E8 THOUSAND DW 1000 ;
005A 03BF CONTROL_87 DW 03BFH
 
005C CALCULATE_POWER PROC FAR
005C 1E PUSH DS ;
005D B8 0000 MOV AX, 0
0060 50 PUSH AX
0061 0E PUSH CS
0062 1F POP DS
ASSUME DS:CODE ;
0063 9B DB E3 FINIT ; 8087
 
. 7.23 () ()
0066 9B DF 06 0058 R FILD THOUSAND ; 10**3 8087
006B 9B D9 E8 FLD1 ; 8087
006E POWER_LOOP:
006E 9B DC 8E 0000 FMUL ST(1) ; ST(0) ST(1)
0073 9B D9 16 0000 R FST POWER_OF_TEN ;
0078 80 06 0057 R 03 ADD POWER, 3 ;
007D A0 0057 R MOV AL, POWER ;
0080 8D 1E 0004 R LEA BX, OUTPUT_POWER
0084 E8 00AC R CALL TRANSLATE
0087 B9 0004 MOV CX, 4
008A 8D 1E 000B R LEA BX, OUTPUT_STRING
008E 8D 36 0003 R LEA SI, POWER_OF_TEN+3
0092 FD STD ;
0093 VALUE_OUTPUT:
 
0093 AC LODSB ;
0094 E8 00AC R CALL TRANSLATE ;
0097 E2 FA LOOP VALUE_OUTPUT ;
 
0099 8D 16 0004 R LEA DX, OUTPUT_POWER
009D B4 09 MOV AH, 9H
009F CD 21 INT 21H
00A1 80 3E 0057 R 26 CMP POWER, 38
00A6 72 C6 JB POWER_LOOP
00A8 9B DE D9 FCOMPP ;
00AB CB RET
00AC CALCULATE_POWER ENDP
 
00AC TRANSLATE PROC NEAR
00AC 50 PUSH AX ;
00AD 51 PUSH CX
00AE B1 04 MOV CL, 4 ;
00B0 D2 E8 SHR AL, CL ;
00B2 59 POP CX
00B3 E8 00CB R CALL XLAT_OUTPUT ;
00B6 58 POP AX ;
00B7 E8 00CB R CALL XLAT_OUTPUT ;
00BA C3 RET
00BB TRANSLATE ENDP
 
00BB 30 31 32 33 34 35 36 ASCII_TABLE DB '0123456789ABCDEF'
37 38 39 41 42 43 44
45 46
00CB XLAT_OUTPUT PROC NEAR
00CB 24 0F AND AL, 0FH ;
00CD 53 PUSH BX
00CE 8D 1E 00BB R LEA BX, ASCII_TABLE ;
00D2 D7 XLAT ASCII_TABLE ;
00D3 5B POP BX
00D4 88 07 MOV [BX], AL ;
00D6 43 INC BX ;
00D7 C3 RET
00D8 XLAT_OUTPUT ENDP
00D8 CODE ENDS
END CALCULATE_POWER
. 7.23 () ()
A>PRINT10
03H 447A0000H
06H 49742400H
09H 4E6E6B28H
0CH 5368D4A5H
0FH 58635FA9H
12H 5D5E0B6BH
15H 6258D727H
18H 6753C21CH
1BH 6C4ECB8FH
1EH 7149F2CAH
21H 76453719H
24H 7B4097CEH
27H 7F800000H
 
. 7.23 (b)
 
. 7.23 (a) 10; (b) 10
 
TRANSLATE, ,
8087.
- . ,
XLAT (
0 0FH) ASCII ( 0 F).
0 ,
ASCII A F
0 9; .
,
.