Montagem de programas em Assembly com o NASM (II)

Propaganda
Utilização da pilha em Assembly
Luciano José Senger
1
A pilha
A pilha é uma estrutura de dados encontrada em diferentes níveis do processo computacional. A política de atualização
dos valores é o primeiro que entra é o último que sai, isto é, os valores são inseridos na estrutura de dados e o primeiro
valor que é recuperado é o último que foi inserido.
Nas arquiteturas de processadores x86, o SP é o ponteiro da pilha e seu valor é atualizado a cada operação de
inserção ou remoção de valores na pilha. A pilha tem a característica de crescer de cima para baixo na memória, isto
é, na área de memória reservada para a pilha, o ponteiro SP referencia o endereço mais elevado; à medida que a pilha
cresce, os valores vão sendo inseridos nos endereços inferiores e SP é decrementado em 2 posições, pois cada informação
que é gravada na pilha tem tamanho igual a 16 bits.
A pilha tem outra função importante: a comunicação do sistema operacional com o programa em execução. Através
da pilha, os argumentos são passados ao programa para o processamento. Considere a execução do programa abaixo
(sistema Linux):
>prog 1 2 3
Nesse caso a, conguração da pilha é a seguinte:
4
;
prog;
1
;
2
;
3
;
quantidade de argumentos
nome do programa
primeiro argumento
segundo argumento
terceiro argumento
As instruções para a utilização da pilha estão listadas abaixo:
INSTRUÇÃO POP
Propósito: Recuperar uma parte de informação da pilha.
Sintaxe: POP destino
Esta instrução transfere o último valor armazenado na pilha para o operador
de destino, e incrementa em 2 o valor do registrador SP.
INSTRUÇÃO POPF
Propósito: Extrair os flags armazenados na pilha.
Sintaxe: POPF
Este comando transfere os bits da palavra armazenada na parte mais alta da
pilha para registrador de flag. O modo da transferencia segue a sequência:
BIT
0
9
FLAG
CF, 2
IF, 10
PF, 4
DF, 11
AF, 6
OF
ZF,7
SF, 8
TF
INSTRUÇÃO PUSH
Propósito: Coloca uma palavra na pilha.
Sintaxe: PUSH fonte
A instrução PUSH decrementa de dois o valor de SP e então
1
transfere o conteúdo do operador fonte para o novo endereço
resultante no registrador recém modificado.
INSTRUÇÃO PUSHF
Propósito: Colocar os valores dos flags na pilha.
Sintaxe: PUSHF
2
Exercícios
1. Com SP inicialmente com o valor FFFF, dena qual será o valor de SP após a execução das instruções seguintes:
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
PUSH BX
2. Implemente e estude o programa abaixo:
section .data
msg1
db
msg2
db
0, '$'
'Teste de teclado: ', '$'
section .text
_start:
inicio:
org
mov
mov
int
100h
ah,9
dx, msg1
21h
mov ah,01
int 21h
cmp al, 0
je fim
mov dl,al
mov ah, 02
int 21h
mov
mov
mov
int
[msg2], al
ah,9
dx, msg2
21h
jmp inicio
fim:
mov ah, 4ch
int 21h
3. Implemente um programa em assembly que receba como parâmetro o nome de um arquivo (por exemplo escreve
teste.txt) e escreva uma mensagem neste arquivo.
2
Download