Туториал по Ассемблеру NOP-erator(а) № 1, страница 3

После того, как вы скомпилируете проект язык delphi , как все остальные языки компилируется в ассемблере.Но как это выглядит в ассемблере?Ассемблер в действительности не использует переменные чтобы прибавить,вычесть,умножить, разделить числа.Он использует регистры процессора.Вы можете представить себе регистры процессора как переменные , которые находятся прямо "в" процессоре.Обычные переменные с их значением хранятся в памяти.Это имеет недостаток, что счет будет медленней, в действительности счет всё время проделывается через регистры процессора,но это не заметно для пользователя.Самые широкоиспользуемые и которые вам понадобятся следующие.Они имеют разные функции, но конечно же, могут быть использованы для разных целей.

EAX -Используется для сохранения числа и используется для счета

ECX -Используется как счетчик "переменная" и для счета

EDX -Остаток от деления сохраняется здесь

EBX -Как я знаю, может быть использован для всего

ESI -Исходный регистр для управления строками

EDI -Регистр назначения для управления строками

Как я уже сказал, они, могут быть свободно вами использованы.Я не уверен, но если вам, например, произвести манипуляцию строкой и нужен исходный регистр то должен быть использован ESI, потому что он быстрее, но не спрашивайте меня почему.Может быть это всего лишь легенда старого ассемблера.:)Теперь я покажу вам как это будет примерно выглядеть в ассемблере:

MOV EAX,число1 -Скопировать значение число1 в EAX

ADD EAX,число2 -Добавить значение число2 в EAX

MOV результат,EAX -Результат добавления сохраняется в -EAX и копируется в результат

Как вы видите, есть три команды для простого добавления .Многие люди говорят, что это большой недостаток ассемблера, но спустя некоторое время вы привыкните использовать это.Теперь вы заметили, что мы использовали ЕАХ для производа операции.Как я уже сказал,немного выше , ЕАХ используется для сохранения чисел в памяти и для счета.Вы должны также использовать ЕАХ для таких вещей, как эта.

Теперь, немного детальнее я объясню команды , которые мы рассмотрели выше:

MOV destination,source

"source" копируется в "destination".Я уверен, что вы заметили, как мы добавили регистры в переменные, и иногда переменные регистра.Возможны следующие комбинации:

MOV регистр,регистр

MOV переменная,регистр

MOV регистр,переменная

MOV регистр,значение

MOV переменная,значение

Но невозможно скопировать переменную в переменную.Единственная возможность, это:

MOV регистр,переменная1

MOV переменная2,регистр

Вы понимаете это?Надеюсь,вы уже поняли это!:)

Хорошо, следующая команда, которую я объясню будет команда ADD.Это в основном тоже самое , что и с командой MOV:

ADD first,second

"second" добавляется в first.Но значение first удаляется после добавления,и перезаписанное результатом добавления .Есть одинаковые комбинации регистров и переменных, которые вы можете использовать с ADD также как с выученной командой MOV.Почти также ведет себя команда SUB,это вычитает первый параметр из второго и сохраняет результат в первом.Также как и в ADD.

SUB first,second -Результат хранится в first

Более сложные, это умноженое и деление.Команды-MUL (для умножения) и DIV(для деления).В обоих вы ДОЛЖНЫ вставить первый операнд в ЕАХ и второй в ЕСХ.Я думаю что вместо ЕСХ вы можете использовать и другие(конечно,кроме ЕАХ), но лучше всего делать как я говорю.Тогда вы будете на безопасном пути.

Хорошо, сначала мы рассмотрим умножение:

MOV EAX,15 -Число(1-й множитель),которое мы хотим перемножить с числом в ЕСХ

MOV ECX,5 -Это множитель

MUL ECX -Команда MUL всего лишь ожидает один параметр:множитель, т.к.первый множитель произведения должен быть в ЕАХ

Результат умножения сохраняется в ЕАХ, так,что 15 перезаписывается на 75!Вот ещё один пример с некоторыми различиями,чтобы вы полностью вникли в урок:

MOV EAX,число1

MOV ECX,EAX

MUL ECX

Если вы вниматально прочитали, то вы должы теперь понимать, что ЕАХ умножается самим собой!Это всё по умножению.Теперь деление.Вы наверно помните, что регистр EDX получает остаток после деления.Если вы не помните,лишь взгляните на таблицу в начале туториала.Теперь кое-что, что вы должны всё время помнить: Перед делением числа на число,сначала очистите регистр EDX!!!Теперь вы должны знать как это делать, как всегда: MOV EDX,0.

Но есть способ как лучше очистить регистр,который вы должны запомнить:

XOR EDX,EDX.Я уверен новичок не поймёт этой команды, она должна что-то делать с битами и байтами.Я не собираюсь обеснять это сейчас, может в следующем туториале.Единственная вещь, которую вы пока должны знать-это то, что эта команда очищает регистр(устанавливает его на ноль), если вы используете

XOR регистр,регистр

В действительности нет разницы между MOV EDX,0 он лишь немного быстрее.

Хорошо, после очистки EDX регистра, мы делаем тожн самое,что и с умножением:

XOR EDX,EDX -чистый EDX

MOV EAX,любоечисло -копировать "любоечисло" в EAX

MOV ECX,5 -Вставить 5 в регистр ECX

DIV ECX -Задать EAX ECX(ом) и -сохранить результат в EAX

Видите это не трудно, вот следующий пример:

XOR EDX,EDX

MOV EAX,50

MOV ECX,10

DIV ECX

После 4-х строк,ЕАХ будет иметь значение равное 5,т.к. 50:10=5, простая матаматика

После теории начинаем практику

Теперь вы знаете основные команды и как проделывать некоторые математические действия, мы можем начать программировать.Я надеюсь вы не хотите лишь проделывать математические действия, но и хотите также показать результат?:)Единственная возможность котою мы знаем - это всплывающее окно.Мы уже знаем,как его использовать, но: Всплывающее окно требует адресс строки как один из параметров, не так ли? Но если мы считаем ,значение в регистре или переменная являются типами "настоящих" чисел,которые имеют формат string!Всегда помните это! Есть две возможности переконвертировать "настоящее" число в строку: Вы можете написать свой собственный алгоритм, или мы можем использовать функцию C.Пожалуйста не спрашивайте почему использование её возможно в асеемблере, я сам не знаю:). Чтобы использовать эту функцию в нашей программе, мы должны зделать что-то типа объявления в нашей программе.Сразу после строк include вы должны добавить следующие строки:

wsprintfA PROTO C :DWORD,:VARARG

wsprintf equ <wsprintfA>

При помощи функции wsprintf у вас есть возможность один формат в любой другой.Что во что конвертировать установлено в одном параметре функции wsprintf.Формат, которую мы будем использовать- это "%u".Она будет конвертировать "настоящее" число в строку.Формат должен быть в форме строко как эта: