Você está na página 1de 69

Procedimentos

e passagem de
parmetros pela
pilha
Dr. Jorge L. Aching Samatelo
jlasam001@gmail.com

A arte de programar consiste na arte


de organizar e dominar a
complexidade dos sistemas
Dijkstra

Edsger Dijkstra

ndice

Conceitos Bsicos de Programao


Procedimentos
Passagem de parmetros
Laboratrio

Conceitos Bsicos de Programao

Conceitos Bsicos de Programao


Procedimento
Um procedimento um sub-rotina que que efetua uma tarefa especifica.
Pudendo precisar de parmetros de entrada como de sada.

Parmetros de Entrada

Procedimento

Parmetros de Sada

Por exemplo
Procedimento para calcular a raiz quadrada de um nmero
x=4

Raiz Quadrada

y=2

1
1 2 1 3
y x 1 1
2
2
16
Algoritmo
6

Conceitos Bsicos de Programao


Procedimento
Os procedimentos so implementados como
Trechos de cdigo independentes, executados somente quando chamados
por outro(s) trecho(s) de cdigo.
Para poder implementar um procedimento temos que trabalhar em dois passos.
Definio do procedimento. o trecho de cdigo que implementa a tarefa
efetuada pelo procedimento.
Chamada do procedimento. a linha de cdigo no programa principal que
chama ao procedimento para a execuo da tarefa especifica.
Ao ser chamado o procedimento, o fluxo de execuo desloca-se do fluxo
principal para a executar o procedimento.
Concluda a execuo do procedimento, o fluxo de execuo retorna ao ponto
imediatamente aps onde ocorreu a chamada no programa principal.

Conceitos Bsicos de Programao


Procedimento
Ento a logica de execuo de um
procedimento :
Ao
ser
chamado
o
procedimento, o fluxo de
execuo desloca-se do fluxo
principal para o trecho de
cdigo onde o procedimento
definido,
executando
o
procedimento.
Concluda a execuo do
procedimento, o fluxo de
execuo retorna ao ponto
imediatamente
aps
onde
ocorreu
a
chamada
do
procedimento no programa
principal.

Programa principal

Chamada do
Procedimento X

Definio do
procedimento X

Chamada do
Procedimento Y

Definio do
procedimento Y

Fluxo de execuo

Procedimentos (Procedures)

Procedimentos (Procedures)
Instruo de chamada
Instruo CALL
Que faz:
Utilizada para CHAMAR um procedimento.
Faz um desvio no cdigo e guarda o endereo da prxima instruo na
pilha.
Sintaxe:
CALL <dir. destino>
Apos a execuo da instruo CALL resulta nas seguintes aes:
1. O registrador IP, que contem o deslocamento (offset) do endereo da
prxima instruo da rotina "chamante", armazenado na pilha;
2. O registrador IP recebe o deslocamento (offset) do endereo da
primeira instruo do procedimento chamado.

10

Procedimentos (Procedures)
Instruo de retorno
Instruo RET
Que faz:
Utilizada ao final de um procedimento chamado por uma instruo CALL.
Retira o endereo que est no topo da pilha e atualiza o registrador IP com
este.
Sintaxe:
RET

11

Procedimentos (Procedures)
Instruo de retorno
Instruo RET
Observao:
Se a instruo RET tem um numero inteiro como operando
RET <NUMBER>
Ento, a execuo da instruo RET resulta nas seguintes aes:
Primeiro, retira o endereo que est no topo da pilha e atualiza o
registrador IP com este valor.
Segundo, o registrador SP (Stack Pointer) INCREMENTADO em
duas unidades + NUMBER.

12

Procedimentos (Procedures)
Instruo de retorno
Instruo RET
Depois de executar ret 6

Antes de executar ret 6


SP

SS:0100

SP

SS

SS:0100

SS:00FF

00

SS:00FF

00

SS:00FE

05

SS:00FE

05

SS:00FD

00

SS:00FD

00

SS:00FC

06

SS:00FC

06

SS:00FB

00

SS:00FB

00

SS:00FA

07

SS:00FA

07

SS:00F9

00

SS:00F9

00

SS:00F8

21

SS:00F8

21

SS:00F7

SS:00F7

SS:00F6

SS:00F6

SS:00F5

SS:00F5

SS:00F4

SS:00F4

SS:00F3

SS:00F3

SS:00F2

SS:00F2

SS:0000

SS

SS:0000

13

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
67
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
Endereo de
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
retorno
SP
SS:00F8
21
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
14
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
21
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SP
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
15
ret 6

Procedimentos (Procedures)
Exemplo: Mecanismo de Chamada e Retorno
;PROG . PRINCIPAL
....

IP

CS:000D

MOV BX,0x03E8

CS:0010

CALL MYFUNCTION

CS:0013

ADD AX,7

exf001.asm

....
;procedimento
MYFUNCTION:
CS:001A

MOV AX,BX

CS:001C

RET

IP

SP

00

0D

SS:0100
SS:00FF
SS:00FE
SS:00FD
SS:00FC
SS:00FB
SS:00FA
SS:00F9
SS:00F8
SS:00F7

SS:0001

SS

SS:0000

16

Procedimentos (Procedures)
Exemplo: Mecanismo de Chamada e Retorno
;PROG . PRINCIPAL
....

IP

CS:000D

MOV BX,0x03E8

CS:0010

CALL MYFUNCTION

CS:0013

ADD AX,7

exf001.asm

....
;procedimento
MYFUNCTION:
CS:001A

MOV AX,BX

CS:001C

RET

IP

SP

00

10

SS:0100
SS:00FF
SS:00FE
SS:00FD
SS:00FC
SS:00FB
SS:00FA
SS:00F9
SS:00F8
SS:00F7

SS:0001

SS

SS:0000

17

Procedimentos (Procedures)
Exemplo: Mecanismo de Chamada e Retorno
;PROG . PRINCIPAL
....
CS:000D

MOV BX,0x03E8

CS:0010

CALL MYFUNCTION

CS:0013

ADD AX,7

exf001.asm

....
;procedimento
MYFUNCTION:

IP

CS:001A

MOV AX,BX

CS:001C

RET

IP

00

1A

SS:0100

SP

SS:00FF

00

SS:00FE

13

SS:00FD
SS:00FC
SS:00FB
SS:00FA
SS:00F9
SS:00F8
SS:00F7

SS:0001

SS

SS:0000

18

Procedimentos (Procedures)
Exemplo: Mecanismo de Chamada e Retorno
;PROG . PRINCIPAL
....
CS:000D

MOV BX,0x03E8

CS:0010

CALL MYFUNCTION

CS:0013

ADD AX,7

exf001.asm

....
;procedimento
MYFUNCTION:

IP

CS:001A

MOV AX,BX

CS:001C

RET

IP

00

1C

SS:0100

SP

SS:00FF

00

SS:00FE

13

SS:00FD
SS:00FC
SS:00FB
SS:00FA
SS:00F9
SS:00F8
SS:00F7

SS:0001

SS

SS:0000

19

Procedimentos (Procedures)
Exemplo: Mecanismo de Chamada e Retorno
;PROG . PRINCIPAL
....

IP

CS:000D

MOV BX,0x03E8

CS:0010

CALL MYFUNCTION

CS:0013

ADD AX,7

exf001.asm

....
;procedimento
MYFUNCTION:
CS:001A

MOV AX,BX

CS:001C

RET

IP

SP

00

13

SS:0100
SS:00FF

00

SS:00FE

13

SS:00FD
SS:00FC
SS:00FB
SS:00FA
SS:00F9
SS:00F8
SS:00F7

SS:0001

SS

SS:0000

20

Passagem de parmetros

21

Passagem de parmetros
Introduo
Vamos a estudar duas tcnicas para o passagem de parmetros a um
procedimento em assembly:
Passagem por Registradores.
Passagem pela Pilha.

22

Passagem de parmetros
Passagem por Registradores
As vantagens deste mtodo so a sua simplicidade e sua rapidez.
Tudo o que voc precisa fazer :
mover os parmetros para os registradores antes de chamar o procedimento.

23

Passagem de parmetros
Exemplo: Passagem de parmetros por registradores
; --------------------CODIGO DO PROGRAMA----------------------exsb002.asm
mov si, array ; SI aponta ao array
mov cx, 5
; ECX = numero de elementos do array
call ArraySum
; calcula a soma
mov [theSum], ax ; retorna o valor da soma em AX
...
; --------------------------Procedimentos-------------------------; este um procedimento para somar os valores dos elementos de um array usando
; registradores para passagem de parmetro.
ArraySum:
; Recibe: SI : aponta ao array de WORDS,
;
CX : numero de elementos do array.
; Retorna: AX : valor da soma
Salvar contexto
push si
; salva os registradores que sero alterados
push cx
(Prologo)
mov ax,0
; inicia AX a zero
L1: add ax,[si]
; soma cada elemento do array
Tarefa
add si,2
; si aponta ao proximo elemento
loop L1
; repete ate que cx==0
Recuperar contexto
pop cx ; recupera registradores
pop si
(Epilogo)
ret
; soma esta em AX
...
; -----------------DEF. VAR,CONST E ALOCACAO------------------array DW 0x0010, 0x0020, 0x0030, 0x0040, 0x0050
theSum: resw 1
24

Passagem de parmetros
Passagem pela Pilha
Este o mtodo mais poderoso e flexvel de passagem de parmetros. Sua
desvantagem a COMPLEXIDADE.
Tudo o que voc precisa fazer :
PASO 1: movemos todos os valores dos parmetros para a pilha
PASO 2: acessamos aos valores dos parmetros dentro do procedimento
usando o registrador BP.
O registrador SS: Aponta o incio do
segmento de pilha (Base).
O registrador SP: Aponta o topo da pilha
(define o deslocamento do topo em relao
base). Seu valor atualizado a cada operao
de insero (PUSH) ou remoo (POP) de
valores na pilha.
O registrador BP. Aponta a uma posio
da pilha.

SP

SS:0100
SS:00FF
SS:00FE
SS:00FD
SS:00FC
SS:00FB

BP

SS:00FA
SS:00F9
SS:00F8

SS:0001

SS

SS:0000

25

Exemplo: Passagem de parmetros pela pilha


; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
call sum3values
...
; --------------------------Procedimentos-------------------------; este um procedimento para somar tres valores passados pela pilha.
sum3values:
; Recibe: tres WORDS pasados pela pilha.
; Retorna: AX que contem o valor da soma
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
push bp
mov bp,sp
;2. salva contexto
Salvar contexto
push bx ; salva os registradores que sero alterados
(Prologo)
;3. tarefa do procedimento
;desempilha-se os parmetros passados pela pilha
;no caso 3 words (16 bits cada)
mov bx,[bp+8] ; resgata a primeira entrada
Tarefa
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
mov ax, bx
; soma esta em AX
;4. recupera contexto
Recuperar contexto
pop bx ; recupera os registradores
(Epilogo)
pop bp
26
ret 6

Exemplo: Passagem de parmetros pela pilha


IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
0D
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SP
SS:0100
call sum3values
SS:00FF
...
SS:00FE
; --------------------------Procedimentos-------------------------SS:00FD
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
27
ret 6

Exemplo: Passagem de parmetros pela pilha


IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
10
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SP
SS:0100
call sum3values
SS:00FF
...
SS:00FE
; --------------------------Procedimentos-------------------------SS:00FD
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
28
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
11
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
SP
; --------------------------Procedimentos-------------------------SS:00FD
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
29
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
14
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
SP
; --------------------------Procedimentos-------------------------SS:00FD
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
30
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
15
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
SP
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
31
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
18
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
SP
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
; Retorna: AX que contem o valor da soma
SS:00FA
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
32
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
19
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
SP
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
33
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
50
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
SS:00F8
21
SP
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
34
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
51
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
SS:00F8
21
mov bp,sp
SS:00F7
00
;2. salva contexto
SS:00F6
00
push bx ; salva os registradores que sero alterados SP
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
35
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
53
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
SS:00F8
21
mov bp,sp
BP
SS:00F7
00
;2. salva contexto
SS:00F6
00
push bx ; salva os registradores que sero alterados SP
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
36
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha
IP
00
54
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
SS:00FE
05
; --------------------------Procedimentos-------------------------SS:00FD
00
; este um procedimento para somar tres valores passados pela pilha.
sum3values:
SS:00FC
06
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
SS:00F8
21
mov bp,sp
SS:00F7
00
;2. salva contexto
SS:00F6
00
push bx ; salva os registradores que sero alterados BP
;3. tarefa do procedimento
SS:00F5
00
;desempilha-se os parmetros passados pela pilha
SS:00F4
07
SP
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
37
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
54
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
Concluso:
SS:00FF
00
...
Valores
O
registrador
BP
permite
percorrer
a
pilha
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
e acessar
j seja aos parmetros
passados
; este
um procedimento
para somar
tres valoresSS:00FD
passados00pela pilha.
parmetros de
ao
procedimento ou as variveis BP+6
sum3values:
SS:00FC
06
entrada
; locais
Recibe:
tres WORDS pasados pela pilha.
do procedimento.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
valorespara
passados
Endereo de
;1. Faz BP Os
apontar
o topo como
da pilha, antes de salvar o contexto
SS:00F9
00
push bp
parmetros
encontram-se
retorno
SS:00F8
21
mov bp,sp endereados pelo registrador
SS:00F7
00
;2. salva contexto
BP
nas
posies
Valor anterior
BP
SS:00F6
00
push bx ; salva os registradores que sero
alterados
BP+4,BP+6, BP+8
do BP
;3. tarefa do procedimento
SS:00F5
00
;desempilha-se os parmetros passados SP
pela pilha
SS:00F4
07
;no caso 3 words (16 bits cada)
SS:00F3
Os valores
dos registradores
mov bx,[bp+8]
; resgata
a primeiraa entrada
SS:00F2
ser usados
pelo eprocedimento
add bx,[bp+6]
; resgata
soma a segunda entrada
esto; resgata
endereados
add bx,[bp+4]
e soma apelo
terceira entrada
SS:0000
SS
nasemposies
mov ax, bx registrador
; soma BP
esta
AX
;4. recupera
contexto
BP-2,BP-4,BP-6
pop bx ; recupera os registradores
pop bp
38
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
54
mov ax,7
push ax
;Os
guardamos
o terceiro
na pilha
valores dos
parmetros,parametro
en
SS:0100
call sum3values
dereos de retorno e o valor
SS:00FF
00
...
Valores
anterior
do
registrado
BP
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
na para
pilha,
sotres valoresSS:00FD
; este umarmazenado
procedimento
somar
passados00pela pilha.
parmetros de
sum3values:chamados de Stack Frame ou
SS:00FC
06
BP+6
entrada
; Recibe:
tres de
WORDS
pasados pela pilha.
Resgistro
Activao.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
Endereo de
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
retorno
SS:00F8
21
mov bp,sp
SS:00F7
00
;2. salva contexto
Valor anterior
BP
SS:00F6
00
push bx ; salva os registradores que sero
alterados
do BP
;3. tarefa do procedimento
SS:00F5
00
;desempilha-se os parmetros passados SP
pela pilha
SS:00F4
07
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
39
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
60
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
Endereo de
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
retorno
SS:00F8
21
mov bp,sp
SS:00F7
00
;2. salva contexto
Valor anterior
BP
SS:00F6
00
push bx ; salva os registradores que sero
alterados
do BP
;3. tarefa do procedimento
SS:00F5
00
;desempilha-se os parmetros passados SP
pela pilha
SS:00F4
07
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
40
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
62
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
Endereo de
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
retorno
SS:00F8
21
mov bp,sp
BP
SS:00F7
00
;2. salva contexto
Valor anterior
SP
SS:00F6
00
push bx ; salva os registradores que sero
alterados
do BP
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
41
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
67
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
Endereo de
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
00
push bp
retorno
SP
SS:00F8
21
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
42
ret 6

Exemplo: Passagem de parmetros pela pilha

IP

; --------------------CODIGO DO PROGRAMA----------------------exsb003.asm
mov ax,5
push ax
; guardamos o primeiro parametro na pilha
mov ax,6
push ax
; guardamos o segundo parametro na pilha IP
00
21
mov ax,7
push ax
; guardamos o terceiro parametro na pilha
SP
SS:0100
call sum3values
SS:00FF
00
...
Valores
SS:00FE
05
BP+8
; --------------------------Procedimentos-------------------------dos
; este um procedimento para somar tres valoresSS:00FD
passados00pela pilha.
parmetros de
sum3values:
SS:00FC
06
BP+6
entrada
; Recibe: tres WORDS pasados pela pilha.
SS:00FB
00
; Retorna: AX que contem o valor da soma
SS:00FA
07
BP+4
;1. Faz BP apontar para o topo da pilha, antes de salvar o contexto
SS:00F9
push bp
SS:00F8
mov bp,sp
SS:00F7
;2. salva contexto
SS:00F6
push bx ; salva os registradores que sero alterados
;3. tarefa do procedimento
SS:00F5
;desempilha-se os parmetros passados pela pilha
SS:00F4
;no caso 3 words (16 bits cada)
SS:00F3
mov bx,[bp+8] ; resgata a primeira entrada
SS:00F2
add bx,[bp+6] ; resgata e soma a segunda entrada
BP
add bx,[bp+4] ; resgata e soma a terceira entrada
SS:0000
SS
mov ax, bx
; soma esta em AX
;4. recupera contexto
pop bx ; recupera os registradores
pop bp
43
ret 6

Laboratrio

48

Laboratrio
Ateno
Lembrar que:
Comando para montar
(c:\sistemb1\frsm)

pasta

de

trabalho

no

DOSBox

mount c c:\sistemb1\frsm\

c:

Comando para gerar o arquivo .OBJ:

nasm nome_arquivo

Comando para gerar o arquivo .EXE:

freelink nome_arquivo

Depurar o arquivo .EXE: debug nome_arquivo.exe


Para depurar linha por linha o comando t.
Executar o .EXE:

nome_arquivo.exe

49

Laboratrio
Arquivo linec.asm
Para este laboratrio, o aluno utilizar o conjunto de rotinas grficas que se
encontram no arquivo linec.asm. O arquivo composto pelas seguintes
procedimentos:
Chamada
Cursor
caracter
plot_xy
Circle

full_circle
Line

Parmetros a serem passados


dh = linha (0-29) e dl=coluna (0-79)
al= caracter a ser escrito; cor definida na
variavel cor
push x; push y; call plot_xy; (x639,
y479); cor definida na variavel cor
push xc; push yc; push r; call circle;
(xc+r639,yc+r479)e(xc-r0,yc-r0)
; cor definida na variavel cor
push xc; push yc; push r; call full_circle;
(xc+r639,yc+r479) e (xc-r0,yc-r0);
cor definida na variavel cor
push x1; push y1; push x2; push y2; call
line; (x639, y479)

Modo
Grfico
(VGA)
Grfico
(VGA)
Grfico
(VGA)

procedimento

Coloca um pixel na
posio (x,y)

Grfico
(VGA)

Desenha uma
circunferncia

Grfico
(VGA)

Desenha um crculo e
o colore

Grfico
(VGA)

Desenha um
segmento de reta

Posiciona cursor
Escreve 1 caracter

50

Laboratrio
Arquivo linec.asm
Tais procedimentos fazem uso da interrupo de software int 10h definida
pela BIOS (Basic Input Output System). O modo VGA (Video Graphics Array)
permite uma resoluo de 640480 pontos em modo grfico, cada ponto com
at 16 cores. Permite igualmente 256 cores com uma definio de 320200
pontos.
Observe que nas chamadas a estes procedimentos, os parmetros desejados
(posio, cor, etc.) so passados pela pilha. Por exemplo:

51

Chamada ao Procedimento
...
;A varivel cor recebe um valor na
;[0,15].
A
;declarao
das
cores
;abaixo (declarado ;em segment dados)
mov byte [cor], azul
;Empilha as coordenadas (x,y)
push ax
push dx

faixa
segue

;Chama ao procedimento.
call plot_xy
...
segment dados
preto
equ 0
azul
equ 1
verde
equ 2
cyan
equ 3
vermelho equ 4
magenta equ 5
marrom
equ 6
branco
equ 7
cinza
equ 8
azul_claro equ 9
verde_claro equ 10
cyan_claro equ 11
rosa
equ 12
magenta_claro equ 13
amarelo
equ 14
branco_intenso equ 15

Definio do Procedimento chamado

plot_xy:
;Faz BP apontar para o topo da pilha, antes
;de salvar o ;contexto
push bp
mov bp,sp
;Salvando o contexto, empilhando registradores
pushf
push ax
push bx
Salvar contexto
push cx
(Prologo)
push dx
push si
push di
;Preparando para chamar a int 10h
;cor uma varivel global
mov ah,0ch
mov al,[cor]
mov bh,0
Tarefa
mov dx,479
;Aqui, desempilha-se os parmetros passados
;pela pilha, ;no caso 2 words (16 bits cada)
sub dx,[bp+4]
mov cx,[bp+6]
int 10h
; recupera-se o contexto
pop di
pop si
pop dx
Recuperar contexto
pop cx
(Epilogo)
pop bx
pop ax
popf
pop bp
;O 4 como parmetro de ret faz um flush na
pilha, ;desempilhando os parmetros ;passados
pela pilha na ;chamada.
52
ret

Laboratrio
1.
Estude a passagem de parmetros, conforme mostrado acima. Faa um
diagrama de como a passagem se processa na pilha, mostrando SP e BP.
Quando ocorre um call (do tipo near), observe que empilhado o
registrador IP. Para o exemplo da tabela acima, tente explicar as instrues
sub dx,[bp+4] e mov cx,[bp+6]. Veja outros exemplos para as
rotinas line e full_circle.

53

Laboratrio
2.
Gere o cdigo executvel, usando NASM/FREELINK, e veja o comportamento
do programa (so gerados vrios segmentos de reta e crculos, formando um
desenho). Modifique os parmetros e veja o comportamento.

54

Laboratrio
3.
Faa agora um programa que desenhe um quadrado de 640480 pixels, borda
branca e fundo preto. Em processamento de imagens/vdeo, o ponto (0,0) o
ponto superior esquerdo da tela. Depois, acrescente um crculo, de cor
vermelha e raio = 10, no meio da tela.
Usar como referencia o programa: lincr001_template.asm
OBS: Trocar o nome do arquivo para lincr001.asm (Os nomes dos
arquivos devem ter no mximo oito caracteres sem considerar a extenso
ASM)

55

Laboratrio
3. DICA: desenho de linhas
Disenho da linha lateral esquerda
(620,460)

(20,460)

mov
mov
push
mov
push
mov
push
mov
push
call

(20,20)

y+

lincr001.asm
byte[cor],branco_intenso
ax,20
;x1<-20
ax
ax,20
;y1<-20
ax
ax,20
;x2<-20
ax
ax,460
;y2<-460
ax
line ; line(x1,y1,x2,y2)

(620,20)

x+
56

Laboratrio
3. DICA: desenho de linhas
Disenho da linha inferior
(620,460)

(20,460)

mov
mov
push
mov
push
mov
push
mov
push
call

(20,20)

y+

lincr001.asm
byte[cor],branco_intenso
ax,20
;x1<-20
ax
ax,20
;y1<-20
ax
ax,620 ;x2<-620
ax
ax,20
;y2<-20
ax
line ; line(x1,y1,x2,y2)

(620,20)

x+
57

Laboratrio
3. DICA: desenho de linhas
Disenho da linha lateral dereita
(620,460)

(20,460)

mov
mov
push
mov
push
mov
push
mov
push
call

(20,20)

y+

lincr001.asm
byte[cor],branco_intenso
ax,620 ;x1<-620
ax
ax,20
;y1<-20
ax
ax,620 ;x2<-620
ax
ax,460 ;y2<-460
ax
line ; line(x1,y1,x2,y2)

(620,20)

x+
58

Laboratrio
3. DICA: desenho de linhas
Disenho da linha superior
(620,460)

(20,460)

mov
mov
push
mov
push
mov
push
mov
push
call

(20,20)

y+

lincr001.asm
byte[cor],branco_intenso
ax,620 ;x1<-620
ax
ax,460 ;y1<-460
ax
ax,20
;x2<-20
ax
ax,460 ;y2<-460
ax
line ; line(x1,y1,x2,y2)

(620,20)

x+
59

Laboratrio
3. DICA: desenho do circulo
Disenho do circulo
(620,460)

(20,460)

(320,240)

(20,20)

y+

mov
mov
push
mov
push
mov
push
call

lincr001.asm
byte[cor],azul
ax,320 ;xc<-320
ax
ax,240 ;yc<-240
ax
ax,50 ;r<-50
ax
circle ; circle(xc,yc,r)

(620,20)

x+
60

Laboratrio
4.
Agora, faa uma animao com o crculo vermelho (bola vermelha), de modo
que, logo no incio da animao, a bola se desloque a 45, para cima, pela tela e
ao se chocar com as laterais, esta deve desviar de trajetria da mesma forma
que um raio de luz o faria ao ser refletido por uma superfcie reflexiva
especular.
Para fazer o tempo de animao, use a procedimento delay, ajustando seus
parmetros para o seu programa.
delay:

; Esteja atento pois talvez seja importante salvar contexto


; (no caso, CX, o que NO foi feito aqui).
mov cx, word [velocidade]; Carrega velocidade em cx (contador para loop)

del2:
push cx
mov cx, 0800h

; Coloca cx na pilha para usa-lo em outro loop


; Teste modificando este valor

loop del1
pop cx
loop del2
ret

; No loop del1, cx decrementado at que volte a ser zero


; Recupera cx da pilha
; No loop del2, cx decrementado at que seja zero

del1:

61

Laboratrio
4.
Observe que, no incio, deve-se
escolher o modo grfico do vdeo.
Portanto, necessrio armazenar o
modo inicial. Isto feito usando
AH=0Fh e chamando-se INT 10H.
O valor de retorno em AL deve ser
guardado em uma varivel, por
exemplo modo_anterior, para
ser restaurado ao sair do programa.
Depois, para por no modo VGA,
usa-se AX=12H e chama-se INT
10h. Ao sair, com AL=[modo
anterior], ao se fazer AH=0Fh e
chamando-se INT 10H, restaura-se
o modo de vdeo original. Ento, as
partes inicial e final de seu cdigo
devem ser, como se segue:

segment code
..start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,stacktop
; salvar modo corrente de vdeo
mov ah,0Fh
int 10h
mov [modo_anterior],al
; alterar modo de video para grfico
; 640x480 16 cores
mov al,12h
mov ah,0
int 10h
; Aqui entra seu cdigo (loop infinito)
; para fazer a animao.
;------------------------------------------;------------------------------------------;Para sair, faa
sai:
mov ah,0 ; set video mode
mov al,[modo_anterior] ; recupera o modo
; anterior
int 10h
mov ax,4c00h
int 21h

62

Laboratrio
4.
Como seu programa ser um loop infinito, necessrio colocar uma forma de
sair do programa. Assim, dentro de seu loop infinito, o seguinte trecho de
cdigo, baseado na int 21h, deve aparecer:
mov ah,0bh
int 21
cmp al,0
jne adelante
jmp segue
adelante:
mov ah, 08H
int 21H
cmp al, 's'
jne adianta
jmp sai
segue:

;
;
;
;

Le buffer de teclado
Verifica se AL foi 0
se AL != 0 ento h algum caractere na STDIN
se AL = 0 ento nada foi digitado e a animao do jogo deve continuar

; Ler caractere da STDIN


;
;
;
;

Verifica se AL foi 's


se AL != 's ento a finaliza adiantada
se AL = 's ento finaliza o programa
a animao deve seguir a partir daqui

Observe que para AH=0bh, a INT 21H apenas averigua se o buffer do teclado
foi carregado com algum valor de tecla (e no fica esperando pela digitao da
tecla). Se AL = 0 ento nada foi digitado; se AL =255 ento h algum
caractere no buffer que precisa ser lido. Caso haja caractere, fazendo-se AH=8 e
chamando-se a int 21h o resultado da tecla digitada aparece em AL. Observe
que AH=8 no mostra (ecoa) o caractere na tela.
63

Laboratrio
4.
Lembre-se que saltos condicionais (JNE, JC, JE, JZ, JNZ, etc)
deslocam o IP na faixa mxima [-128, 127]. Para saltos maiores que esta faixa,
a verso do NASM16 que usamos no laboratrio, gerara um erro de
compilao. Porm, comum nos programas acontecerem saltos que
extrapolam esta faixa. Portanto, faa conforme o exemplo:
O que gostaria de fazer (o rtulo igual indica
uma posio de memria que extrapola a faixa [128, 127]. Situao onde igual est muito longe.

Mas deu erro de estouro de salto. Ento, deve-se


fazer (OBSERVE QUE USA-SE A INSTRUO
JMP, QUE NO SOFRE DESTE PROBLEMA).

.
.
.
cmp ax,FFFFh ; Verifica se ax foi FFFFh
je igual
; ax == FFFFh
jmp diferente ; ax != FFFFh
.
.
.
igual:

.
.
.
cmp ax, FFFFh ; Verifica se ax foi FFFFh
jne diferente ; ax != FFFFh
jmp igual
; ax == FFFFh
diferente:
; aqui vm as instrues que tratam
; quando for diferente
.
.
.
igual:

64

Laboratrio
4.
Usar como referencia o programa: linecev_template.asm
OBS: Trocar o nome do arquivo para linecev.asm (Os nomes dos
arquivos devem ter no mximo oito caracteres sem considerar a extenso
ASM)

65

Laboratrio
4. DICA: Algoritmo para desenhar o deslocamento da bola
Inicio
+[ppx]

(620,460)

(20,460)

([px]+[ppx],[py]+[ppy])

+[ppy]

([px],[py])

(20,20)

(620,20)

Condio:
[px] [px]+[ppx]
[py] [py]+[ppy]
66

Laboratrio
4. DICA: Algoritmo para desenhar o deslocamento da bola
Coliso na linha superior
(620,460)

(20,460)
([px],[py])

+[ppx]
([px]+[ppx],[py]-[ppy])

+[ppy]

-[ppy]
+[ppx]

(20,20)

(620,20)

Condio:
IF([py]>=460)THEN
[py] [py]-[ppy]
67

Laboratrio
4. DICA: Algoritmo para desenhar o deslocamento da bola
Coliso na linha direita
(620,460)

(20,460)

+[ppx]

-[ppy]
([px],[py])

-[ppx]
([px]-[ppx],[py]-[ppy])
-[ppy]

(20,20)

(620,20)

Condio:
IF([px]>=620)THEN
[px] [px]-[ppx]
68

Laboratrio
4. DICA: Algoritmo para desenhar o deslocamento da bola
Coliso na linha inferior
(620,460)

(20,460)

+[ppy]
-[ppx]
([px]-[ppx],[py]+[ppy])
-[ppx]
-[ppy]

([px],[py])

(20,20)

(620,20)

Condio:
IF([py]<=20)THEN
[py] [py]+[ppy]
69

Laboratrio
4. DICA: Algoritmo para desenhar o deslocamento da bola
Coliso na linha esquerda
(620,460)

(20,460)
+[ppy]

([px]+[ppx],[py]+[ppy])
+[ppx]

([px],[py])
+[ppy]

-[ppx]

(20,20)

(620,20)

Condio:
IF([px]<=20)THEN
[px] [px]+[ppx]
70

Diagrama de Fluxo

[px]25
[ppx] 5

[py]25
[ppy]5

Circle([px],[py],r); vermelho
delay
Circle([px],[py],r); preto
Interrupo de
teclado

NO

NO

NO

NO

[py] 20

[py] 460

[px]20

SIM
[px]620

SIM

SIM

[ppx]TrocarSigno([ppx])

SIM
[ppy]TrocarSigno([ppy])

[px][px]+[ppx]
[py][py]+[ppy]

71

Laboratrio
4. DICA: Converter nmeros positivos a negativos
Para converter um nmero positivo para negativo use o seguinte algoritmo
baseado no COMPLEMENTO A DOIS:
1. Inverta todos os bits do nmero com a instruo NOT.
2. Adicione 1 ao resultado com a instruo INC.
No exemplo a seguir faremos a converso de -5 para +5:
segment code
..start:
...
; --------------------CODIGO DO PROGRAMA----------------------mov ax, -5
not ax ; paso 1
inc ax ; paso 2
; -----------------------SAIDA DO PROGRAMA---------------------...

posneg01.asm

Para maior informao ver: http://stackoverflow.com/questions/4534503/howto-convert-a-positive-number-to-negative-in-assembly


72

Laboratrio
+5 0005h
+4 0004h
4. DICA: Converter nmeros positivos a+3negativos
0003h
+2 0002h
Para converter um nmero positivo
negativo use o seguinte algoritmo
+1 para
0001h
0 : 0000h
baseado no COMPLEMENTO A DOIS
FFFFh
(representa
o nmero -1)
1. Inverta todos os bits do nmero-1com
a instruo
NOT.
FFFEh
2. Adicione 1 ao resultado com a-2
instruo
INC.
-3 FFFDh
-4 FFFCh
No exemplo a seguir faremos a converso
de +5 para -5:
-5 FFFBh
segment code
..start:
...
; --------------------CODIGO DO PROGRAMA----------------------mov ax, -5
not ax ; paso 1
inc ax ; paso 2
; -----------------------SAIDA DO PROGRAMA---------------------...

posneg01.asm

Para maior informao ver:http://stackoverflow.com/questions/4534503/howto-convert-a-positive-number-to-negative-in-assembly


73

Laboratrio
4. DICA: Instruo IF - THEN
necessario usar INSTRUES
DE SALTO:
Tomando em conta que sero
usados nmeros sinalizados
devem-se usar as instrues de
salto JGE (OP1 OP2) e JLE
(OP1 OP2).
No exemplo implementado uma
sentencia IF-THEN aninhado:

segment code
exif002.asm
...
; -----CODIGO DO PROGRAMA--------mov ax,250
;IF(AX menor ou igual a 100)
cmp ax, 100 ;ax <= 100
jle incAX
;ELSEIF(AX maior ou igual a 200)
cmp ax, 200 ;ax >= 200
jge decAX
;THEN1
incAX: add ax,2
mov dx,stringInc
jmp fim
;THEN2
decAX: sub ax,2
mov dx,stringDec
jmp fim
fim: mov ah,0x9
int 21h
...
segment data
; ----DEF. VAR,CONST E ALOCACAO-----stringInc db 'incrementou',13,10,'$'
stringDec db 'decrementou',13,10,'$'

74