Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ob_asm.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
61.95 Кб
Скачать

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

На этом, про команды перехода хватит.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]