Содержание
- 2. 3.1 Организация передачи управления в процедуру и обратно Процедура в ассемблере – это относительно самостоятельный фрагмент,
- 3. Команды вызова процедуры и возврата управления 1. Команда вызова процедуры: CALL rel32/r32/m32 ; вызов внутрисегментной ;
- 4. Организация передачи управления в процедуру CALL . . . PROC RET ENDP Основная программа Процедура Адрес
- 5. Описание процедуры В отличие от языков высокого уровня, ассемблер не требует специального оформления процедур. На любой
- 6. Пример 3.1 Процедура MaxDword () .CONST MsgExit DB "Press Enter to Exit",0AH,0DH,0 .DATA A DWORD 56
- 7. Текст процедуры MaxDword PROC push EAX ; сохранить регистр push EBX ; сохранить регистр lea EBX,D;
- 8. 3.2 Передача параметров в подпрограмму Параметры могут быть переданы в подпрограмму: через регистры – перед вызовом
- 9. 3.2.1 Передача параметров в регистрах Пример 3.2 a. Определение суммы двух целых чисел .DATA A DWORD
- 10. Процедура, получающая параметры в регистрах SumDword PROC add EAX,EBX mov [EDX],EAX ret SumDword ENDP ; завершение
- 11. 3.2.2 Процедуры с глобальными переменными (совместная трансляция) При совместной трансляции, когда основная программа и процедура объединены
- 12. Процедура, работающая с глобальными переменными при совместной трансляции Пример 3.2 b. Определение суммы двух чисел. .DATA
- 13. 3.2.3 Многомодульные программы Объединение модулей осуществляется во время компоновки программ. Программа и процедуры, размещенные в разных
- 14. Директивы описания глобальных переменных Директива описания внутренних имен, к которым возможно обращение извне: PUBLIC [ ]
- 15. Основная программа при раздельной трансляции Пример 3.2 c. Сложение двух чисел. .DATA A DWORD 56 B
- 16. Процедура при раздельной трансляции .586 .MODEL flat, stdcall OPTION CASEMAP:NONE EXTERN A:DWORD,B:DWORD,D:DWORD .CODE SumDword PROC c
- 17. 3.2.4 Передача параметров через таблицу адресов Пример 3.2 d. Сумма элементов массива .DATA ary SWORD 5,6,1,7,3,4
- 18. Процедура, получающая параметры через таблицу адресов .586 .MODEL flat, stdcall OPTION CASEMAP:NONE .CODE masculc proc c
- 19. Процедура, получающая параметры через таблицу адресов ; суммирование элементов массива xor AX,AX cycl: add AX,[ESI] add
- 20. 3.2.5 Передача параметров через стек CALL PROC RET ENDP Основная программа Процедура A B D @D
- 21. Пример 3.2 e. Максимальное из двух чисел. .DATA A DWORD 56 B DWORD 34 .DATA? D
- 22. EBP=ESP Процедура, получающая параметры через стек MaxDword PROC push EBP mov EBP,ESP push EAX push EBX
- 23. 3.3 Директивы описания процедур 1. Директива заголовка процедуры: PROC [ ] [ ] [ ] [USES
- 24. Директивы описания процедур (2) Список используемых регистров – содержит регистры, используемые в процедуре, для их автоматического
- 25. Директивы описания процедур (3) 2. Директива описания локальных переменных: LOCAL [[ ]][: ] [, [[ ]][:
- 26. Директивы описания процедур (3) 3. Директива объявления прототипа: PROTO [ ] [ ] [ ] [,
- 27. Директивы описания процедур (4) 4. Директива вызова процедуры: INVOKE [, ] Аргументы должны совпадать с параметрами
- 28. Операторы получения атрибутов полей данных ADDR – возвращает ближний или дальний адрес переменной в зависимости от
- 29. Пример 3.3 Использование PROC, PROTO и INVOKE MaxDword PROTO X:DWORD,Y:DWORD,ptrZ:PTR DWORD .DATA A DWORD 56 B
- 30. 3.4 Функции ввода-вывода консольного режима (MASM32.lib) Библиотека MASM32.lib содержит специальные функции ввода вывода консольного режима: 1.
- 31. Пример 3.4 Программа извлечения корня квадратного 1 = 12 1+3 = 4 = 22 1+3+5 =
- 32. Программа извлечения корня квадратного (2) .CODE Start: ;Ввод vvod: Invoke StdOut,ADDR zap ; вывод запроса Invoke
- 33. Программа извлечения корня квадратного (3) ; Преобразование mov BH,'9' mov BL,'0' lea ESI,string cld xor DI,DI
- 34. Программа извлечения корня квадратного (4) ;Вычисление sqrt(dx#ax) calc: mov BX,1 mov CX,0 mov AX,1 ; сумма
- 35. Программа извлечения корня квадратного (5) ; Преобразование preobr: mov AX,CX mov EDI,2 mov BX,10 again: cwd
- 36. Функции преобразования данных 1. Функция преобразования завершающейся нулем строки в число: atol proc lpSrc:DWORD ; результат
- 37. Пример 3.5 Преобразование ввода .CODE Start: ; Ввод vvod: Invoke StdOut,ADDR zap Invoke StdIn,ADDR string,LengthOf string
- 38. Пример 3.5 Преобразование вывода ; Преобразование preobr: mov word ptr root,CX Invoke dwtoa,root,ADDR rez ; Вывод
- 39. 3.5 Создание рекурсивных процедур Рекурсивные алгоритмы предполагают реализацию в виде процедуры, которая сама себя вызывает. При
- 40. Структура Структура представляет собой шаблон с описаниями форматов данных, который можно накладывать на различные участки памяти,
- 41. Структура (2) Кроме того, структуры используются, когда в программе многократно повторяются сложные коллекции данных с единым
- 42. Пример Ex03_06. Вычисление факториала ⎧ N*(N-1)! , при N≠0 – рекурсивное утверждение; N! = ⎨ ⎩
- 43. Факториал. Основная программа .DATA n DW 5 ; исходное число .DATA? result DW ? ; память
- 44. Факториал. Рекурсивная процедура fact PROC push EBP mov EBP,ESP push EBX push AX ; извлечение из
- 45. Факториал. Рекурсивная процедура (2) ; извлечение из стека адреса результата mov EBX,FRAME.result_addr[EBP] ; вычисление результата очередной
- 46. 3.6 Связь разноязыковых модулей Основные проблемы связи разноязыковых модулей: осуществление совместной компоновки модулей; организация передачи и
- 47. Конвенции о связях WINDOW’s Конвенции о связи определяют правила передачи параметров.
- 48. Конвенции о связях WINDOW’s (2) тип вызова: NEAR; модель памяти: FLAT; пролог и эпилог – стандартные,
- 49. Конвенции о связях WINDOW’s (3) особенности компиляции и компоновки: можно не сохранять регистры: EAX, EDX, ECX.
- 50. 3.6.1 Delphi PASCAL – MASM32 в модуле на Delphi Pascal процедуры и функции, реализованные на ассемблере,
- 51. Delphi PASCAL – MASM32 совместимость часто используемых данных: Word – 2 байта, Byte, Char, Boolean –
- 52. Пример 3.7 Delphi PASCAL – MASM32 Описание в Delphi: Implementation {$l .obj} // Имя файла совпадает
- 53. Пример 3.7 Конвенция PASCAL .586 .model flat .code public ADD1 ADD1 proc push EBP mov EBP,ESP
- 54. Пример 3.7 Конвенция cdecl .586 .model flat .code public ADD1 ADD1 proc push EBP mov EBP,ESP
- 55. Пример 3.7 Конвенция stdcall (safecall = stdcall + исключение при ошибке) .586 .model flat .code public
- 56. Пример 3.7 Конвенция register .586 .model flat .code public ADD1 ADD1 proc add EDX,EAX mov ECX],EDX
- 58. Окно CPU
- 59. Пример 3.7 Процедура без параметров Увеличение каждого элемента массива А на 5 procedure Array_add;pascal;external; .586 .MODEL
- 60. Пример 3.7 Pascal – Assembler - Pascal implementation {$L string.obj} function Dell1(S:ShortString): ShortString;pascal;external; procedure Print(n:byte);pascal; begin
- 61. Пример 3.7 Pascal – Assembler – Pascal (2) .586 .MODEL flat .CODE PUBLIC Dell1 EXTERNDEF Print:near
- 62. Пример 3.7 Pascal – Assembler – Pascal (3) mov DL,0 jcxz prod3 mov BX,1 cld cycl1:
- 63. Пример 3.7 Pascal – Assembler – Pascal (4) cmp DL,0 je prod3 cmp BX,1 jne prod3
- 64. Дисассемблер функции копирования строки Function Dell(S:ShortString):ShortString; pascal; Begin Result:=S; End; push EBP пролог mov EBP,ESP add
- 65. Дисассемблер функции копирования строки (2) mov EAX,[EBP+8] lea EDX,[EBP-$100] вызов процедуры копирования call @PStrCpy pop EDI
- 66. Локальные данные подпрограмм Паскаль не позволяет создавать в подпрограммах глобальные переменные, поэтому в подпрограммах работают с
- 67. Пример 3.13. Организация локальных переменных implementation {$L Copy} {$R *.dfm} function CopyS(St:ShortString):ShortString;pascal;external; procedure Print(n:integer);pascal; begin Form1.Edit3.Text:=inttostr(n);end;
- 68. Пример 3.13а. Без использования директив .586 .MODEL flat A STRUCT ; объявляем структуру S BYTE 256
- 69. Пример 3.13а. Без использования директив mov ECX,EAX ; загрузка счетчика cld rep movsb ; копирование строки
- 70. Пример 3.13б. С помощью директив .CODE public CopyS externdef Print:near CopyS PROC NEAR PASCAL PUBLIC USES
- 71. Пример 3.13б. С помощью директив ; Копируем строку в результат lea ESI,S mov EDI,Str2 lodsb stosb
- 72. 3.6.2 С++ Builder – MASM32 в модуле на C++ Builder процедуры и функции, реализованные на ассемблере,
- 73. Пример 3.8 С++ Builder – MASM32 в модуле на C++ процедуры и функции, реализованные на ассемблере,
- 74. Пример 3.8 Конвенция cdecl extern void __cdecl ADD1(int a,int b,int *c); .586 .model flat .code public
- 75. Пример 3.8 Конвенция cdecl + «С» extern ”C” void __cdecl ADD1(int a,int b,int *c); .586 .model
- 76. 3.6.3 Visual С++ – MASM32 в модуле на Visual C++ подключаемые процедуры и функции должны быть
- 77. Пример 3.9 Конвенция _ _cdecl extern ”C” void _cdecl add1(int a,int b,int *c); .586 .model flat
- 78. Пример 3.10 Объявление внешних переменных #include "stdafx.h" #include #include extern "C" void __cdecl ADD1(int a,int b);
- 79. Объявление внешних переменных в процедуре на ассемблере .586 .model flat .data public ?d@@3HA ?d@@3HA DD ?
- 80. Пример 3.11 Конвенция _ _stdcall extern ”C” void __stdcall ADD1(int a,int b,int *c); .386 .model flat
- 81. Пример 3.12 Конвенция _ _fastcall extern ”С” void __fastcall add1(int a,int b,int *c); .386 .model flat
- 83. Скачать презентацию