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; просмотров: 211; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!