Скачиваний:
78
Добавлен:
15.06.2014
Размер:
252.44 Кб
Скачать

Язык ассемблера для процессоров

INTEL, 5-е издание

Кип Р. Ирвин

Глава 8: Передача параметров

Слайды подготовил: Кип Р. Ирвин

Редакция: С.Б. Мусин

(c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.

Обзор

Стековые фреймы

Рекурсия

Директива .MODEL

Директивы INVOKE, ADDR, PROC, and PROTO

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 2

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

Стековые фреймы

 

 

Стековый фрейм процедуры

 

 

 

 

 

 

• Stack frame стековый фрейм (кадр)

 

• Передача параметров в стеке

 

 

запись активации (activation record)

 

 

 

• Область в стеке зарезервированная при вызове

 

Локальные переменные

 

 

 

 

 

процедуры для хранения адреса возврата,

 

• Команды ENTER и LEAVE

 

 

передаваемых параметров, регистров и

 

Директива LOCAL

 

 

 

локальных переменных

 

 

Процедура WriteStackFrame

 

 

• Создание стекового фрейма:

 

 

 

 

 

 

 

• Вызывающая процедура помещает аргументы в

 

 

 

 

 

 

стек и запускает вызываемую процедуру.

 

 

 

 

 

 

• Вызванная процедура помещает EBP в стек, и

 

 

 

 

 

 

устанавливает в EBP значение из ESP.

 

 

 

 

 

 

• Если необходимы локальные переменные, из ESP

 

 

 

 

 

 

вычитается константа, в результате резервируется

 

 

 

 

 

 

необходимое для их хранения место в стеке.

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

3

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

4

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

 

 

 

 

 

 

Передача параметров в стеке

Более удобна, чем передача в регистрах

Сравните:

pushad

push TYPE array

mov esi,OFFSET array

push LENGTHOF array

mov ecx,LENGTHOF array

push OFFSET array

mov ebx,TYPE array

call DumpMem

call DumpMem

 

popad

 

Передача параметров по значению

Поместить передаваемые значения в стек

(В защищенном режиме для того чтобы сохранить выравнивание стека следует помещать только двойные слова)

Запустить вызываемую процедуру

Для функций, возвращаемое значение в EAX

Убрать параметры из стека, если их не убрала вызываемая процедура

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

5

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

6

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

1

 

 

Пример

 

 

 

 

 

Передача параметров по ссылке

 

 

 

 

 

 

 

 

• Поместить в стек смещения параметров

 

 

 

 

 

 

 

 

 

процедуры

 

 

.data

DWORD 5

(val2)

6

 

 

 

Вызвать процедуру

 

 

val1

 

 

 

 

 

 

 

val2

DWORD 6

(val1)

5

ESP

 

 

Для функций, возвращаемое значение находится

 

.code

 

 

 

 

 

 

 

в EAX

 

 

push val2

 

 

 

 

 

• Убрать параметры из стека, если их не убрала

 

push val1

Содержимое стека до

 

 

 

 

 

 

 

 

вызываемая процедура

 

 

 

 

выполнения CALL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

7

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

8

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример

.data

DWORD

5

(offset val2)

00000004

val1

(offset val1)

00000000

val2

DWORD

6

ESP

 

 

 

 

 

.code

 

 

 

 

push OFFSET val2

 

 

push OFFSET val1

Содержимое стека до

 

 

 

выполнения CALL

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 9

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Передача массива по ссылке (1 - 2)

Процедура ArrayFill заполняет массив 16-битными случайными числами

Вызывающая программа передает адрес массива, а также количество элементов в массиве:

.data count = 100

array WORD count DUP(?)

.code

push OFFSET array push COUNT

call ArrayFill

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 11

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Содержимое стека после выполнения CALL

ESP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 10

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Передача массива по ссылке (2 - 2)

При доступе к элементам массива уже не используется имя массива:

ArrayFill PROC push ebp mov ebp,esp pushad

mov esi,[ebp+12] mov ecx,[ebp+8]

.

.

ESI указывает на начало массива, доступ к элементам массива осуществляется в цикле. ArryFill.asm .

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 12

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

2

Доступ к параметрам в стеке (C/C++)

• Функции C и C++ осуществляют доступ к параметрам в стеке путем задания константных смещений от EBP1.

• Пример: [ebp + 8]

• EBP называется указателем базы (base pointer, frame pointer) так как содержит базовый адрес стекового фрейма.

• EBP не изменяется пока выполняется функция.

• Значение EBP должно быть восстановлено при возврате из функции.

1 BP в реальном режиме адресации

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 13

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Кому убирать в стеке?

Вызывающая

Вызываемая

 

функция (C)

...... или ......

(STDCALL):

 

 

AddTwo PROC

 

push val2

 

push ebp

 

push val1

 

mov

ebp,esp

 

call AddTwo

 

mov

eax,[ebp+12]

 

add esp,8

 

add

eax,[ebp+8]

 

 

 

pop

ebp

 

 

 

ret

8

 

Директива MODEL указывает соглашение о вызовах

 

(рассматривается далее)

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site

Examples

15

Мусин С.Б., каф. ПОИТ, БГУИР, 2007

http://ppl.yohng.com.

 

 

 

Команда RET

Возврат из подпрограммы

Извлекает значение из стека и помещает его в (EIP или IP). Управление передается на целевой адрес.

Синтаксис:

RET

RET n

Необязательный операнд n позволяет прибавить n байт к указателю стека, после того как EIP (или IP) было присвоено значение.

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 14

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Задача. . .

Создайте процедуру Difference которая вычитает первый аргумент из второго. Пример вызова:

push 14

; first argument

push 30

; second argument

call Difference

; EAX = 16

Difference PROC

 

push ebp

 

mov

ebp,esp

; second argument

mov

eax,[ebp + 8]

sub

eax,[ebp + 12]

; first argument

pop

ebp

 

ret

8

 

Difference ENDP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 16

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Передача байтов и слов

В стек нельзя помещать байт

Если в стек поместить слово, то может произойти ошибка «отсутствие страницы» (page fault), либо проблема выравнивания ESP

Несовместимость с функциями WinAPI

Используйте MOVZX или MOVSX для расширения

до двойного слова:

.data

charVal BYTE 'x'

.code

movzx eax,charVal push eax

call Uppercase

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 17

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Передача нескольких слов

Сначала в стек следует помещать старшее значение

Получаем прямой порядок байтов (little-endian)

Пример:

.data

 

 

longVal DQ 1234567800ABCDEFh

 

.code

DWORD PTR longVal + 4

; high doubleword

push

push

DWORD PTR longVal

; low doubleword

call

WriteHex64

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 18

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

3

Сохранение и восстановление значений регистров в стеке

Помещайте регистры в стек сразу за установкой

ESP в EBP

локальные регистры (local registers) изменяеются внутри процедуры

MySub PROC

 

 

 

push

ebp

 

 

 

mov

ebp,esp

; save local registers

 

push

ecx

 

push

edx

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

19

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Влияние на стек оператора USES

MySub1 PROC USES ecx edx ret

MySub1 ENDP

Оператор USES генерирует код для сохранения и восстановления регистров:

MySub1 PROC push ecx push edx

pop edx pop ecx

ret

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 20

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Локальные переменные

Область видимости находится внутри процедуры

Пример:

int x=10, y=20;

 

 

 

EBP

MySub PROC

 

 

[ebp-4]

ebp

 

[ebp-8]

push

 

 

mov

ebp,esp

;create 2 DWORD variables

sub

esp,8

mov

DWORD PTR [ebp-4],10 ; initialize x=10

mov

DWORD PTR [ebp-8],20 ; initialize y=20

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

21

Мусин С.Б., каф. ПОИТ, БГУИР, 2007

http://ppl.yohng.com.

 

 

Команда LEA

LEA возвращает смещения прямых и косвенных операндов

Оператор OFFSET возвращает только константные смещения, стековый фрейм не обязательно начинается в одном и том же месте памяти

LEA необходима для получения смещения параметров в стеке и локальных переменных

Пример

CopyString PROC, count:DWORD

LOCAL temp[20]:BYTE

mov edi,OFFSET count

; invalid operand

 

mov esi,OFFSET temp

; invalid operand

 

lea edi,count

; ok

 

lea esi,temp

; ok

22

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Пример

 

 

 

Локальная переменная [ebp-8]

 

 

 

Для получения в ESI ее адреса

 

 

Нельзя:

 

; error

 

mov esi, OFFSET [ebp-8]

 

 

Следует использовать LEA:

 

 

 

lea esi,[ebp-8]

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site

Examples

23

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Команда ENTER

ENTER размер_области, уровень_вложенности

ENTER создает

помещает EBP в стек

устанавливает в EBP адрес базы стекового фрейма

резервирует пространство для локальных переменных

Пример:

MySub PROC enter 8,0

• Эквивалент:

MySub PROC push ebp mov ebp,esp sub esp,8

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 24

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

4

Команда LEAVE

Уничтожить стековый фрейм.

 

 

Эквивалентные операции

MySub PROC

push

ebp

 

 

enter 8,0

mov

ebp,esp

 

 

...

sub

esp,8

; 2 local DWORDs

...

 

 

 

 

...

mov

esp,ebp

; free local space

leave

ret

pop

ebp

 

 

MySub ENDP

 

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site

Examples

25

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Директива LOCAL

Директива LOCAL объявляет список локальных переменных

следует непосредственно за директивой PROC

указывается тип каждой переменной

Синтаксис:

LOCAL varlist

Пример:

MySub PROC

LOCAL var1:BYTE, var2:WORD, var3:SDWORD

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 26

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Использование LOCAL

Примеры:

LOCAL flagVals[20]:BYTE

; array

of bytes

 

LOCAL pArray:PTR WORD

; pointer to an array

 

myProc PROC,

; procedure

 

LOCAL t1:BYTE,

; local

variables

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

27

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Пример (1 - 2)

BubbleSort PROC

LOCAL temp:DWORD, SwapFlag:BYTE

. . .

ret BubbleSort ENDP

MASM генерирует следующий код:

BubbleSort PROC

 

push ebp

 

mov

ebp,esp

; add -8 to ESP

add

esp,0FFFFFFF8h

. . .

esp,ebp

 

mov

 

pop

ebp

 

ret

 

 

BubbleSort ENDP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 28

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

Пример (2 - 2)

 

 

Размер локальных переменных

 

Стековый фрейм процедуры BubbleSort:

 

 

• Директива LOCAL резервирует в стеке:

 

 

 

 

 

 

 

 

 

 

• BYTE: следующий доступный байт

 

 

 

 

 

 

 

 

 

 

• WORD: следующее слово , выровненное по четной

 

 

 

 

 

 

 

 

 

границе

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• DWORD: следующее двойное слово

 

 

 

 

 

 

 

 

 

 

• Пример:

 

 

 

 

 

 

 

 

 

 

 

Example1 PROC

 

 

 

 

 

 

 

 

 

 

 

LOCAL var1:BYTE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov al,var1

 

 

 

 

 

 

 

 

 

 

 

ret

 

 

 

 

 

 

 

 

 

 

 

Example1 ENDP

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

29

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

30

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

Процедура WriteStackFrame

Отображает содержимое текущего стекового фрейма

Прототип:

WriteStackFrame PROTO,

; number of passed parameters

numParam:DWORD,

numLocalVal: DWORD,

;

number

of

DWordLocal variables

numSavedReg: DWORD

;

number

of

saved registers

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 31

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Пример использования

WriteStackFrame

main PROC

mov eax, 0EAEAEAEAh mov ebx, 0EBEBEBEBh

INVOKE aProc, 1111h, 2222h exit

main ENDP

aProc PROC USES eax ebx, x: DWORD, y: DWORD LOCAL a:DWORD, b:DWORD PARAMS = 2

LOCALS = 2 SAVED_REGS = 2 mov a,0AAAAh mov b,0BBBBh

INVOKE WriteStackFrame, PARAMS, LOCALS, SAVED_REGS

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 32

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Рекурсия

Процедура CalcSum рекурсивно вычисляет сумму массива целых чисел. Принимает: ECX = count. Возвращает: EAX = sum

CalcSum PROC

; check counter value

cmp ecx,0

jz L2

; quit if zero

add eax,ecx

; otherwise, add to sum

dec ecx

; decrement counter

call CalcSum

; recursive call

L2: ret

 

CalcSum ENDP

 

Стековый

см cSum.asm

 

 

 

фрейм:

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

33

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Расчет факториала (2 - 3)

Factorial PROC

 

push ebp

 

mov

ebp,esp

; get n

mov

eax,[ebp+8]

cmp

eax,0

; n < 0?

ja

L1

; yes: continue

mov

eax,1

; no: return 1

jmp

L2

 

L1: dec

eax

; Factorial(n-1)

push

eax

call

Factorial

 

;Instructions from this point on execute when each

;recursive call returns.

ReturnFact:

; get

n

 

mov

ebx,[ebp+8]

eax * ebx

mul

ebx

; eax

=

L2: pop

ebp

; return EAX

ret

4

; clean

up stack

Factorial ENDP

См. Fact.asm

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 35

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Расчет факториала (1 - 3)

Функция вычисляет факториал числа n. Новое значение n сохраняется в стековом фрейме:

int function factorial(int n)

{

if(n == 0) return 1;

else

return n * factorial(n-1);

}

На каждой итерации возвращаемое значение произведения умножается на значение n полученное на предыдущем шаге.

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 34

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Расчет факториала (3 - 3)

Расчет 12!

На рисунке изображены четыре первых стековых фрейма созданных рекурсивными вызовами функции

Каждый рекурсивный вызов занимает 12 байт в стеке.

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 36

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

6

Директива .MODEL

Позволяет задать модель памяти, описатель языка (language specifier).

Синтаксис:

.MODEL memorymodel [,modeloptions]

memorymodel:

tiny, small, medium, compact, large, huge, flat

modeloptions:

способ именования процедур

 

описатель

• соглашения о передаче параметров

языка

 

 

 

модификатор стека

 

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site

Examples

37

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Модели памяти

Модель памяти программы определяет количество и размер сегментов данных и кода.

В реальном режиме адресации поддерживаются tiny, small, medium, compact, large, huge.

Защищенный режим поддерживает модель flat.

Small : code < 64 KB, data (+ stack) < 64 Кб, Offset = 16 бит.

Flat : code + data < 4 GB. Offset 32 бита.

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 38

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Описатель языка

C:

все PUBLIC имена начинаются с символа ‘_’

параметры помещаются в стек в обратном порядке (справа налево)

вызывающая процедура очищает стек

STDCALL

Формат имени: _name@nn

параметры помещаются в стек в обратном порядке (справа налево)

вызываемая очищает стек

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 39

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

INVOKE, ADDR, PROC, and PROTO (8.5)

Директива INVOKE

оператор ADDR

Директива PROC

Директива PROTO

Parameter Classifications

Пример: Обмен значений

Debugging Tips

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 40

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Директива INVOKE

Директива INVOKE заменяет команду ЦП CALL и позволяет передавать параметры через стек

Синтаксис:

INVOKE procedureName [, argumentList]

ArgumentList список параметров

В качестве параметров можно использовать:

непосредственные значения и выражения

переменные

адреса и указатели

регистры

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 41

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Пример

.data

byteVal BYTE 10 wordVal WORD 1000h

.code

; direct operands:

INVOKE Sub1,byteVal,wordVal

;address of variable: INVOKE Sub2,ADDR byteVal

;register name, integer expression: INVOKE Sub3,eax,(10 * 20)

;address expression (indirect operand): INVOKE Sub4,[ebx]

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 42

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

7

Оператор ADDR

Возвращает ближний или дальний указатель на переменную,

взависимости от используемой модели памяти:

Small: смещение16-бит

Large: сегмент/смещение 32-бита

Flat : смещение 32-бита

Пример:

.data

myWord WORD ?

.code

INVOKE mySub,ADDR myWord

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 43

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Директива PROC (1 - 2)

Директива PROC позволяет объявить процедуру.

Синтаксис:

label PROC [paramList]

paramList список параметров разделенных запятой. Синтаксис параметра:

paramName : type

type стандартный тип ЯА (BYTE, SBYTE, WORD, etc.) или указатель на значение стандартного типа.

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 44

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Директива PROC (2 - 2)

Альтернативный формат позволяет начать запись параметров со следующей строки:

label PROC, нужна запятая paramList

• Однострочное объявление списка параметров: param-1:type-1, param-2:type-2, . . ., param-n:type-n

• Многострочное объявление: param-1:type-1,

param-2:type-2,

. . ., param-n:type-n

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 45

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Примеры (1 - 2)

Процедура AddTwo принимает два числа и возвращает сумму в EAX.

AddTwo PROC,

val1:DWORD, val2:DWORD

mov eax,val1 add eax,val2

ret AddTwo ENDP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 46

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Примеры (2 - 3)

FillArray принимает указатель на массив байтов, значение, которым будет заполнен массив и длину массива.

FillArray PROC,

pArray:PTR BYTE, fillVal:BYTE arraySize:DWORD

mov ecx,arraySize mov esi,pArray mov al,fillVal

L1: mov [esi],al inc esi loop L1

ret FillArray ENDP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 47

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Примеры (3 - 3)

Swap PROC, pValX:PTR DWORD, pValY:PTR DWORD

. . .

Swap ENDP

ReadFile PROC, pBuffer:PTR BYTE

LOCAL fileHandle:DWORD

. . .

ReadFile ENDP

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 48

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

8

Директива PROTO

Прототип процедуры

Синтаксис:

label PROTO paramList

Каждая процедура для вызова которой

используется INVOKE должна иметь прототип

Полное объявление тоже прототип

Пример

ArraySum PROTO,

; points to the array

 

ptrArray:PTR DWORD,

 

szArray:DWORD

; array size

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

49

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

Директива PROTO

Стандартная конфигурация: PROTO в начале листинга программы, INVOKE в сегменте кода далее объявление процедуры:

MySub PROTO

; procedure prototype

 

.code

; procedure call

 

INVOKE MySub

 

MySub PROC

; procedure implementation

 

.

 

 

 

.

 

 

 

MySub ENDP

 

 

 

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007.

Web site Examples

50

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

The End

void weird()

{

int a;

*(&a + 2) += 7;

}

int x = 0; weird(); x = 1;

printf("%d\n",x);

Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 51

Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.

9