Автор: xrnd | Рубрика: Учебный курс | 06-12-2010
Наверно, вы заметили, что довольно неудобно обращаться к параметрам и локальным переменным, указывая смещения относительно регистра BP. Такой способ подходит только для совсем простых и маленьких процедур. Поэтому в таких ассемблерах, как TASM и MASM, существуют специальные директивы, позволяющие создавать процедуры быстро и удобно. В FASM таких директив нет! Но они и не нужны — то же самое можно сделать с помощью макросов.
Для начала, нам потребуется заголовочный файл с макросами. Стандартный пакет FASM для Windows, к сожалению, не включает в себя макросы для 16-битных процедур. Однако такие макросы можно найти на официальном форуме FASM или скачать здесь: PROC16.INC. Это переделанная версия файла PROC32.INC с точно таким же синтаксисом.
Заголовочный файл необходимо будет включить в программу с помощью директивы include:
Базовый синтаксис объявления процедуры
Для создания процедуры используется следующий синтаксис:
proc <имя_процедуры>[,][<список_параметров>]
...
ret
endp |
proc <имя_процедуры>[,][<список_параметров>]
...
ret
endp
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 03-11-2010
Не сомневаюсь, что объявлять метки вы уже научились 🙂 Однако, синтаксис FASM не ограничивается объявлением простых меток. В этой части мы рассмотрим дополнительную директиву для создания меток, а также научимся использовать локальные и анонимные метки.
В синтаксисе FASM существует 3 основных способа объявления меток:
1. Имя метки, после которого ставится двоеточие. Это самый простой способ. Обычно так объявляются метки в коде. (Подробнее об этом способе читайте в части 13 учебного курса)
exit_app:
mov ax,4C00h
int 21h |
exit_app:
mov ax,4C00h
int 21h
2. Использование директив объявления данных. Имя переменной является по сути той же меткой. Отличие от первого способа в том, что дополнительно с именем метки связывается размер переменной. (Подробнее читайте в части 5 учебного курса)
x db 5
y dw 34,1200,?
z rd 1 |
x db 5
y dw 34,1200,?
z rd 1
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 17-10-2010
До этой части учебного курса все переменные в наших программах были только глобальными — они создавались и инициализировались при запуске программы и к ним можно было обратиться из любой её части.
Локальные переменные используются для хранения промежуточных результатов во время выполнения процедуры. В отличие от глобальных, эти переменные являются временными и создаются при запуске процедуры. Для локальных переменных существует понятие области видимости — так называется область программы, в которой доступна переменная. Обычно в ассемблере область видимости ограничена процедурой, создавшей локальную переменную. Хотя возможны и более сложные варианты 😉
Создание локальных переменных
Чтобы создать локальные переменные в процедуре, необходимо выделить для них память. Эта память выделяется в стеке. Сделать это очень просто — достаточно вычесть из регистра SP значение, равное суммарному размеру всех локальных переменных в процедуре. Так как ширина стека равна 16 бит, то это значение должно быть кратно 2 байтам. При выходе из процедуры нужно восстановить указатель стека. Обычно это выполняется командой mov sp,bp (В bp сохраняется значение sp при входе в процедуру, как в случае с параметрами, передаваемыми через стек). Код процедуры с локальными переменными будет выглядеть следующим образом:
;Процедура с локальными переменными
myproc:
push bp ;Сохранение BP
mov bp,sp ;Копирование указателя стека в BP
sub sp,locals_size ;Выделение памяти для локальных переменных
...
mov sp,bp ;Восстановление указателя стека
pop bp ;Восстановление BP
ret ;Возврат из процедуры |
;Процедура с локальными переменными
myproc:
push bp ;Сохранение BP
mov bp,sp ;Копирование указателя стека в BP
sub sp,locals_size ;Выделение памяти для локальных переменных
...
mov sp,bp ;Восстановление указателя стека
pop bp ;Восстановление BP
ret ;Возврат из процедуры
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 14-03-2010
Практически любая программа кроме машинных команд содержит также какие-то данные. Например, числа, текстовые строчки, идентификаторы, различные ресурсы и т.д. Данные могут быть как константами, не меняющими своё значение во время выполнения программы, так и переменными, в которых хранятся всякие промежуточные результаты.
Прежде всего нужно научиться объявлять данные в программе. Для этого в ассемблере существуют директивы объявления данных.
Размер
(в байтах) |
Объявление |
Резервирование |
1 |
db |
rb |
2 |
dw
du |
rw |
4 |
dd |
rd |
6 |
dp
df |
rp
rf |
8 |
dq |
rq |
10 |
dt |
rt |
N |
file |
|
Читать полностью »