Главная Обратная связь

Дисциплины:






Обмен данными между процедурой и вызывающей программой



Команды вызова процедуры по-другому называются командами перехода с запоминанием

точки возврата, что более правильно, так как их можно использовать и вообще без процедур. По

своей сути это команды безусловного перехода, которые перед передачей управления в другое ме-

сто программы запоминают в стеке адрес следующей за ними команды. Таким образом, обеспечива-

ется возможность возврата в точку программы, следующую непосредственно за командой вызова

процедуры. На языке Ассемблера эти команды имеют следующий вид:

call op1

где op1 может иметь следующие форматы: i16, r16, m16, m32 и i32. Как видим, по сравнению с

командой обычного безусловного перехода jmp op1 здесь не реализован близкий короткий отно-

сительный переход call i8 , он практически бесполезен в практике программирования, так как

почти всегда процедура находится достаточно далеко от точки её вызова. Следовательно, как и ко-

манды безусловного перехода, команды вызова процедуры бывают близкими (внутрисегментными,

где op1 форматов i16, r16, m16) и дальними (межсегментными, где op1 форматов m32 и i32).

Близкий вызов процедуры выполняется по следующей схеме:

Встек(IP); jmp op1

Здесь запись Встек(IP) обозначает действие "записать значение регистра счётчика адреса IP в

стек". Заметим, что это часть действия при вызове процедуры, а отдельной команды push IP в

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

Встек(CS); Встек(IP); jmp op1

Для возврата на команду программы, адрес которой находится на вершине стека, предназначена

команда возврата из процедуры, по сути, это тоже команда безусловного перехода. Команда воз-

врата из процедуры имеет следующий формат:

ret [i16]; Операнд в Ассемблере может быть опущен

На языке машины у этой команды есть две модификации, отличающиеся кодами операций:

близкий и дальний возврат из процедуры. Нужный код операции выбирается программой Ассемб-

лера автоматически, по контексту использования команды возврата, о чём мы будем говорить далее.

Если программист опускает беззнаковый параметр этой команды i16, то Ассемблер автоматически

полагает операнд i16=0.

Команда близкого возврата из процедуры выполняется по схеме:

Изстека(IP); SP:=(SP + i16)mod 2

Здесь, по аналогии с командой вызова процедуры, запись Изстека(IP) обозначает действие

"считать из стека слово и записать его в регистр IP".

Команда дальнего возврата из процедуры выполняется по схеме:

Изстека(IP); Изстека(CS); SP:=(SP + i16)mod 2

По нашей классификации переходов команда ret осуществляет близкий или дальний абсолют-



ный косвенный переход. Дополнительной действие команды возврата SP:=(SP + i16)mod 2

приводит к тому, что для параметра i16<>0 указатель вершины стека SP устанавливается на некоторое

другое место в стеке. В большинстве случаев этот операнд имеет смысл использовать для чётных

i16>0, и только тогда, когда SP+i16<=N, где N – размер стека в байтах. В этом случае из стека

удаляются i16 div 2 слов, что можно трактовать как очистку стека от данного количества

слов. Возможность очистки стека при выполнении команды возврата, как мы вскоре увидим, будет

весьма полезной при программировании процедур на Ассемблере, она будет аналогом уничтожения

локальных переменных Паскаля при выходе из процедуры.

5. Понятие команды и директивы. Процесс разработки программы на Ассембелере.

Команды. Это символьная форма записи машинных команд.

[<метка>:] <мнемокод> [<операнды>] [;<комментарий>]

Метка с двоеточием, а также точка с запятой и комментарий могут отсутствовать.

метка синтаксически - имя команды, ее можно использовать в командах перехода на данную команду.. Если метка есть то после нее обязательно двоеточие нужна для ссылок, например для перехода на эту команду. В строке может стоять только метка, метит следующую строку. Если длинная метка или если необходимо пометить строку несколькими метками.

Мнемокод (мнемонический код) является обязательной частью команды и указывает ту операцию, которую должна выполнить команда. Записывается в символьной форме.

Операнды, если они есть отделяются друг от друга запятыми.

Комментарий - после знака ; не влияет на смысл команды, а лишь поясняет ее. Действителен для данной строки.

Регистры указываются своими именами, например:

MOV AX,SI ;оба операнда - регистры

Непосредственные операнды задаются константными выражениями (их значениями являются константы-числа), например:

MOV BH,5 ;5 - непосредственный операнд

MOV DI,SIZE X ;SIZE X (число байтов, занимаемых переменной X) - ;непосредственный операнд

Адреса описываются адресными выражениями (например, именами переменных), которые могут быть модифицированы по одному или двум регистрам; например, в следующих командах первые операнды задают адреса:

MOV X,AH

MOV X[BX][DI],5

MOV [BX],CL

Помимо машинных команд в программе на ЯА надо указывать и другие вещи. Например, надо сообщать, какие константы и переменные используются в программе и какие имена мы им дали. Это делается с помощью предложений, называемых приказами ассемблеру или директивами.

Синтаксис директив следующий:

[<имя>] <название директивы> [<операнды>] [< ; комментарий>]

Пример: X DB 10, -5, 0FFh ; массив X

Как видно, формат директив в целом совпадает с форматом команд. Единственное отличие - в директиве после имени, если оно есть, не ставится двоеточие. Имя, указываемое в начале директивы, - это, как правило, имя константы или переменной, описываемой данной директивой. В нашем примере X - это имя переменной - массива из трех элементов. Названия директив, как и мнемокоды, - служебные слова. При этом заранее известно, какие служебные слова обозначают директивы, а какие - мнемокоды, и путаницы здесь нет. Названия директив будут указываться по мере знакомства с директивами. Остальные части директивы (операнды и комментарий) записываются также, как и в командах.

6.

Директива EQU Режимы Ideal, MASM

имя EQU выражение

Определяет "имя", как строку, псевдоним или числовое присваивание, содержащее результат вычисления выражения. Позволяет назначать имена переменных и констант.

TIMES EQU 10

Имя, в данном случае TIMES, может быть представлено любым допустимым в ассемблере именем. Теперь, в какой-бы команде или директиве не использовалось слово TIMES ассемблер подставит значение 10.

Директива « =» Режим Ideal, MASM

имя = выражение

Определяет или переопределяет числовое присваивание.

Счетчик адреса — специфический вид операнда. Он обозначается знаком $.

Когда транслятор ассемблера встречает в исходной программе этот символ, то он подставляет вместо него текущее значение счетчика адреса. Значение счетчика адреса-смещение текущей машинной команды относительно начала сегмента кода.

При обработке транслятором очередной команды ассемблера счетчик адреса увеличивается на длину сформированной машинной команды. Важно правильно понимать этот момент. К примеру, обработка директив ассемблера не влечет за собой изменения счетчика. Директивы, в отличие от команд ассемблера, — это лишь указания транслятору на выполнение определенных действий по формированию машинного представления программы, и для них транслятором не генерируется никаких конструкций в памяти.

jmp $+3 ;безусловный переход на команду mov

cld ;длина команды cld составляет 1 байт

mov al,1

8.Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды

используются для сброса и установки бит и для арифметических операций в коде ASCII. Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.

AND: Если оба из сравниваемых битов равны 1, то результат равен 1; во всех остальных случаях результат - 0.

OR: Если хотя бы один из сравниваемых битов равен 1, то результат равен 1; если сравниваемые биты равны 0, то результат - 0.

XOR: Если один из сравниваемых битов равен 0, а другой равен 1, то результат равен 1; если сравниваемые биты одинаковы (оба - 0 или оба - 1) то результат - 0.

TEST: действует как AND-устанавливает флаги, но не изменяет биты.

Для следующих несвязанных примеров, предположим, что AL содержит 1100 0101, а BH содержит 0101 1100:

1. AND AL,BH ;Устанавливает в AL 0100 0100

2. OR BH,AL ;Устанавливает в BH 1101 1101

3. XOR AL,AL ;Устанавливает в AL 0000 0000

4. AND AL,00 ;Устанавливает в AL 0000 0000

5. AND AL,0FH ;Устанавливает в AL 0000 0101

6. OR CL,CL ;Устанавливает флаги SF и ZF

Команда TEST действует аналогично команде AND, но устанавливает только флаги, а операнд не изменяется. Ниже приведено несколько примеров:

1. TEST BL,11110000B ;Любой из левых бит в BL

JNZ ... ; равен единице?

2. TEST AL,00000001B ;Регистр AL содержит

JNZ ... ; нечетное значение?

3. TEST DX,OFFH ;Регистр DX содержит

JZ ... ; нулевое значение?

 

Еще одна логическая команда NOT устанавливает обpатное значение бит в байте или в слове, в регистре или в памяти: нули становятся единицами, а единицы - нулями. Если, например, pегистр AL содержит 1100 0101, то команда NOT AL изменяет это значение на 0011 1010.





sdamzavas.net - 2019 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...