Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Assembly cap8, Notas de estudo de Engenharia Telemática

A pilha e subrotinas

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 30/11/2010

samuel-santos-22
samuel-santos-22 🇧🇷

4.6

(41)

262 documentos

1 / 10

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Cap8 – Pilha e subrotinas
Página 1 de 10
8. A pilha e subrotinas
8.1 Organização da Pilha (stack)
Stack:
estrutura de dados de uma dimensão organizada em algum trecho
(segmento) da Memória;
o primeiro item adicionado é o último a ser removido (first-in, last-out);
a posição da pilha mais recentemente acrescida é o topo da pilha.
Declaração do segmento de pilha:
.STACK 100h ;dimensiona o tamanho da pilha
SS -> aponta o início do segmento de pilha (base)
SP -> aponta o topo da pilha (define o deslocamento do topo em
relação à base)
A pilha cresce do topo para baixo.
Endereço para acesso à pilha: SS:SP (no. de segmento:offset)
Movimentar dados para pilha: PUSH fonte,
PUSHF
Movimentar dados da pilha: POP destino,
POPF
As instruções de pilha o alteram os FLAGS
Não é possível movimentar dados de 8 bits, nem valores imediatos
pf3
pf4
pf5
pf8
pf9
pfa

Pré-visualização parcial do texto

Baixe Assembly cap8 e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity!

8. A pilha e subrotinas

8.1 Organização da Pilha ( stack )

Stack :

  • estrutura de dados de uma dimensão organizada em algum trecho

(segmento) da Memória;

o primeiro item adicionado é o último a ser removido ( first-in, last-out

  • a posição da pilha mais recentemente acrescida é o topo da pilha.

Declaração do segmento de pilha:

.STACK 100h ;dimensiona o tamanho da pilha

SS -> aponta o início do segmento de pilha (base)

SP -> aponta o topo da pilha (define o deslocamento do topo em

relação à base)

A pilha cresce do topo para baixo.

  • Endereço para acesso à pilha: SS:SP (no. de segmento:offset)
  • Movimentar dados para pilha: PUSH fonte,

PUSHF

  • Movimentar dados da pilha: POP destino,

POPF

  • As instruções de pilha não alteram os FLAGS
  • Não é possível movimentar dados de 8 bits, nem valores imediatos

8.2 Instruções para colocar dados na pilha:

PUSH fonte

PUSHF

onde fonte é:

  • um registrador de 16 bits
  • uma palavra de memória ou variável de 16 bits (de tipo DW )

A execução de PUSH resulta nas seguintes ações:

  • o registrador SP ( stack pointer ) é decrementado de 2
  • uma cópia do conteúdo da fonte é armazenado na pilha de forma que
    • a posição SS:SP -> armazena o byte baixo da fonte
    • a posição SS:(SP + 1) -> armazena o byte alto
  • o conteúdo da fonte não é alterado

A execução de PUSHF , que não possui operando, resulta:

o registrador SP ( stack pointer

) é decrementado de 2

  • uma cópia do conteúdo do registrador de FLAGS é armazenado na pilha

Exemplo de operação: ...

PUSH AX ;instrução 1

PUSHF ;instrução 2

Offset Antes Depois de 1 Depois de 2

0100h? <- SP??

00FFh? 12h 12h AX

00FEh? 34h <- SP 34h 1234h

00FDh?? 56h

00FCh?? 78h <- SP

00FBh??? FLAGS

00FAh??? 5678h

00F9h???

(Base)

Um exemplo de uso de pilha:

TITLE ENTRADA INVERTIDA

.MODEL SMALL

.STACK 100h

.CODE

MOV AH,2 ;exibe o Prompt para o usuario

MOV DL,'?' ;caracter '?' para a tela

INT 21h ;exibe

XOR CX,CX ;inicializando contador de caracteres em zero

MOV AH,1 ;prepara para ler um caracter do teclado

INT 21h ;caracter em AL

; while caracter nao e' do

INICIO: CMP AL,0DH ;e' o caracter ?

JE PT1 ;sim, entao saindo do loop

;salvando o caracter na pilha e incrementando o contador

PUSH AX ;AX vai para a pilha (interessa somente AL)

INC CX ;contador = contador + 1

;lendo um novo caracter

INT 21h ;novo caracter em AL

JMP INICIO ;retorna para o inicio do loop

; end_while

PT1: MOV AH,2 ;prepara para exibir

MOV DL,0DH ;

INT 21h ;exibindo

MOV DL,0AH ;

INT 21h ;exibindo: mudança de linha

JCXZ FIM ;saindo se nenhum caracter foi digitado

for

contador vezes do

TOPO: POP DX ;retira o primeiro caracter da pilha

INT 21h ;exibindo este caracter

LOOP TOPO ;em loop até CX = 0

; end_for

FIM: MOV AH,4CH ;preparando para sair para o DOS

INT 21H

END

8.4 Terminologia para subrotinas (ou procedures )

Sintaxe para subrotinas:

nome PROC tipo

;corpo da subrotina - instruções

RET ;transfere o controle de volta para a rotina principal

nome ENDP

Obs: tipos possíveis NEAR

-> subrotina no mesmo segmento de código

FAR -> em outro segmento de código

Mecanismo de chamada e retorno:

PRINCIPAL PROC

CALL SUB

;próxima instrução

PRINCIPAL ENDP

SUB1 PROC

;primeira instrução

RET

SUB1 ENDP

Comunicação de dados entre subrotinas:

  • em Linguagem Montadora, não há lista de parâmetros;
  • se há poucos valores de entrada e saída -> usar registradores

Mecanismo de chamada:

Offset Seg. de Código Antes Depois

MAIN PROC

IP IP

... 1012h 1200h

CALL SUB

1012h ;próxima instrução Pilha Pilha

SP ->?? 0100h

? 12h 00FFh

SUB1 PROC

SP->

10h 00FEh

1200h ;primeira instrução?? 00FDh

...?? 00FCh

...?? 00FBh

1300h RET?? 00FAh

Mecanismo de retorno:

Offset Seg. de Código

Antes Depois

MAIN PROC

IP IP

... 1300h 1012h

CALL SUB

1012h ; próxima instrução Pilha Pilha

SP->

? 0100h

12h 12h 00FFh

SUB1 PROC

SP ->

10h 10h 00FEh

1200h ;primeira instrução?? 00FDh

...?? 00FCh

...?? 00FBh

1300h RET?? 00FAh

Um exemplo de subrotina:

TITLE MULTIPLICACAO POR SOMA E DESLOCAMENTO

.MODEL SMALL

.STACK 100h

.CODE

PRINCIPAL PROC

... ;supondo a entrada de dados

CALL MULTIPLICA

... ;supondo a exibição do resultado

MOV AH,4Ch

INT 21h

PRINCIPAL ENDP

MULTIPLICA PROC

;multiplica dois numeros A e B por soma e deslocamento

;entradas: AX = A, BX = B, numeros na faixa 00h - FFh

;saida: DX = A*B (produto)

PUSH AX

PUSH BX ;salva os conteudos de AX e BX

AND DX,0 ;inicializa DX em 0

; repeat

; if B e' impar

TOPO: TEST BX,1 ;B e' impar?

JZ PT1 ;nao, B e' par (LSB = 0)

; then

ADD DX,AX ;sim, entao produto = produto + A

; end_if

PT1: SHL AX,1 ;desloca A para a esquerda 1 bit

SHR BX,1 ;desloca B para a direita 1 bit

; until

JNZ TOPO ;fecha o loop repeat

POP BX

POP AX ;restaura os conteudos de BX e AX

RET ;retorno para o ponto de chamada

MULTIPLICA ENDP

END PRINCIPAL

b) subrotina ALEATORIO que recebe um número em AX e retorna um

número aleatório também em AX, segundo o método acima

apresentado;

c) subrotina ESCREVA que exibe AX em binário no monitor (baseie-se

no trecho de saída binária da página 6.17);

d) escreva uma rotina PRINCIPAL que emita uma mensagem ao

usuário para entrar com o número binário inicial de 16 bits, chame a

subrotina LEIA para ler tal número, chame as subrotinas ALEATORIO e

ESCREVA para calcular e exibir 100 números aleatórios, que devem

ser apresentados na tela cada um com 16 bits seguidos, 4 por linha,

cada grupo separado por 4 espaços em branco.

  1. Converta os “trechos de programas” apresentados no capítulo 6 para

entrada e saída binária e hexadecimal em subrotinas. Faça as devidas

considerações sobre onde estão os valores a serem passados do programa

principal para cada subrotina, e vice-versa (este mecanismo é conhecido

como passagem de parâmetros ), produzindo os comentários necessários

logo no inicio das mesmas. Observe que a partir desta questão, você terá seis

subrotinas muito útes para entradas e saídas de números nas três bases

numéricas: binário, hexa e decimal. Não há necessidade de se reinventar a

roda a todo o momento ; a partir de agora, qualquer rotina muito comum

pode ser posta no formato de subrotina e simplesmente chamada em

qualquer programa.

  1. Escreva uma subrotina para entrar caracteres letras (maiúsculas ou

minúsculas) a pertir do teclado, verificando se pertencem às respectivas faixas

de validade. Faça todas as considerações que julgar necessárias.