Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_Лекции_2011_01.docx
Скачиваний:
8
Добавлен:
31.07.2019
Размер:
521.09 Кб
Скачать

Структуры.

Структура это набор переменных (данных). Структура задаётся с помощью директивы struct и ends.

SOMESTRUCTURE STRUCT dwordl dd ? dword2 dd ?

some_word dw ? abyte db ? anotherbyte db ? SOMESTRUCTURE ENDS

(имя структуры не должно содержать прописных букв).

Вы также можете объявить ваши переменные как в секции с инициализированными данными, так и в секции с неинициализированными данными, со знаком вопроса.

MYSTRUCT struc dword1 dd ? dword2 dd ? some_word dw ? abyte db ? anotherbyte db ? MYSTRUCT ends .data

msg MYSTRUCT > или

MYSTRUCT struc dword1 dd ? dword2 dd ? some_word dw ? abyte db ? anotherbyte db ? MYSTRUCT ends .data?

msg MYSTRUCT >

одинаковый результат, но во втором случае размер файла будет меньше.

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

mov [msg.dword1], 45h xor eax,eax

mov eax, [msg.dword1] ; eax = 45

при этом запись msg.dwordl считается обычной меткой данных: берётся смещение метки msg плюс смещение поля dword1 в структуре, размер данных по умолчанию равен размеру директивы указанной после метки поля. Также можно пользоваться обращением к полю при обращении к записи через регистр:

mov [msg.dword2], 45h xor eax,eax lea ebx, msg

mov eax, [ebx].dword2 ; eax = 45

в данном случае к смещению, которое указано в ebx прибавляется смещение dword2 в своей структуре. Так как имя поля не гарантирует уникальности то лучше использовать такой тип использования записи так:

mov [msg.dword2], 45h xor eax,eax lea ebx, msg

mov eax, [ebx].MYSTRUCT.dword2 ; eax = 45

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

mov [msg.abyte], 45h

xor eax,eax

lea ebx, msg

mov al, [ebx+10d] ; al = 45

к ebx я прибавил 10d, потому что смещение поля abyte в структуре равно 10d. Альтернативы секции .const

Главной альтернативой секции .const является простое объявление символьной константы. Всё гениальное просто (слишком сильно сказано):

CONST_VALUE = 678h .data

Dd CONST_VALUE .code

more code.

Mov edi, CONST_VALUE Xor eax, CONST_VALUE

Вторая не менее важная альтернатива это определение "макросимвола" (я это сам придумал, а по научному абсолютный символ или "прозвище"). Он задаётся через директиву equ.

примеры

CONST1 equ 0123h CONST2 equ 14d*15h CONST3 equ "slovo" CONST4 equ 56-45 CONST5 equ (offset metka1) CONST6 equ (offset metka2+offset metka3) CONST7 equ (CONST2+10b) CONST8 equ CONST7/2 CONST9 equ (offset metka1-offse metka5) CONST10 equ (offset metka4+CONST4) CONST11 equ add edx,edi .... и так далее до посинения :

Директива equ используется в там же, где определяются символьные константы. Это ещё не все возможности этой директивы. О ней можно говорить очень много. Я вам объяснил, как надо объявлять численные константы, но также можно дать прозвище некоторой команде, например:

Command1 equ mov eax, esi.

После этого при каждом упоминании commandl будет подразумеваться команда move eax, esi. Пример

Mov eax, CONST1 Add edi, CONST2 Xor ebp, CONST7 CONST11 Sub edx, CONST8

Объявлять equ надо в начале файла там же где объявляются структуры и константы. Макросы.

Макрос - это набор команд. С помощью equ мы могли создавать "прозвище" только для одной команды, а с помощью макросов можно создавать "прозвище" для нескольких команд. Для создания макроса надо использовать директивы macro и соответственно endm.

Firstmacro macro Sub ebp, esp Mov eax, ebp Endm

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

Secondmacro macro param1, param2 Add edi, param1 Sub esi, param2 endm

.code ; использование

Secondmacro 55h,edx

У макросов очень много возможностей. Я объяснил самые важные из них, а на объяснение всех возможностей

этого урока не хватит. Макросы очень часто используются в MASM.