
VIII Функции
Когда я начинал учить ассемблер, мне было не понятно, почему именно те числа помещаем именно в тот регистр, и почему именно то, помещаем сюда. Объясняю для таких, как я =)
В ассемблере тоже есть функции, с некоторыми из них мы встречались в шестом разделе, когда писали первую программку. Давайте вспомним:
1) mov dx, offset msg
mov ah, 09h
int 21h
2) mov ah, 04ch
int 21h
Итак, как я уже говорил, в ассемблере существуют функции. В нашем случае первая функция -- это вывод информации на экран. Вторая -- выход из программы. Давайте разберем подробней несколько функций.
Функция вывода строки на экран:
в ah надо поместить 09h, а в dx то, что надо выводить, в нашем случае, мы поместили в регистр dx адресс нашей строки, так как наша строка слишком длинная для помещения её в этот регистр. Что бы использовать функцию 09h, надо, чтоб в конце строки был символ доллара (вот мы и узнали зачем он там).
Функция выхода из программы:
в ah нужно поместить значение 04ch, и вызвать операцию прерывания.
Eщу одна функция вывода строки (мы её не использовали, так как она сложнее той, что мы использовали):
в регистр dx -- то, что надо вывести
в регистр cx -- количество выводимых символов
в регистр bx -- устройство, куда записывать, в нашем случае 1
в регистр ah -- 40h, сам код этой функции
Считать символ (там много чего запутано, будем пока его использовать, что после выполения программы, окно доса не закрывалось, а ждало пока мы нажмем клавишу)
в ah -- 1h
в al -- появится символ, который вы ввели.
Ну...я думал дать еще пару функций, потом передумал, так как решил, что они вам пока не нужны =)
Как вы уже заметили, после того, как всё помещено по нужным регистрам, нудо вызвать прерывание. Запомните это.
Такс, с функциями слегка разобрались. Пойдем дальше.
IX Стек
Нууу, стек -- это такая область памяти. Адресацией в стеке занимается регистр es. В основном, стек используется для временного хранения содержимого регистров. Стоит помнить, что именно для ВРЕМЕННОГО. Стек работает по принципу LIFO, Last In Firs Out. Т.е. последний элемент, который положили в стек, должен первым оттуда выйти. Примером может послужить обойма автомата. Думаю все когда нибудь держали в руках обойму от автомата. В школе, в старших классах на подготовке к армии должны были. Первая пуля, которая была туда засунута вылетит последней, а последняя засунутая -- первой. Команды для работы со стеком следующие:
push -- положить в стек
pop -- вытащить из стека
Как пример, возьмем кусок кода программы:
blah-blah ; какие-то действия
mov ax, 21 ; в регистр ax число 21
push ax ; значение регистра ax в стек
mov ah, 09h ; какие то оперции, в которых замешан регистр ax
blah-blah
pop ax ; вытащить из стека
В результате, в регистре ax будет число 21. Думаю и со стеком разобрались. Повторяю, я не углубляюсь в каждую из тем, я просто хочу дать первый толчок людям, которые начали изучать ассемблер.
X Команды перехода
Ну а как же без них. Хех. Благодаря командам перехода, на ассемблере мы можем программировать типовые управляющие структуры, if-else и так далее. Но для этого надо познакомится с командой cmp. Те, кто учил си, должны знать, что в си есть функция strcmp, которая сравнивает строки. Подобная команда есть и в асме.
CMP (сокращенно от compare) команда, которая сравнивает два значение. Синтаксис у неё следующий:
cmp операнд1,операнд2
Следующим этапом, чтобы понятькоманды перехода, надо понять, что такое метки. Метки, в языке ассемблера, используются, чтоб сделать программу более понятной, ну и чтобы можно было, при определенных условиях, на них переходить. Метка объявляется следующим образом:
Имя_метки:
Т.е. пишем название метки, и двоеточие. Такс, с метками тоже разобрались, ну это не сложно, но метки очень полезны.
И наконец команды перехода. Их можно разделить на две группы: команды безусловного перехода и команды условного перехода.
Команды безусловного перехода. Единственная команда безусловного перехода, которую мы рассмотрим -- jmp. Все мы знаем слово "jump", т.е. прыжок, вот сокращение этого слова, jmp, и есть команда безусловного перехода. Не, ну всё логично, прыгнуть на определенную метку. Так, что-то я отвлекся, продолжим. Синтаксис у этой команды такой:
jmp метка
Думаю тут ничего сложного нет.
Команды условного перехода. То есть те команды перехода, которые выполняются по определенному условию. Вспомним начало этого раздела, команда cmp, в основном, команды условного перехода выполняются после этой команды. Я приведу небольшой список этих команд:
je / jne прыгнуть, если равны / если не равны
jg / jng / jge прыгнуть, если больше / если не больше / если больше или равны
jl / jnl / jle прыгнуть, если меньше / если не меньше / если меньше или равны
ja / jna / jae прыгнуть, если выше (в смысле больше) / если не выше (в смысле больше) / если выше (в смысле больше) или равны
jb / jnb / jbe прыгнуть, если ниже (в смысле меньше) / если не ниже (в смысле меньше) / если ниже (в смысле меньше) или равны
Вначале каждой команды стоит буква j, означающая jump, прыгнуть. Далее идет условие (чтобы понять почему именно так, надо вспомнить некоторые английские слова: equal, not, above, below, greater, less, перевод найдите в словаре).
Лучше посмотреть на примере. Я не буду писать целую программу. только небольшой её кусочек.
mov ax,22
mov bx,21
cmp ax,bx
je Equal
jg Greater
jl Less
Equal:
; вывести сообщение, что равны
Greater:
; вывести сообщение, что операнд 1 больше оперенда 2
Less:
; вывести сообщение, что операнд 1 меньше оперенда 2
На этом, про команды перехода хватит.