Ассемблер. Процедуры

  Светлана Деменева  | 

  Обновл. 27 Дек 2019  | 

 1248

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

Процедуры в Ассемблере

Ниже приведен синтаксис определения процедуры:

имя_процедуры:
    тело_процедуры
    ...
    ret

Процедура вызывается из другой функции с помощью инструкции CALL, которая имеет имя вызываемой процедуры в качестве аргумента: 

CALL имя_процедуры

Вызываемая процедура возвращает управление вызывающей процедуре с помощью инструкции RET.

Например, давайте напишем очень простую процедуру с именем sum, которая будет добавлять переменные, хранящиеся в регистрах ECX и EDX, и возвращать сумму в регистр EAX:

Результат выполнения программы выше:

The sum is:
9

Стек как структура данных


Стек — это структура данных в памяти в виде массива, в котором эти данные могут храниться и удаляться из места, называемого «вершиной» стека. Данные, которые должны быть сохранены, «помещаются» в стек, а данные, которые должны быть извлечены — «выталкиваются» из стека. Стек — это структура данных типа LIFO (англ. «Last In, First Out» = «Последним пришёл, первым ушёл»), детальнее об этом читайте здесь.

Язык ассемблера предоставляет две инструкции для операций со стеком: PUSH и POP. Эти инструкции имеют следующий синтаксис:

PUSH    операнд
POP     адрес/регистр

Пространство памяти, зарезервированное в сегменте стека, используется для реализации стека, а именно регистры SS и ESP (или SP). На вершину стека, которая указывает на последний вставленный элемент, указывает регистр SS:ESP, где регистр SS указывает на начало сегмента стека, а SP (или ESP) предоставляет смещение в сегмент стека.

Сохранять значения регистров в стеке перед их использованием можно следующим образом:

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

Результат выполнения программы выше:

0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *