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