Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_12-14_2011_protsedury_SRC_slaydy.doc
Скачиваний:
9
Добавлен:
21.12.2018
Размер:
1 Mб
Скачать

Примеры

1) Пример использования директивы asm и команд сопроцессора в программе на языке Паскаль (Delphi 5.0).

program Project2;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

d:double;

function soproc(f:double): double;

var res:double;

begin

asm

FLD f

FSIN

FSTP res

end;

soproc:=res;

end;

begin

d:=-pi;

while (d<=pi) do

begin

writeln(d:10:2,'-',soproc(d):10:2);

d:=d+0.1;

end;

end.

2) Пример использования директивы ASM и команд сопроцессора в программе на языке Си (Borland C++ 5.0).

#include <windows.h>

#include <stdio.h>

double soproc(double f);

void main()

{

double w=-3.14;

while(w<=3.14)

{

printf("%f- %f\n", w, soproc(w));

w=w+0.1;

}

ExitProcess(0);

}

double soproc(double f)

{

double d;

asm {

FLD f

FSIN

FSTP d

}

return d;

}

3) Программа, которая использует функцию stdcall get_str_length с асемблерной вставкой, для нахождения длины asciiz-строки.

#include "stdafx.h"

int _stdcall get_str_length(char *inputstr)

{

__asm{

mov edi, inputstr

mov esi, edi

mov ecx, -1

xor al, al

cld

repne scasb

sub edi, esi

; Результат работы функции следует возвращать в eax.

mov eax, edi

dec eax

}

}

int main()

{

char str_1[]="Hello, world! My name is Alex...";

int i;

i = get_str_length(str_1);

printf("String: %s\nLength: %d", str_1, i);

printf("\n");

return 0;

}

4) Программа, которая складывает два числа в десятичной системе исчисления и выдаёт результат тоже в десятичной системе исчисления. (Example2)

#include "stdafx.h"

int main()

{

int a = 120;

int b = 159;

int c;

__asm{

mov eax, a

mov ebx, b

add eax, ebx

mov c, eax

}

printf("a + b = %d + %d = %d\n", a, b, c);

return 0;

}

Пример использования директив extrn и public на схеме связи двух модулей Модуль1.asm и Модуль2.asm.

; -------------------------- Модуль 1 ------------------------

masm

model small

.stack 100h

.data

… …

.code

My_proc_1 proc

My_proc_1 endp

My_proc_2 proc

My_proc_2 endp

; -----Объявляем процедуру My_proc_1 видимой извне ---------

public My_proc_1

start:

….

….

end start

; -------------------------- Модуль 2 ------------------------

masm

model small

.stack 100h

.data

… …

.code

Extrn my_proc_1 ; объявляем процедуру my_proc_1 внешней

start:

….

….

call my_proc_1 ; вызов my_proc_1 из модуля 1

end star

Если необходимо собрать два ассемблерных модуля, например modul1.asm и modul2.asm в один исполняемый модуль, необходимо:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]