• Offshore outsourcing Russia : software outsourcing, IT outsourcing: anvision.com
  • Free web templates: anvisionwebtemplates.com
  • Web design company: anvisionwebdesign.com
  • Web hosting company: anvisionwebhosting.com
  • Online dating service: just-dating.net
  • Real estate listings: realestatehawk.net
  • PHP software scripts: softwareguys.net
  • Online job search: jobsearch4.com
  • Web designers directory: web-page-design.info
  • Advertising firms directory: advertisingfinders.net
  • Attorneys directory: attorneysfinders.net
  • Auto dealers directory: autodealerfinders.net
  • Dentists directory: dentistfinders.net
  • Home inspectors directory: inspectionfinders.net
  • Photographers directory: photographerfinders.net
  • Realtors directory: realtorfinders.net
  • Seo firms directory: seofinders.net
  • Web design directory: webdesignfinders.net
  • Web hosters director: webhostingfinders.net
Assebler&
                        win32
Что такое процессор
Память системы
Основы Ассеблера
Первая программа
Данные в Ассемблере
Символьные метки
Переходы (прыжки)
Команды Ассемблера
Программы и структуры
Упрощаем программирование
Еще о командах Ассемблера
Обработка блоков данных
Компилятор MASM
Оконное приложение
Некоторые функции Win32
Все о аквариумах и их обитателях

Программы и стуктуры

     На этом уроке я вам расскажу про подпрограммы и структуры. Подпрограмма по-простому это процедура (или функция: без разницы, язык Pascal дал этим терминам разные определения), а структура это запись.

Подпрограммы.
     Подпрограммы удобны, когда некоторое действие повторяется несколько раз в программе. Процедуры делают программу более читабельной и надёжнее, в такой программе легче устранять ошибки и улучшать.
     Процедуры задаются директивами proc и endp. Proc обозначает начало процедуры, а endp конец процедуры. Вот пример объявления процедуры:

SameProc proc
……more code……
     Ret ; обязательно
SameProc endp
Вызов процедуры

Call SameProc


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

SameProc proc
Push ebx
Push edi
….more code ….
Mov esi, edx
…изменяем сохранённые регисты….
Pop edi
Pop ebx
Ret
SameProc endp

     Специально для этого создана директива uses.

SameProc proc uses ebx,esi
……more code……
     Mov esi, edx
…изменяем сохранённые регисты….
     Ret ; обязательно
SameProc endp

     И всё теперь вместо всяких "пушев" и "попов" ставите ret, TASM сделает всё за вас: в начале поставит "пуши" вместо ret поставит "попы" (извините за выражение) и ret.

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

Структуры.

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

SOMESTRUCTURE STRUCT
dword1 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.dword1 считается обычной меткой данных: берётся смещение метки 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.

     Вот и конец девятого урока.

© 2008
 
Создание сайтов ЕкатеринбургШаблоны сайтовПоиск товаров - справочник цен, каталог магазинов, прайс-листыБесплатные шаблоны дизайна компьютерных сайтов
Hosted by uCoz