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

Поделиться с друзьями:






Мы поможем в написании ваших работ!