






Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
A pilha e subrotinas
Tipologia: Notas de estudo
1 / 10
Esta página não é visível na pré-visualização
Não perca as partes importantes!







8.1 Organização da Pilha ( stack )
Stack :
(segmento) da Memória;
o primeiro item adicionado é o último a ser removido ( first-in, last-out
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.
8.2 Instruções para colocar dados na pilha:
PUSH fonte
onde fonte é:
A execução de PUSH resulta nas seguintes ações:
A execução de PUSHF , que não possui operando, resulta:
o registrador SP ( stack pointer
) é decrementado de 2
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:
.STACK 100h
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'
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
INT 21h ;exibindo
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
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:
;próxima instrução
;primeira instrução
Comunicação de dados entre subrotinas:
Mecanismo de chamada:
Offset Seg. de Código Antes Depois
... 1012h 1200h
1012h ;próxima instrução Pilha Pilha
SP ->?? 0100h
? 12h 00FFh
10h 00FEh
1200h ;primeira instrução?? 00FDh
...?? 00FCh
...?? 00FBh
1300h RET?? 00FAh
Mecanismo de retorno:
Offset Seg. de Código
Antes Depois
... 1300h 1012h
1012h ; próxima instrução Pilha Pilha
? 0100h
12h 12h 00FFh
10h 10h 00FEh
1200h ;primeira instrução?? 00FDh
...?? 00FCh
...?? 00FBh
1300h RET?? 00FAh
Um exemplo de subrotina:
.STACK 100h
... ;supondo a entrada de dados
... ;supondo a exibição do resultado
MOV AH,4Ch
INT 21h
;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 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 AX ;restaura os conteudos de BX e AX
RET ;retorno para o ponto de chamada
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.
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.
minúsculas) a pertir do teclado, verificando se pertencem às respectivas faixas
de validade. Faça todas as considerações que julgar necessárias.