Add EAX, B ; регистр и переменную складывать можно
И, если нам нужно скопировать сумму (она сейчас в ЕАХ) в переменную R, то нужна еще одна команда:
Mov R, EAX
Создать процедуру с двумя параметрами и возвращаемым значением.
Пусть наша процедура будет иметь имя Sum2, а ее параметрами будут двойные слова A и B, а возвращаемым значением – двойное слово R. Тогда текст процедуры такой:
Sum2 PROC A:dword, B:dword, R:dword
; команды процедуры
Mov EAX, A
Add EAX, B
Mov R, EAX
Ret
Sum2 ENDP
Написать ее прототип и вызов с помощью invoke.
Sum2 PRO TO :dword, :dword, :dword
Прототип нужен макросу invoke для 1) контроля правильности передачи параметров по количеству и типам; 2) для создания группы машинных команд push и call, которые, фактически, и реализуют вызов.
Предположим, мы хотим сложить числа 22 и 2014. Вызов нашей процедуры для этого случая:
Invoke Sum2, 22 , 2014, 0
Макрогенератор превратит эту строку в четыре машинных команды
Push 0
Push 2014
Push 22
Call Sum2
Которые будут откомпилированы в машинный код и, фактическиб реализуют вызов процедуры с параметрами.
Нарисовать стековый кадр этой процедуры.
Исходный ESP
| R | -4 байта |
| B | -4 байта |
| A | -4 байта |
| Ip возврата | -4 байта |
| Старое EBP | -4 байта |
Забрать возвращенную процедурой сумму в регистр eax…
После выполнения процедуры возвращенное значение находится в ячейке стека R, а указатель стека ESP наодится в «исходном» положении. Значит, копирование в EAX выглядит так:
mov eax, dword ptr [esp – 4]
Словами это можно сказать так: скопировать в ЕАХ двойное слово, находящееся по адресу, на 4 меньшему, чем тот, что сейчас сидит в ESP.
…и макросом print показать результат.
print str$(eax) ,13,10
Здесь str$() – это макрос преобразования числа в строку; 13 и 10 – перевод строки при выводе на консоль.
Программа должна иметь программную задержку для просмотра результата
Inkey “Нажмите любую клавишу.”
Собрать это всё в единую программу.
Берем шаблон учебной программы и вставляем в него подготовленные выше кусочки (показаны красным).
include \masm32\include\masm32rt.inc
comment * ===========================
Шаблон минимальной учебной программы
* ===================================
Sum2 PRO TO :dword, :dword, :dword
Data
;Точка Д. Описание числовых и строковых переменных
Code
Start:
; ТОЧКА А. Команды ассемблера и вызовы макросов
Invoke Sum2, 22 , 2014, 0
print str$(eax) ,13,10
Inkey “Нажмите любую клавишу.”
Invoke ExitProcess ,0 ; выход в Windows
Sum2 PROC A:dword, B:dword, R:dword
; команды процедуры
Mov EAX, A
Add EAX, B
Mov R, EAX
Ret
Sum2 ENDP
End start
Сохранить исходный текст в файл min7.asm. Откомпилировать buildc min7. Выполнить min7.exe, показать преподавателю.
Вопросы для самопроверки
а) Как выполняется команда сложения ADD? Какие ограничения существуют на ее операнды?
б) Как технически сложить две переменных, которые обе находятся в памяти?
в) Что такое прототип процедуры? По каким правилам он пишется?
г) Кому нужен прототип и как он используется?
д) Во что макрогенератор превратит строчку вызова процедуры макросом invoke?
е) В каких местах исходного текста программы следует размещать описания процедур?
РЕКОМЕНДОВАННАЯ ЛИТЕРАТУРА
1. Рихтер Дж. WINDOWS для профессионалов: Создание эффективных Win-32 приложений с учетом специфики 64-разрядной версии Windows / Пер. с англ. — 4-е изд. — СПб.: Питер; М.:Издательство «Русская редакция»; 2008 — 720 с., ил.
2. Фролов А., Фролов Г.: Защищенный режим процессоров Intel 286 / 80386 / 80486 .— М.: Диалог-МИФИ, 1993.— 234 с.
3. Финогенов К. Г. Win32. Основы программирования .— М.: Диалог-МИФИ, 1999.— 342 с.
Дата добавления: 2018-10-26; просмотров: 220; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!
