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

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

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

Кип Р. Ирвин

Глава 5: Процедуры

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

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

(c) Pearson Education, 2002. 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.

Обзор

Использование библиотек

Выполнение операций со стеком

Объявление и использование процедур

Процедурное программирование

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

Web site Examples

2

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

 

 

Использование библиотек

Библиотека объектных модулей

Вызов процедуры из библиотеки

Компоновка библиотеки

Примеры вызова функций

библиотеки

Библиотека объектных модулей

Файл содержащий процедуры в машинном коде

собирается из объектных модулей .OBJ

Для создания библиотеки, . . .

Подготовьте исходные файлы .ASM

Скомпилируйте из в объектные модули .OBJ

Создайте пустой файл .LIB

Используйте утилиту Microsoft LIB для добавления

.OBJ модулей в библиотеку

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.

 

 

 

 

Вызов процедуры из библиотеки

Для объявления процедур подключите файл с прототипами с помощью директивы INCLUDE. Вызов процедуры осуществляется с помощью команды CALL.

Пример:

INCLUDE Irvine32.inc

.code

; input argument

mov eax,1234h

call WriteHex

; show hex number

call Crlf

; end of line

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

Web site Examples

5

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

 

 

Компоновка библиотеки

Программа связывается с Irvine32.lib командой компоновщика или редактора связей (linker), см. вызов в make32.bat.

.LIB файлы: Irvine32.lib, and kernel32.lib

Последний часть Microsoft Win32 Software Development Kit (SDK)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Web site Examples

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

Пример 1

Очистка экрана, задержка на 500 мс, печать дампа регисров и флагов.

.code

call Clrscr mov eax,500 call Delay call DumpRegs

Вывод:

EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000 ESI=00000000 EDI=00000100 EBP=0000091E ESP=000000F6 EIP=00401026 EFL=00000286 CF=0 SF=1 ZF=0 OF=0

Пример 2

Вывод строки на экран.

.data

str1 BYTE "Assembly language is easy!",0

.code

mov edx,OFFSET str1 call WriteString

call Crlf

.data

str1 BYTE "Assembly language is easy!",0Dh,0Ah,0

.code

mov edx,OFFSET str1 call WriteString

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.

 

 

 

 

Пример 3

Вывод числа на экран в различных системах счисления.

IntVal = 35

 

.code

eax,IntVal

 

mov

; display binary

call

WriteBin

call

Crlf

; display decimal

call

WriteDec

call

Crlf

; display hexadecimal

call

WriteHex

call Crlf

Вывод:

0000 0000 0000

0000

0000

0000

0010

0011

 

35

 

 

 

 

 

 

23

 

 

 

 

 

 

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

 

Web site

Examples

9

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

 

 

 

 

 

 

 

Пример 4

Ввод строки (в EDX – указатель на строку,

в ECX – максимальное количество символов).

.data

fileName BYTE 80 DUP(0)

.code

mov edx,OFFSET fileName mov ecx,SIZEOF fileName – 1 call ReadString

Нулевой байт добавляется в конец строки автоматически.

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

Web site Examples

10

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

 

 

Пример 5

Вывод случайных значений от 0 до 99 на экран.

.code

 

; loop counter

mov ecx,10

L1: mov

eax,100

; ceiling value

call

RandomRange

; generate random int

call

WriteInt

; display signed int

call

Crlf

; goto next display line

loop

L1

; repeat loop

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

Web site Examples

11

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

 

 

Пример 6

Форматированный вывод на экран.

.data

str1 BYTE "Color output is easy!",0

.code

mov eax,yellow + (blue * 16) call SetTextColor

mov edx,OFFSET str1 call WriteString call Crlf

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

Web site Examples

12

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

 

 

2

 

Операции со стеком

 

 

 

 

Работа стека

 

 

 

 

 

 

• Участок памяти с организацией LIFO

 

Работа стека

 

 

 

 

Регистр SS (stack segment) содержит базовый адрес

 

• Команды PUSH и POP

 

 

 

 

стека

 

 

 

 

 

 

Регистр ESP (stack pointer) смещение вершины стека

• Использование PUSH и POP

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример: реверс строки

 

 

 

 

 

 

 

 

Расположение и параметры

 

 

 

 

 

 

 

 

Related Instructions

 

 

 

 

 

 

 

 

 

определяет ассемблер,

 

 

 

 

 

 

 

 

 

компоновщик и ОС

 

 

 

 

 

 

 

 

 

 

 

 

Регистры инициализирует

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОС при загрузке

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программы в память

 

 

 

 

 

 

 

 

 

 

 

 

Регистр ESP:

 

 

 

 

 

 

 

 

 

 

 

 

инициализирует ОС при

 

 

 

 

 

 

 

 

 

 

 

загрузке программы в

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

13

 

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

память

14

Web site Examples

 

Web site Examples

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команда PUSH (1-2)

• PUSH синтаксис:

Уменьшает значение ESP (2 или 4),

• PUSH r/m16

содержимое регистра или

• PUSH r/m32

переменной записывается по

• PUSH imm32

адресу [SS:ESP]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Web site Examples

15

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команда PUSH (2-2)

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

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

Web site Examples

16

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

 

 

 

 

 

Команда POP

• POP syntax:

 

 

 

• Извлекает число из стека в

 

• POP r/m16

 

 

 

регистр или переменную

 

 

 

 

• Прибавляет n к ESP (n = 2 или 4)

 

• POP r/m32

 

 

 

 

 

 

 

• значение n зависит от атрибута

 

 

 

 

 

 

операнда приемника

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Web site Examples

17

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

 

 

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

Применяются для временного сохранения информации. Порядок помещения и извлечения элементов в стек обратный.

push

esi

; push registers

push

ecx

 

push

ebx

 

mov

esi,OFFSET dwordVal

; display some memory

mov

ecx,LENGTHOF dwordVal

 

mov

ebx,TYPE dwordVal

 

call

DumpMem

 

pop

ebx

; restore registers

pop

ecx

 

pop

esi

 

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

Web site Examples

18

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

 

 

3

Вложенные циклы

Поместить в стек счетчик внешнего цикла перед входом во внутренний цикл:

mov ecx,100

; set outer loop count

L1:

; begin the outer loop

push ecx

; save outer loop count

,

 

pop ecx

; restore outer loop count

loop L1

; repeat the outer loop

Пример: реверс строки

Первый цикл помещает символы строки в стек

Второй цикл восстанавливает символы строки, но уже в обратном порядке.

см. RevString.asm

Вопрос: Почему символы строки копируются в EAX перед помещением в стек?

Потому что только слово(16-бит) или двойное слово (32-бита) можно помещать в стек.

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

Web site Examples

19

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

Web site Examples

20

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

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

 

 

 

 

Задача

Измените RevString.asm, так

#1: чтобы строка вводилась с клавиатуры пользователем

(длина строки не более 50 символов).

#2: чтобы осуществлялся реверс массива двойных слов

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

выводился на экран.

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

Web site Examples

21

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

 

 

Другие команды для работы со стеком

PUSHFD и POPFD

поместить/извлечь содержимое регистра EFLAGS

PUSHAD поместить в стек содержимое всех РОН

порядок: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

POPAD извлечь из стека РОН в обратном порядке

Аналоги PUSHA и POPA работают с 16-битными регистрами

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

Web site Examples

22

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

 

 

Задача

Напишите программу, которая:

Инициализирует EAX, EBX, ECX, EDX, ESI, и EDI

Помещает эти регистры в стек

В цикле извлекает из стека значения по одному и

отображает их на экране

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

Web site Examples

23

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

 

 

Объявление процедуры

Divide et impera

Ассемблер процедуры C/C++ функции

Лучше использовать предикативную форму: имя процедуры – глагол, аргументы – прямые дополнения

if (its_friday_afternoon_and_close_to_quitting_time()) go_home();

• Пример объявления процедуры на ассемблере:

sample PROC

.

.

ret sample ENDP

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

Web site Examples

24

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

 

 

Allen Holub C/C++ rules

4

Документирование

Совет: комментарии для каждой процедуры

Описание всех выполняемых задач.

Receives: список входных параметров; укажите правила использования и требования.

Returns: описание возвращаемых параметров.

Requires: Опциональный список предусловий которые должны выполняться для корректного выполнения.

Changes: Опциональный список изменений.

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

Web site Examples

25

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

 

 

Пример: процедура SumOf

;---------------------------------------------------------

SumOf PROC

;

;Calculates and returns the sum of three 32-bit integers.

;Receives: EAX, EBX, ECX, the three integers. May be

;signed or unsigned.

;Returns: EAX = sum, and the status flags (Carry,

;Overflow, etc.) are changed.

;Requires: nothing

;---------------------------------------------------------

add eax,ebx add eax,ecx ret

SumOf ENDP

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

Web site Examples

26

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

 

 

Команды CALL и RET

 

 

Пример CALL-RET (1-2)

 

• Команда CALL вызывает процедуру

 

 

 

main PROC

 

 

 

 

0000025 смещение

00000020 call MySub

 

• смещение следующей команды сохраняется в

 

 

00000025 mov eax,ebx

 

 

 

команды следующей за

 

стеке (точка возврата)

 

 

 

CALL

.

 

 

 

 

 

 

.

 

 

• помещает адрес процедуры в EIP

 

 

 

main ENDP

 

 

• Команда RET осуществляет возврат из

 

 

 

MySub PROC

 

 

процедуры

 

 

 

00000040 смещение

00000040 mov eax,edx

 

• вершина стека извлекается в EIP

 

 

первой команды в MySub

.

 

 

 

 

 

.

 

 

 

 

 

 

 

ret

 

 

 

 

 

 

 

MySub ENDP

 

 

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

Web site Examples

27

 

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

Web site Examples

28

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример CALL-RET (2-2)

 

Вложенные вызовы процедур

 

 

 

 

 

 

 

 

 

К моменту вызова Sub3, стек

 

 

 

 

 

 

 

 

 

Команда CALL

 

 

00000025

ESP

00000040

 

 

 

 

 

 

 

 

уже содержит три адреса:

помещает 00000025 в

 

 

 

EIP

 

 

 

 

 

 

 

 

 

 

 

 

 

стек, и загружает

 

 

 

 

 

 

 

 

 

 

 

 

00000040 в EIP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команда RET

00000025

ESP

00000025

извлекает 00000025 из

 

 

 

стека в EIP

 

 

EIP

 

 

 

(содержимое стека после исполнения RET)

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

Локальные и глобальные метки

 

 

Передача параметров (1-3)

 

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

 

 

 

 

 

глобальная – во всех процедурах.

 

 

 

• Хорошо написанные процедуры переносимы

 

 

 

 

 

 

main PROC

; error

 

 

• Не должны быть привязаны к конкретным

 

jmp L2

 

 

переменным

 

 

L1::

; global label

 

 

• Параметры делают процедуры гибкими

 

exit

 

 

 

 

main ENDP

 

 

 

• Не переусердствуйте

 

 

sub2 PROC

 

 

 

 

 

; local label

 

 

• Пример WinAPI

 

 

L2:

 

 

 

 

jmp L1

; ok

 

 

 

 

 

ret

 

 

 

 

 

 

sub2 ENDP

 

 

 

 

 

 

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

Web site Examples

31

 

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

Web site Examples

32

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

Передача параметров (2-3)

Процедура ArraySum вычисляет сумму элементов массива. Она использует два внешних имени:

ArraySum PROC

; array index

 

mov esi,0

 

mov eax,0

; set the sum to zero

 

mov ecx,LENGTHOF myarray

; set number of elements

 

L1: add eax,myArray[esi]

; add each integer to sum

 

add esi,4

; point to next integer

 

loop L1

; repeat for array size

 

mov theSum,eax

; store the sum

 

ret

 

 

ArraySum ENDP

 

 

Не универсальна!

 

 

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

Web site Examples

33

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

 

 

 

 

 

Передача параметров (3-3)

Процедура ArraySum возвращает в EAX сумму массива двойных слов, адрес которого содержится в ESI, а длина в ECX:

ArraySum PROC

;Receives: ESI points to an array of doublewords,

;ECX = number of array elements.

;Returns: EAX = sum

;-----------------------------------------------------

 

 

mov eax,0

; set the sum to zero

 

L1: add eax,[esi]

; add each integer to sum

 

add esi,4

; point to next integer

 

loop L1

; repeat for array size

 

ret

 

 

ArraySum ENDP

 

 

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

Web site Examples

34

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

 

 

Оператор USES

• Указывает используемые регистры

ArraySum PROC USES esi ecx

; set the sum to zero

mov eax,0

...

 

MASM генерирует

ArraySum PROC push esi push ecx

.

.

pop ecx pop esi ret

ArraySum ENDP

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

Web site Examples

35

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

 

 

Исключение

Сумма значений из трех регистров сохраняется в EAX (3), но вызов команды POP теряет возвращаемое в EAX значение(4):

SumOf PROC

; sum of three integers

push eax

; 1

add eax,ebx

; 2

add eax,ecx

; 3

pop eax

; 4

ret

 

SumOf ENDP

 

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

Web site Examples

36

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

 

 

6

Структурное программирование

Проектирование сверху вниз (функциональная декомпозиция) :

проектируйте прежде чем кодировать

разбивайте задачи на подзадачи

иерархическая структура (процедуры)

тестируйте процедуры отдельно

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

Web site Examples

37

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

 

 

Структурная схема (2-3)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

39

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

Web site Examples

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структурное программирование(2-2)

Main

 

Clrscr

; clear screen

PromptForIntegers

 

WriteString

; display string

ReadInt

; input integer

ArraySum

; sum the integers

DisplaySum

 

WriteString

; display string

WriteInt

; display integer

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

Web site Examples

38

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

 

 

The End

main()

{

char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}"; printf(a,34,a,34);

}

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

Web site Examples

40

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

 

 

7