Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
76.29 Кб
Скачать

Задание:

Разработать подпрограмму на языке Ассемблера, обеспечивающую вычисление заданной математической функции с использованием математического сопроцессора. Подпрограмма должна вызываться из головной программы, разработанной на языке С. При этом должны быть обеспечены: заданный способ вызова и обмен параметрами.

Вариант: ВАРИАНТ 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

Соседние файлы в папке Лабораторная работа №9