Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Для организации последовательного перебора элементов массива выполняется
цикл loop со значением счетчика в регистре ЕСХ, равным уменьшенному
на 1 размеру массива:
@next:
fcom DWORD PTR
fstsw AX
sahf
je @ found
add E S I , 4
loop @next
xor EAX, EAX
jmp @exit
Исходное вещественное число находится в вершине стека сопроцессора,
куда оно загружается командой:
fid DWORD PTR fVal

Если число обнаружено в массиве, выполняется переход на метку @ found,
где вычисляется позиция найденного элемента в массиве:
@found:
sub E S I , EDX
shr E S I , 2
mov EAX, ESI

В регистре EDX находится смещение первого элемента массива, т. е. адрес
массива, а в регистре E S I — адрес обнаруженного элемента. Разность содержимого
двух этих регистров дает нам смещение (позицию) элемента
в байтах. Поскольку вещественные числа типа single отстоят друг от друга
на 4 байта, то сохраненную в регистре E S I величину смещения необходимо
разделить на 4, что и выполняет команда:
shr ESI, 2

Результат возвращается, как обычно, в регистре ЕАХ И отображается в поле
редактирования.
Обработчик нажатия кнопки осуществляет ввод-вывод информации и интерфейс
с ассемблерной процедурой.

Следующий пример является, пожалуй, более сложным по сравнению с
предыдущими. Имеется два массива вещественных чисел одинаковой размерности.
Требуется найти в них несовпадающие элементы.
В результате выполнения приложения на экран будет выведено содержимое
массива целых чисел, которые являются номерами позиций несовпадающих
элементов в обоих массивах. На главной форме приложения разместим
4 поля редактирования Edit, две кнопки Button и две метки Label.
Исходный текст программы представлен в листинге 6.28.
Листинг 6.28. Программа, выполняющая поиск несовпадающих элементов
в двух массивах вещественных чисел
unit uneqpas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForml = class(TForm)
Editl : TEdit;
Edit2 : TEdit;
Buttonl: TButton;
Button2: TButton;
Edit3 : TEdit;
Edit4 : TEdit;
Labell : TLabel;
Label2 : TLabel;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
xl: array [1..7] of Single = (-5.6, -2.3, 23, 6.9, 7, 23, - 1 ) ;
x2: array [1..7] of Single = (5.6, -2.3, 22, 9, 7, 3, -1) ;
itmp: array [1..7] of Integer;
xlen, cnt: Integer;
implementation
{$R *.dfm}
procedure FindDif(var xl, x2, itmp; xlen: Integer);
asm
push
push
push
EBX
ESI
EDI
mov ESI, xl
mov EDI, x2
@again:
add ESI, 4
add EDI, 4
mov EAX, []
cmp EAX, []
jne @store
@next:
dec ECX
cmp ECX, 0
jnz @again
jmp @exit
@store:
mov
sub
shr
add
mov
add
jmp
@exit:
pop
pop
pop
end;
EAX, ESI
EAX, EDX
EAX, 2
EAX, 1
[EBX], EAX
EBX, 4
@next
EDI
ESI
EBX
procedure TForml.ButtonlClick(Sender: TObject);
begin
for cnt := 1 to xlen do
itmp[cnt] := 0;
for cnt :'= 1 to xlen do
mov EDX, ESI
mov EBX, itmp
mov ECX, DWORD PTR xlen
sub ESI, 4
sub EDI, 4
begin
if xl[cnt] <> x2[cnt] then
itmp[cnt] := cnt
else continue;
end;
Editl.Text := ' ';
for cnt:= 1 to xlen do
begin
if itmp[cnt] <> 0 then
Editl.Text := Editl.Text + IntToStr(itmp[cnt]) + ', ';
end;
end;
procedure TForml.Button2Click(Sender: TObject);
begin
for cnt := 1 to xlen do
itmp[cnt] := 0;
FindDif(xl, x2, itmp, xlen);
Edit2.Text := ' ';
for cnt := 1 to xlen do
begin
if itmp[cnt] <> 0 then
Edit2.Text := Edit2.Text + IntToStr(itmp[cnt]) + ', ';
end;
end;
procedure TForml.FormCreate(Sender: TObject);
begin
xlen:= SizeOf(xl) div 4;
Edit3.Text:= ' ';
Edit4.Text:= ' ';
for cnt:= 1 to xlen do
Edit3.Text := Edit3.Text+FloatToStrF(xl[cnt], ffGeneral, 5, 7)+'
for cnt:= 1 to xlen do •
Edit4.Text := Edit4.Text+FloatToStrF(x2[cnt], ffGeneral, 5, 7)+'
end;
end.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru