Задание:
Разработать подпрограмму на языке Ассемблера, обеспечивающую вычисление заданной математической функции с использованием математического сопроцессора. Подпрограмма должна вызываться из головной программы, разработанной на языке С. При этом должны быть обеспечены: заданный способ вызова и обмен параметрами.
Вариант: ВАРИАНТ 1.
/*------------------------------------------------------------------------
* filename - hypot.cas
*
* function(s)
* hypot - calculates hypotenuse of right angle
*-----------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*
Name hypot - calculates hypotenuse of right angle
Usage double hypot(double x, double y);
Prototype in math.h
Description hypot calculates the value z where
z^2 = x^2 + y^2
This is equivalent to the length of the hypotenuse of a
right triangle, if the lengths of the two sides are x and y.
Return value hypot returns sqrt (x^2 + y^2);
On error (such as an overflow), hypot returns the value
HUGE_VAL, and sets errno to
ERANGE Value out of range
*---------------------------------------------------------------------------*/
Постановка задания:
Задача будет решаться написанием модуля на ассемблере для работы с сопроцессором и подключением его к программе на TPascal.
Текст программы:
TITLE lr61 obj
.MODEL LARGE,PASCAL
.STACK 256
.8087
DATA SEGMENT WORD PUBLIC
EXTRN OTV:DWORD
DATA ENDS
.CODE
ASSUME DS:DATA
MAIN:
gyp PROC NEAR A:DWORD,B:DWORD
PUBLIC gyp
FLD A
FMUL A
FSTP A
FLD B
FMUL B
FSTP B
FLD A
FADD B
FSQRT
FSTP OTV
RET
gyp ENDP
END MAIN
PROGRAM MASM;
USES CRT;
PROCEDURE gyp(A,B:SINGLE); EXTERNAL; {$L lr91.OBJ}
VAR A,B:SINGLE;
OTV:SINGLE;
BEGIN
CLRSCR;
WRITELN('‹ Ў®а в®а п а Ў®в ь9');
WRITELN('Vi4isliaet gypotenuzu=(a^2+b^2)^(1/2).');
WRITELN;
WRITE('‚ўҐ¤ЁвҐ a: ');
READLN(A);
WRITE('‚ўҐ¤ЁвҐ b: ');
READLN(B);
GYP(A,B);
writeln('Otvet: gypotenuza=',OTV:3:3);
READLN;
END.
Листинг программы:
Microsoft (R) Macro Assembler Version 5.10 5/19/4
lr61 obj Page 1-1
1 TITLE lr61 obj
2 .MODEL LARGE,PASCAL
3 .STACK 256
4 .8087
5 0000 DATA SEGMENT WORD PUBLIC
6 EXTRN OTV:DWORD
7 0000 DATA ENDS
8 .CODE
9 ASSUME DS:DATA
10 0000 MAIN:
11 0000 gyp PROC NEAR A:DWORD,B:DWORD
12 PUBLIC gyp
13 0003 9B D9 46 08 FLD A
14 0007 9B D8 4E 08 FMUL A
15 000B 9B D9 5E 08 FSTP A
16 000F 9B D9 46 04 FLD B
17 0013 9B D8 4E 04 FMUL B
18 0017 9B D9 5E 04 FSTP B
19 001B 9B D9 46 08 FLD A
20 001F 9B D8 46 04 FADD B
21 0023 9B D9 FA FSQRT
22 0026 9B D9 1E 0000 E FSTP OTV
23 002C C2 0008 RET
24 002F gyp ENDP
25 END MAIN
Microsoft (R) Macro Assembler Version 5.10 5/19/4
lr61 obj Symbols-1
Segments and Groups:
N a m e Length Align Combine Class
DATA . . . . . . . . . . . . . . 0000 WORD PUBLIC
DGROUP . . . . . . . . . . . . . GROUP
_DATA . . . . . . . . . . . . 0000 WORD PUBLIC 'DATA'
STACK . . . . . . . . . . . . 0100 PARA STACK 'STACK'
LR91_TEXT . . . . . . . . . . . 002F WORD PUBLIC 'CODE'
Symbols:
N a m e Type Value Attr
A . . . . . . . . . . . . . . . TEXT DWORD PTR [BP]+8
B . . . . . . . . . . . . . . . TEXT DWORD PTR [BP]+4
GYP . . . . . . . . . . . . . . N PROC 0000 LR91_TEXT Global Length = 002F
MAIN . . . . . . . . . . . . . . L NEAR 0000 LR91_TEXT
OTV . . . . . . . . . . . . . . V DWORD 0000 DATA External
@CODE . . . . . . . . . . . . . TEXT lr91_TEXT
@CODESIZE . . . . . . . . . . . TEXT 1
@CPU . . . . . . . . . . . . . . TEXT 257
@DATASIZE . . . . . . . . . . . TEXT 1
@FILENAME . . . . . . . . . . . TEXT lr91
@VERSION . . . . . . . . . . . . TEXT 510
25 Source Lines
25 Total Lines
22 Symbols
46296 + 441700 Bytes symbol space free
0 Warning Errors
0 Severe Errors