- •Лекция №12. Процедуры в программах на ассемблере. Crc-код
- •1) Если имя – это имя переменной, то тип может принимать значения byte, word, dword, pword, fword, qword и tbyte;
- •3) Если имя – это имя константы, то тип должен быть abs.
- •Выполнить трансляцию модуля modul1.Asm и получить объектный модуль modul1.Obj;
- •Выполнить трансляцию модуля modul2.Asm и получить объектный модуль modul2.Obj;
- •Cкомпановать программу утилитой tlink командной строкой вида:
- •1) Используя последовательность из n команд рор хх.
- •2) Откорректировать регистр указателя стека sp на величину 2*n, например, командой
- •1) Сложение по правилам полиномиальной арифметики по модулю 2 (crc-арифметика), будет выполнено так (нет переносов):
- •2) Операция вычитания:
- •1) Согласование имен,
- •2) Согласование параметров,
- •3) Согласование вызовов.
- •Примеры
- •1) Пример использования директивы asm и команд сопроцессора в программе на языке Паскаль (Delphi 5.0).
- •3) Программа, которая использует функцию stdcall get_str_length с асемблерной вставкой, для нахождения длины asciiz-строки.
- •4) Программа, которая складывает два числа в десятичной системе исчисления и выдаёт результат тоже в десятичной системе исчисления. (Example2)
- •Выполнить трансляцию модуля modul1.Asm и получить объектный модуль modul1.Obj;
- •Выполнить трансляцию модуля modul2.Asm и получить объектный модуль modul2.Obj;
- •Cкомпановать программу утилитой tlink командной строкой вида:
- •4) В ассемблерном модуле вызываемая процедура должна быть дополнительно объявлена при помощи директивы public.
- •К имени процедуры в объектном модуле автоматически добавляется @8 (а не @0).
- •Ассемблер автоматически управляется со стеком.
- •3) Сложение двух целых чисел.
Примеры
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 в один исполняемый модуль, необходимо: