assembly language for intel-based computers, 5 th edition chapter 8: procedimentos avançados (c)...

61
Assembly Language for Intel- Assembly Language for Intel- Based Computers, 5 Based Computers, 5 th th Edition Edition Chapter 8: procedimentos avançados (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. Slides prepared by Kip R. Irvine Revision date: June 4, 2006 Kip R. Irvine

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Assembly Language for Intel-Based Assembly Language for Intel-Based Computers, 5Computers, 5thth Edition Edition

Chapter 8: procedimentos avançados

(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.

Slides prepared by Kip R. Irvine

Revision date: June 4, 2006

Kip R. Irvine

Page 2: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

2

índiceíndice

• Stack Frames• Recursão• INVOKE, ADDR, PROC e PROTO• MACROS

Page 3: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

3

Stack FramesStack Frames

• Parâmetros de pilha• Variáveis locais• Instruções ENTER e LEAVE • Diretiva LOCAL• Procedimento WriteStackFrame Seção

seguinte

Page 4: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

4

Parâmetros de pilha Parâmetros de pilha

• Mais conveniente que parâmetros de registradores• Duas possíveis formas de chamar DumpMem. Qual

é a mais fácil?

pushadmov esi,OFFSET arraymov ecx,LENGTHOF arraymov ebx,TYPE arraycall DumpMempopad

push TYPE arraypush LENGTHOF arraypush OFFSET arraycall DumpMem

Page 5: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5

Stack FrameStack Frame

• Também conhecido como activation record

• Área da pilha destinada para o endereço de retorno, passagem de parâmetros, registradores salvos,e variáveis locais

• Criado pelos seguintes passos:

• O programa chamador salva os argumentos na pilha e chama o procedimento.

• O procedimento chamado salva EBP na pilha e carrega o valor de ESP em EBP. •EBP passa a ser base para os parâmetros do procedimento chamado.

• Se variáveis locais são necessárias, uma constante é subraída de ESP para abrir espaço na pilha.

Page 6: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 6

Acesso explícito a parâmetros de pilhaAcesso explícito a parâmetros de pilha

• Um procedimento pode acessar explicitamente parâmetros de pilha usando offset constante em EBP1.

• Exemplo: [ebp + 8]

• EBP é chamado de base pointer ou frame pointer porque contem o endereço da base do stack frame.

• EBP não muda de valor durante a execução do procedimento.

• EBP deve ser restaurado com seu valor original quando o procedimento termina.

1 BP in Real-address mode

Page 7: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

7

Instrução RETInstrução RET

• Retorna da subrotina

• Recupera (Pop) o ponteiro de instrução (EIP ou IP). O controle é transferido para o endereço recuperado.

• Sintaxe:• RET• RET n

• Operando opcional n causa pop de n bytes da pilha após EIP (ou IP) receber o endereço de retorno.

Page 8: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

8

Exemplo de Stack FrameExemplo de Stack Frame

.datasum DWORD ?.code

push 6 ; second argumentpush 5 ; first argumentcall AddTwo ; EAX = summov sum,eax ; save the sum

AddTwo PROCpush ebpmov ebp,esp..

Page 9: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

9

AddTwo ProcedureAddTwo Procedure (1 de 2) (1 de 2)

AddTwo PROC,val1:DWORD, val2:DWORD

mov eax,val1add eax,val2

retAddTwo ENDP

• Reescrevendo AddTwo Procedure

Page 10: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

10

AddTwo ProcedureAddTwo Procedure (2 de 2) (2 de 2)

AddTwo PROC,val1:DWORD, val2:DWORD

push ebpmov ebp, espmov eax,val1add eax,val2leaveret 8

AddTwo ENDP

• MASM gera o seguinte código quando é montado AddTwo (do slide anterior):

mov esp,ebppop ebp

A instrução LEAVE resume-se em:

AddTwo PROC,val1:DWORD, val2:DWORD

mov eax,val1add eax,val2

AddTwo ENDP

Page 11: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

11

Passando Argumentos por ReferênciaPassando Argumentos por Referência (1 de 2) (1 de 2)

• O procedimento ArrayFill preenche um vetor com inteiros aleatórios de 16-bits

• O programa chamador passa o endereço do vetor, e o número de elementos:

.datacount = 100array WORD count DUP(?).code

push OFFSET arraypush COUNTcall ArrayFill

Page 12: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

12

Passando Argumentos por ReferênciaPassando Argumentos por Referência (2 de 2) (2 de 2)

ArrayFill PROCpush ebpmov ebp,esppushadmov esi,[ebp+12]mov ecx,[ebp+8]..

ESI aponta para o início do vetor, para facilitar o uso de um loop para acessar cada elemento. View the complete program.

ArrayFill pode referenciar um vetor sem saber o nome :

Page 13: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

13

Variáveis locaisVariáveis locais

• Para criar variáveis locais explicitamente, subtrair o seu tamanho de ESP.

• O seguinte exemplo cria e inicializa duas variáveis locais de 32-bits( locA e locB):

MySub PROCpush ebpmov ebp,espsub esp,8mov [ebp-4],123456h ; locAmov [ebp-8],0 ; locB..

Page 14: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

14

Instrução LEA Instrução LEA

• A instrução LEA retorna os offsets dos operandos • Mais genérico que o operador OFFSET que pode

retornar somente offsets de constantes.

• LEA é requerida para a obtenção de offset de um parâmetro de pilha ou variável local. Por exemplo:

CopyString PROC,count:DWORDLOCAL temp:BYTE

mov edi,OFFSET count ; invalid operandmov esi,OFFSET temp ; invalid operandlea edi,count ; oklea esi,temp ; ok

Page 15: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

15

Sua vez . . .Sua vez . . .

• Criar um procedimento Difference que subtrai o primeiro argumento do segundo. Exemplo:

push 14 ; first argument

push 30 ; second argument

call Difference ; EAX = 16

Difference PROCpush ebpmov ebp,espmov eax,[ebp + 8] ; second argumentsub eax,[ebp + 12] ; first argumentpop ebpret 8

Difference ENDP

Page 16: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

16

Classificação de parâmetrosClassificação de parâmetros

• Parâmetro de entrada é um dado passado do programa chamador para o procedimento. • O procedimento chamado não modifica o parâmetro. A modificação é

confinada somente dentro do procedimento.

• Um parâmetro de entrada-saída é um ponteiro para uma variável contendo uma entrada que será usada e modificada pelo procedimento. • A variável passada pelo programa chamador é modificada.

• Um parâmetro de saída é criado passando um ponteiro a uma variável quando um procedimento é chamado.

• O procedimento não usa o valor existente na variável, mas coloca um novo valor antes do retorno.

Page 17: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

17

Exemplo: trocando dois inteirosExemplo: trocando dois inteiros

Swap PROC USES eax esi edi,pValX:PTR DWORD, ; pointer to first integerpValY:PTR DWORD ; pointer to second integer

mov esi,pValX ; get pointersmov edi,pValYmov eax,[esi] ; get first integerxchg eax,[edi] ; exchange with secondmov [esi],eax ; replace first integerret

Swap ENDP

O procedimento Swap troca valores de dois inteiros de 32 bits. pValX e pValY não trocam valores, mas os inteiros que eles apontam são modificados.

Page 18: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 18

ENTER e LEAVEENTER e LEAVE• Instrução ENTER cria um stack frame para um procedimento

chamado: tem dois operandos sendo o primeiro o número de bytes e o segundo o nível de “aninhamento” (nesting level)• salva EBP na pilha e novo EBP aponta para a base do stack frame

• Reserva espaço para variáveis locais

• Exemplo:MySub PROC

enter 8,0

• Equivale a:MySub PROC

push ebpmov ebp,espsub esp,8

Page 19: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 19

Diretiva LOCAL Diretiva LOCAL

• Uma variável local é criada, usada, e destruída dentro de um procedimento• A diretiva LOCAL declara uma lista de variáveis locais

• Segue imediatamente à diretiva PROC • É atribuído um tipo a cada variável

• Sintaxe:

LOCAL varlist

Exemplo:

LOCAL substitui ENTER, atribuindo nomes às variáveis locais

MySub PROCLOCAL var1:BYTE, var2:WORD, var3:SDWORD

Page 20: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

20

Exemplo de LOCAL Exemplo de LOCAL (1 de 2) (1 de 2)

BubbleSort PROCLOCAL temp:DWORD, SwapFlag:BYTE. . .ret

BubbleSort ENDP

BubbleSort PROCpush ebpmov ebp,espadd esp,0FFFFFFF8h ; add -8 to ESP. . .mov esp,ebppop ebpret

BubbleSort ENDP

MASM gera o seguinte código:

Page 21: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

21

Exemplo de LOCAL Exemplo de LOCAL (2 de 2) (2 de 2)

Diagrama do stack frame para o procedimento BubbleSort:

Page 22: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

22

Variáveis locais Non-DoublewordVariáveis locais Non-Doubleword

• Variáveis locais podem ser de diferentes tamanhos

• Como são criadas numa pilha com a diretiva LOCAL:

• 8-bit: no próximo byte da pilha

• 16-bit: no próximo word da pilha

• 32-bit: no próximo doubleword da pilha

Page 23: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 23

Local Byte VariableLocal Byte Variable

Example1 PROC

LOCAL var1:BYTE

mov al,var1 ; [EBP - 1]

ret

Example1 ENDP

Page 24: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

24

Procedimento WriteStackFrame Procedimento WriteStackFrame

• Mostra o conteúdo do stack frame corrente• Protótipo:

WriteStackFrame PROTO,

numParam:DWORD, ; number of passed parameters

numLocalVal: DWORD, ; number of DWordLocal variables

numSavedReg: DWORD ; number of saved registers

Page 25: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

25

Exemplo de WriteStackFrame Exemplo de WriteStackFrame

main PROCmov eax, 0EAEAEAEAhmov ebx, 0EBEBEBEBhINVOKE aProc, 1111h, 2222hexit

main ENDP

aProc PROC USES eax ebx,x: DWORD, y: DWORDLOCAL a:DWORD, b:DWORDPARAMS = 2LOCALS = 2SAVED_REGS = 2mov a,0AAAAhmov b,0BBBBhINVOKE WriteStackFrame, PARAMS, LOCALS, SAVED_REGS

Page 26: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

26

Seção seguinteSeção seguinte

• Stack Frames• Recursão• INVOKE, ADDR, PROC e PROTO• MACROS

Page 27: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

27

RecursãoRecursão

• O que é recursão?• Calcular recursivamente uma soma• Cálculo de um Fatorial

Page 28: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

28

O que é recursão?O que é recursão?

• Um processo criado quando . . .• Um procedimento chama a si próprio• Procedimento A chama procedimento B, que por sua vez

chama o procedimento A

• Usando um grafo em que cada nó é um procedimento e cada aresta é uma chamada de procedimento, a recursão forma um ciclo:

Page 29: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

29

Calcular recursivamente uma somaCalcular recursivamente uma soma

CalcSum PROCcmp ecx,0 ; check counter valuejz L2 ; quit if zeroadd eax,ecx ; otherwise, add to sumdec ecx ; decrement countercall CalcSum ; recursive call

L2: retCalcSum ENDP

O procedimento CalcSum calcula recursivamente a soma de um vetor de inteiros. Recebe: ECX = count. Retorna: EAX = sum

Stack frame:

Page 30: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

30

Calculando um fatorialCalculando um fatorial (1 de 3) (1 de 3)

int function factorial(int n){

if(n == 0) return 1;else return n * factorial(n-1);

}

5! = 5 * 4!

4! = 4 * 3!

3! = 3 * 2!

2! = 2 * 1!

1! = 1 * 0!

0! = 1

(base case)

1 * 1 = 1

2 * 1 = 2

3 * 2 = 6

4 * 6 = 24

5 * 24 = 120

1 = 1

recursive calls backing up

Esta função calcula o fatorial do inteiro n. Um novo valor de n é salvo em cada stack frame:

A cada retorno de uma chamada recursiva, o produto que retorna é multiplicado pelo valor prévio de n.

Page 31: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

31

Calculando um fatorialCalculando um fatorial (2 de 3) (2 de 3)Factorial PROC

push ebpmov ebp,espmov eax,[ebp+8] ; get ncmp eax,0 ; n < 0?ja L1 ; yes: continuemov eax,1 ; no: return 1jmp L2

L1: dec eaxpush eax ; Factorial(n-1)call Factorial

; Instructions from this point on execute when each; recursive call returns.

ReturnFact:mov ebx,[ebp+8] ; get nmul ebx ; eax = eax * ebx

L2: pop ebp ; return EAXret 4 ; clean up stack

Factorial ENDP

Page 32: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

32

Calculando um fatorialCalculando um fatorial (3 de 3) (3 de 3)

Supondo o cálculo de 12!

O diagrama mostra os primeiros stack frames criados por chamadas recursivas a Factorial

Cada chamada recursiva usa 12 bytes do espaço de pilha.

Page 33: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

33

Seção seguinteSeção seguinte

• Stack Frames• Recursão• INVOKE, ADDR, PROC e PROTO• MACROS

Page 34: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

34

INVOKE, ADDR, PROC e PROTOINVOKE, ADDR, PROC e PROTO

• Diretiva INVOKE• Operador ADDR • Diretiva PROC• Diretiva PROTO• Classificação de Parâmetros • Exemplo: troca de dois inteiros

Page 35: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 35

Diretiva INVOKE Diretiva INVOKE

• A diretiva INVOKE é uma poderosa substituição para a instrução CALL que permite a passagem de múltiplos argumentos

• Sintaxe:INVOKE procedureName [, argumentList]

• ArgumentList é uma lista opcional delimitada por vírgula de argumentos de procedimento

• Argumentos podem ser:• Valores imediatos e expressões inteiras• Nomes de variáveis• Endereços e expressões ADDR• Nomes de registradores

Page 36: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 36

Exemplos de INVOKEExemplos de INVOKE

.databyteVal BYTE 10wordVal 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]

Page 37: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

37

Operador ADDR Operador ADDR

.datamyWord WORD ?.codeINVOKE mySub,ADDR myWord

• Retorna um ponteiro de uma variável:

• Exemplo:

Page 38: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

38

Diretiva PROC Diretiva PROC (1 de 2) (1 de 2)

• A diretiva PROC declara um procedimento com uma lista opcional de parâmetros.

• Sintaxe:label PROC paramList

• paramList é uma lista de parâmetros separados por vírgulas. Cada parâmetro tem a seguinte sintaxe:

paramName : type

type deve ser um dos tipos padrões (BYTE, SBYTE, WORD, etc.), ou um ponteiro a um desses tipos.

Page 39: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 39

Diretiva PROC Diretiva PROC (2 de 2) (2 de 2)

• Os formatos alternativos permitem lista de parâmetros serem em uma ou mais linhas separadas:

label PROC,

paramList

• Os parâmetros podem ser na mesma linha . . .param-1:type-1, param-2:type-2, . . ., param-n:type-n

• Ou podem ser em linhas separadas:param-1:type-1,

param-2:type-2,

. . .,

param-n:type-n

comma required

Page 40: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

40

Procedimento AddTwoProcedimento AddTwo (1 de 2) (1 de 2)

AddTwo PROC,val1:DWORD, val2:DWORD

mov eax,val1add eax,val2

retAddTwo ENDP

• O procedimento AddTwo recebe dois inteiros e retorna a soma em EAX.

Page 41: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

41

Exemplos de PROC Exemplos de PROC (2 de 3) (2 de 3)

FillArray PROC,pArray:PTR BYTE, fillVal:BYTEarraySize:DWORD

mov ecx,arraySizemov esi,pArraymov al,fillVal

L1: mov [esi],alinc esiloop L1ret

FillArray ENDP

FillArray recebe um ponteiro a um vetor de bytes, um único byte que é copiado a cada elemento do vetor, e o tamanho do vetor.

Page 42: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

42

Exemplos de PROC Exemplos de PROC (3 de 3) (3 de 3)

ReadFile PROC,pBuffer:PTR BYTELOCAL fileHandle:DWORD. . .

ReadFile ENDP

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

Swap ENDP

Page 43: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 43

Diretiva PROTO Diretiva PROTO

• Cria um protótipo de procedimento

• Sintaxe:• label PROTO paramList

• Todo procedimento chamado pela diretiva INVOKE deve ter um protótipo

• Uma definição de procedimento completa pode também servir como o próprio protótipo

Page 44: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

44

Diretiva PROTO Diretiva PROTO

• Configuração padrão: PROTO aparece no topo da listagem do programa, INVOKE aparece no segmento de código, e a implementação do procedimento ocorre depois.

MySub PROTO ; procedure prototype

.codeINVOKE MySub ; procedure call

MySub PROC ; procedure implementation..

MySub ENDP

Page 45: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

45

Exemplo de PROTOExemplo de PROTO

• Protótipo para o procedimento ArraySum , mostrando a sua lista de parâmetros:

ArraySum PROTO,ptrArray:PTR DWORD, ; points to the arrayszArray:DWORD ; array size

Page 46: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 4646

Seção seguinteSeção seguinte

• Stack Frames• Recursão• INVOKE, ADDR, PROC e PROTO• MACROS

Page 47: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 4747

MacrosMacros

• Introducing Macros• Defining Macros• Invoking Macros• Macro Examples

Page 48: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 4848

Introducing MacrosIntroducing Macros

• A macro1 is a named block of assembly language statements.

• Once defined, it can be invoked (called) one or more times.

• During the assembler's preprocessing step, each macro call is expanded into a copy of the macro.

• The expanded code is passed to the assembly step, where it is checked for correctness.

1Also called a macro procedure.

Page 49: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 4949

Defining MacrosDefining Macros

• A macro must be defined before it can be used.

• Parameters are optional.

• Each parameter follows the rules for identifiers. It is a string that is assigned a value when the macro is invoked.

• Syntax:

macroname MACRO [parameter-1, parameter-2,...]

statement-list

ENDM

Page 50: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5050

mNewLine Macro ExamplemNewLine Macro Example

mNewLine MACRO ; define the macrocall Crlf

ENDM.data

.codemNewLine ; invoke the macro

This is how you define and invoke a simple macro.

The assembler will substitute "call crlf" for "mNewLine".

Page 51: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5151

mPutChar MacromPutChar Macro

mPutchar MACRO charpush eaxmov al,charcall WriteCharpop eax

ENDM

Writes a single character to standard output.

Definition:

.codemPutchar 'A'Invocation:

1 push eax1 mov al,'A'1 call WriteChar1 pop eax

Expansion:viewed in the listing file

Page 52: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5252

Invoking MacrosInvoking Macros (1 of 2) (1 of 2)

• When you invoke a macro, each argument you pass matches a declared parameter.

• Each parameter is replaced by its corresponding argument when the macro is expanded.

• When a macro expands, it generates assembly language source code.

• Arguments are treated as simple text by the preprocessor.

Page 53: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5353

Invoking MacrosInvoking Macros (2 of 2) (2 of 2)

Relationships between macros, arguments, and parameters:

Page 54: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5454

mWriteStr MacromWriteStr Macro (1 of 2) (1 of 2)

mWriteStr MACRO bufferpush edxmov edx,OFFSET buffercall WriteStringpop edx

ENDM.datastr1 BYTE "Welcome!",0.codemWriteStr str1

Provides a convenient way to display a string, by passing the string name as an argument.

Page 55: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5555

mWriteStr MacromWriteStr Macro (2 of 2) (2 of 2)

1 push edx1 mov edx,OFFSET str11 call WriteString1 pop edx

The expanded code shows how the str1 argument replaced the parameter named buffer:

mWriteStr MACRO bufferpush edxmov edx,OFFSET buffercall WriteStringpop edx

ENDM

Page 56: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5656

mReadStrmReadStr

mReadStr MACRO varNamepush ecxpush edxmov edx,OFFSET varNamemov ecx,(SIZEOF varName) - 1call ReadStringpop edxpop ecx

ENDM.datafirstName BYTE 30 DUP(?).codemReadStr firstName

The mReadStr macro provides a convenient wrapper around ReadString procedure calls.

Page 57: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5757

mGotoXYmGotoXY

mGotoxy MACRO X:REQ, Y:REQpush edxmov dh,Ymov dl,Xcall Gotoxypop edx

ENDM

The mGotoXY macro sets the console cursor position by calling the Gotoxy library procedure.

The REQ next to X and Y identifies them as required parameters.

Page 58: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5858

mDumpMemmDumpMem

mDumpMem MACRO address, itemCount, componentSizepush ebxpush ecxpush esimov esi,addressmov ecx,itemCountmov ebx,componentSizecall DumpMempop esipop ecxpop ebx

ENDM

The mDumpMem macro streamlines calls to the link library's DumpMem procedure.

Page 59: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 5959

mDumpmDump

mDump MACRO varName:REQ, useLabelIFB <varName> EXITMENDIFcall CrlfIFNB <useLabel> mWrite "Variable name: &varName"ELSE mWrite " "ENDIFmDumpMem OFFSET varName, LENGTHOF varName,

TYPE varNameENDM

The mDump macro displays a variable, using its known attributes. If <useLabel> is nonblank, the name of the variable is displayed.

Page 60: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

Web site Examples 6060

mWritemWrite

mWrite MACRO textLOCAL string.data ;; data segmentstring BYTE text,0 ;; define local string.code ;; code segmentpush edxmov edx,OFFSET stringcall Writestringpop edx

ENDM

The mWrite macro writes a string literal to standard output. It is a good example of a macro that contains both code and data.

The LOCAL directive prevents string from becoming a global label.

Page 61: Assembly Language for Intel-Based Computers, 5 th Edition Chapter 8: procedimentos avançados (c) Pearson Education, 2006-2007. All rights reserved. You

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

61

The EndThe End