Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Бип из системно... 65535
Пример работы с... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
21 ошибка прогр... 65535
Гостевая книга ... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Содержание сайт... 65535
Invision Power ... 65535
Программируемая... 65535
Оператор выбора... 65535
Модуль Forms 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,152
новичок: Chavo
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных склада на Delphi + Схема БД
Моделирование работы участка термической обработки шестерен на GPSS + По...
Файл записей с выводом обратного заголовка на Turbo Pascal

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Программирование АССЕМБЛЕРОМ в Delphi
Автор: Александр Баранецкий

Каждый день множество программистов (кроме опытных) в Delphi, используя код высокого уровня, пишут свои программы. Как правило, пренебрегая таким понятием как Assembler, имеется ввиду в строенный в DELPHI. Конечно, тяжело сказать, что на голом «асе» можно сотворить великолепный шедевр имеется ввиду красота - VCL (Visual Component Library). Особенно относительно начинающих программистов, которые только начинают учить IDE. Но зато можно повысить скорость какого нибудь математического или системного алгоритма.

Сегодня я представляю на ваш суд статью по «асу». Скорее всего, она будет интересна начинающим программерам. Я не мастер, но сеже.

Программирование АССЕМБЛЕРОМ в “Delphi”

Для начала несколько основных команд.
MOV - предназначена для занесения в ячейку памяти значения. Например:


var
x: integer;
begin
Mov X, 10 // Занесение в Х значение 10 // X:=10;
Mov eax, 45 //Занесение в быстрый регистр
Mov ebx, eax //Присвоения значения одного регистра другому
Mov x.edx //Занесение в х значения edx

Первый параметр присваивающий объект, второй присеваемое значение.

ADD - Предназначена для прибавления к объекту значения. Значения передаются через запитаю. Например :

add eax,2
add x,76


Первый параметр принимающий объект, второй добавляемое значение.

SUB - Предназначена для вычитания от объекта значения. Значения передаются через запитаю. Например :

sub eax,18
Sub x,6


Первый параметр объект от которого отнимается , второй отнимаемое значение.

IMUL - команда умножения
IDIV - команда деления
CMP - Команда проверки
JNZ,JMP,JA - команды перехода.

Теперь перейдем к практическим примерам:

// 1 Функция сложения.

function plus(x, y: integer): integer;
asm
mov eax,x
add eax,y
end;


{
Функция вернет сумму «x» и «y». Сперва заносим «х» (move eax,x) потом
прибавляем к уже имеющемуся «y» (add eax,y).
}

// 2. Функция умножения

function Umnojenie(x, z: integer): integer;
asm
mov ebx,z
mov eax,x
imul ebx
end;


{
Заносим в обратном порядке «x» и «z» Отдаем команду на
умножение первого значения на второе «imul ebx ».
}

// 3. Функция вычитания

function Minus(x, y: integer): integer;
asm
sub x,y
end;


// Просто отнимаем одно от другого

// 4 Функция деления

function divider(x, y: integer): integer;
asm
mov ebx,y {1}
cdq {2}
idiv ebx {3}
end;

Эта функция отличается от остальных методом применения операторов. Занесение значения. 2. Предварительная обработка. 3. Деление.

Это были простейшие математические операторы, теперь мы рассмотрим более сложные операторы цикла и условие

Цикл на «асе» заключается в том что создается контрольный объект и при достижении определенного условия не происходи перехода к начальной контрольной точке отчета цикла.

procedure asm_cycle;
label
lb;
var
d: integer;
begin
asm
mov ebx,0
mov d,0
lb:
add d,1
inc ebx
cmp ebx,10
jnz lb
mov ebx,0
end;
Writeln(d);
end;

Метка lb нужна, чтобы назначить контрольную точку начала операторов цикла. Переменная «d:integer» для проверки результатов работы цикла. С зарезервированного слова ASM начинаем анализ. Mov edx,0 «edx» выступает как контрольный регистр в нем фиксируется количество повторений. А с самого начало он указывает с какой величины пойдет отчет Например mov edx,0 = for i := 0 to .. do, mov edx,43 = for i:=43 to ..do Мы установим его в 0 чтобы отчет шел с нуля. Переменную d мы тоже обнулим. Третья строка это метка начала после нее идут операторы цикла. Следующий оператор наш рабочий оператор. У нас он 1 но может быть множество. Inc edx добавляем в регистр 1 шаг пройденного цикла если пропустить то цикл будет идти вечно. cmp ebx,10 Один из основных операторов он проверяет не достиг ли цикл верхний предел. Проверка идет в самом конце. Если вернет FALSE то срабатывает следующий оператор перехода на метку т.е в начало цикла и все повторяется до тех пор пока cmp не вернет TRUE в следствии чего не сработает оператор перехода JNZ. Последними операторами обнуляем счетчик и показываем результат.

Условный оператор IF..THEN..ELSE.

procedure if_sample(x: integer);
var
res: integer;
label
exit, lb;
begin
asm
cmp x,0
jnz lb
mov res,45
jmp exit
lb:mov res,0
exit: mov eax,0
end;
Writeln(res);
end;

На PASCAL этот оператор пишется так if x = 0 then x:=45 else x:=0; Сначала идет проверка не равен ли х нулю если не равен то переход на метку ld, На которой оператор обнуления. А если равен, то оператор перехода на ld не срабатывает. Срабатывает mov res,45. После которого состоится переход на метку EXIT. В «асе» желательно прописывать свою метку (у нас EXIT), которая по необходимости выйдет и процедуры.

И последние. Вызов внешней процедуры. Допустим, надо вызвать внешнюю процедуру.


procedure call_s(x, d: integer; bol: boolean);
Для вызова внешних модулей применяется метод CALL.

procedure call_sample;
asm
mov eax,4
mov edx,34
mov cl,0
call call_s
end;


Сперва передаются параметры последовательно а потом сам вызов.

На этом мой маленький туториал окончен. Все примеры вы найдете в приложенном файле pr_asm. Это маленькое консольное приложение, в котором представлены все примеры с комментариями.

P.S. Я не мастер в «асе», и эта статья не сделает вас гениями она лишь призвана показать некоторые стандартные методы «паса» интерпретированные в «ас». Мастера «аса» не смейтесь надо мной сильно, так как я уже сказал, что я не мастер, я просто энтузиаст в «асе».

В следующей статье я продолжу описание более продвинутых операторов и методов а также попробуем написать маленькое «ас» приложение.
Опубликовал Kest Ноябрь 13 2008 14:58:19 · 0 Комментариев · 9887 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Создание оригинал...
Создание фракталов
Длинный заголовок...
Размещение элемен...
Пример работы с б...
Панель для реклам...
VksButton
Gold Submitter II...
Разработка интерн...
«Философия» прогр...
SearchAndReplace
SMLPack v1.0
Развивающийся фла...
THttpScan v4.1
DiZsubmit
Midi
CoolHints2k
В.Понамарев - COM...
Пример клиента ФТ...
DelphiX

Топ загрузок
Приложение Клие... 100682
Delphi 7 Enterp... 95258
Converter AMR<-... 20187
GPSS World Stud... 16684
Borland C++Buil... 13898
Borland Delphi ... 9709
Turbo Pascal fo... 7229
Калькулятор [Ис... 5595
Visual Studio 2... 5127
FreeSMS v1.3.1 3621
Случайные статьи
Назначение и особе...
Объекты Range и Cells
Виртуальный клуб Э...
Инфографика — это ...
Пакетировочные прессы
Варианты
Представление альт...
Целые типы
Разработать процед...
Проект VirtualSOMA
Смысл разработки и...
Вкладка Configure ...
Введение в дисциплину
Выделение строк та...
Toning the legs an...
средствами IPSecШи...
Функции GetX и Get...
Подсчет времени ра...
Архитектура Ethern...
Лабораторное занят...
Конференция по PHP...
Оптимизация сайта ...
Также служба должн...
Достаём себе хорош...
Композитные/S-Vide...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?