Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65458
Модуль Forms 65218
Пример работы с... 64715
ТЕХНОЛОГИИ ДОСТ... 61911
Имитационное мо... 57791
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...
Информационная система - продуктовый магазин на 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 November 13 2008 14:58:19 · 0 Комментариев · 8856 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
SMLPack v1.0
RbControls
Comdrv
AddPage [Исходник...
Керниган Б.В., Ри...
Assistant
Delphi 2005 Учимс...
Converter AMR<->W...
StartMark
начисление процен...
Язык программиров...
PHP/MySQL для нач...
Панель статистики...
Counter [Исходник...
Программа рисует ...
Crystal Button
WinAmp
Ведение справочны...
100 компонентов о...
DiZsubmit

Топ загрузок
Приложение Клие... 100470
Delphi 7 Enterp... 87103
Converter AMR<-... 20078
GPSS World Stud... 12856
Borland C++Buil... 11848
Borland Delphi ... 8604
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4803
FreeSMS v1.3.1 3542
Случайные статьи
Успешная проверка
Выбор символа разд...
Где бесплатно скач...
Чтобы сократить не...
Обучение
Error in Initial c...
Общность предмета...
Ввод-вывод и драйв...
ПОПОЛНЕНИЕ БАЗЫ ЗН...
СПИСКИ ПОЛЬЗОВАТЕЛЯ
Сущность имитацион...
Синергетика
RESET (СБРОСИТЬ)
Логическая задача ...
5.4.2. Чтение файлов
Создание структуры...
Вывод текста в гра...
Обеды рабочим
Как увидеть пробле...
Тянем-потянем за с...
для служб терминал...
Контекстная реклама
Задающие устройства
Лотерея - доступны...
Задание области пе...
Статистика



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


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