Sei sulla pagina 1di 7

Instrucciones de pila

La pila es un segmento que es de suma utilidad en estos microprocesadores. En l se almacenan valores temporales como las variables locales de las funciones, o las direcciones de retorno de stas. Una funcin no es ms que una subrutina, o un fragmento de cdigo al que se le llama generalmente varias veces desde el programa principal, o desde una funcin jerrquicamente superior. El segmento de pila est indicado por SS, y el desplazamiento dentro del segmento, por SP. Cuando arranca el programa, SP apunta al final del segmento de pila. Para almacenar informacin en la pila se decrementa SP para que apunte un poco ms arriba y se copia a esa posicin de memoria, SS:SP. Para sacarlo, copiamos lo que haya en SS:SP a nuestro destino, e incrementamos el puntero. Como con todo lo que se hace con frecuencia, hay dispuestas instrucciones propias para el manejo de la pila. Las dos bsicas son PUSH origen (empujar) y POP destino (sacar). La primera decrementa el puntero de pila y copia a la direccin apuntada por l (SS:SP) el operando origen (de tamao mltiplo de 16 bits), mientras que la segunda almacena el contenido de la pila (elemento apuntado por SS:SP) en destino y altera el puntero en consecuencia. Si el operando es de 16 bits se modifica en 2 unidades, de 32 en 4, etc. Lo que se incrementa/decrementa es siempre SP, claro, porque SS nos indica dnde est ubicado el segmento de pila.

Instruccin POPF Propsito: Extrae las banderas almacenadas en la pila. POPF Este comando transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de banderas. La forma de transferencia es la siguiente: BIT BANDERA 0 CF 2 PF 4 AF

6 ZF 7 SF 8 TF 9 IF 10 DF 11 OF Estas localizaciones son las mismas para el comando PUSHF Una vez hecha la transferencia se incrementa en 2 el registro SP disminuyendo as el tamao de la pila. Instruccin PUSH Propsito: Coloca una palabra en la pila. PUSH La instruccin PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva direccin resultante en el registro recin modificado. El decremento en la direccin se debe a que al agregar valores a la pila sta crece de la direccin mayor a la direccin menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el tamao de la pila en dos bytes, que es la nica cantidad de informacin que puede manejar la pila en cada entrada y salida de datos. Instruccin PUSHF Propsito: Coloca el valor de las banderas en la pila PUSHF Este comando decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de banderas a la pila, en la direccin indicada por SP.

Las banderas quedan almacenadas en memoria en los mismos bits indicados en el comando POPF

Copiar desde y hacia la Pila: PUSH y POP. La instruccin PUSH copia informacin hacia la pila; la instruccin POP saca datos de la pila.Ambos PUSH y POP ocupan un operando de 16-bits. Aqu hay algunos ejemplos:PUSH AXPUSH TABLA[BX]+24PUSH TYPE LISTAPUSH 1024PUSH 0POP DSPOP VALOR La instruccin PUSH copia el operando al tope de la pila. La instruccin POP copia del tope de la pila aun operando, despus de lo cual la siguiente entrada se convierte en la pila. Existen varios usosimportantes para el PUSH y el POP. Primero, los procedimientos pueden pasar informacin de regreso yhacia otros procedimientos por medio de la pila.Aqu est un ejemplo: Digamos que un procedimiento necesita llamar a otro llamado CALCULO.CALCULO requiere cinco valores en orden para ejecutar algunos clculos. En el procedimiento quellama, estos valores son llamados TOTAL; SUBTOTAL, IMP, DESC, y CAMPO. El programa que llama podra meter esos valores en la pila y entonces hacer la llamada a CALCULO:PUSH TOTALPUSH SUBTOTALPUSH IMPPUSH DESCPUSH CAMPO 101 CALL CALCULOEl procedimiento calculo podra extraer sus datos de entrada de la pila apropiadamente. (Estos detalles seexplican en el captulo 12).El segundo uso importante del PUSH y el POP es usar la pila como rea de almacenamiento temporal.Esto es til para almacenar resultados intermedios de clculos complejos o preservar los valores actualesde los registros que de otra forma se perderan.Por ejemplo, las siguientes instrucciones podran usarse para mover el contenido del CAMPO1 y elCAMPO2. (La instruccin MOVSB se explica en el captulo 15).; copiar el contenido del CAMPO1 al CAMPO2LEA SI,CAMPO1LEA DI,CAMPO2MOV CX,LENGTH CAMPO1CLDREP MOVSBInfortunadamente esta secuencia de instrucciones cambia los valores de SI, DI y CX. Y que si estos datoscontienen informacin importante que no debe perderse.La solucin para preservar los valores de DI, SI y CX es meterlos a la pila, despus de que MOV yMOVSB son ejecutadas.; salvar el contenido de SI, DI, CXPUSH SIPUSH DIPUSH CX; copiar el contenido del CAMPO1 al CAMPO2LEA SI,CAMPO1LEA DI,CAMPO2MOV CX,LENGTH CAMPO1CLDREP MOVSB; restaurar los valores de los registros SI, DI, y CXPOP CXPOP DIPOP SI 9.8 Salvar todos los registros: PUSHA y POPA Como puedes ver en el ltimo ejemplo de la seccin previa, algunas veces querrs salvar ms de unregistro. La instruccin PUSHA mete los valores de los siguientes registros a la pila, en el orden en queaparecen:AX CX DX BX SP BP SI DIPUSHA significa push all. Como puedes ver, el nombre est raro porque slo salva 8 de los 14registros. (Los otros registros rara vez necesitan ser salvados). 102 La instruccin POPA restaura los valores de los registros sacndolos de la pila. Siempre que uses unPOPA debes haber usado antes un PUSHA. Aqu hay un ejemplo de la seccin previa:; copiar el contenido de CAMPO1 a CAMPO2PUSHALEA SI,CAMPO1LEA DI,CAMPO2MOV CX,LENGTH CAMPO1CLDREP MOVSBPOPAEs una buena prctica de programacin usar el PUSHA al inicio de

cada procedimiento y POPA al final.Esto asegura que la llamada al procedimiento no causo cambios al programa que llamo.Por supuesto, si un registro va a ser usado para pasar un valor de regreso al procedimiento que llamo,debes asegurarte que la actualizacin del registro est despus de la instruccin POPA. Veamos unejemplo; actualizar los registros y regresar al programa que llamoPOPAMOV AX,VALOR RETSi usasMOV AX,VALOR POPARETEl valor de VALOR ser sobrescrito por la instruccin POPA.Como ltimo punto ya que el registro SP guarda el valor del tope de la pila debemos asegurarnos de nomodificar ese registro o estaremos en problemas. 9.9 Salvar el registro de Banderas: PUSHF y POPF El registro de banderas es un registro especial el cual esta dividido en 16 bits donde cada bit estratado como una entidad separada. Estos bits tiene varios usos que sern discutidos en el captulo 10.Por ahora, necesitas comprender que algunas instrucciones tienen un side-effect cambiando algunos deestos bits. As es importante algunas veces que puedas salvar y restaurar el registro de banderas; POPFsaca los valores de la pila y restaura este registro.Salvar el registro de banderas es til cuando quieres prevenir que ciertas instrucciones cambien esos bits.Por ejemplo si adicionas el contenido de AX al contenido de BX usando la instruccin:ADD BX,AX 103 La instruccin ADD modifica algunos de los bits del registro de banderas. si quieres proteger estos bits,todo lo que necesitas hacer es salvar y restaurar ese registro.PUSHFADD BX,AXPOPFSimilarmente, podras proteger el registro de banderas de las instrucciones de un procedimiento llamadoDISPLAY de est manera:PUSHFCALL DISPLAYPOPF

Ejemplo 1
"Ejemplo de como utilizar pilas espero y sirva" Title Pilas stacksg segment para STACK 'stack' db 64 dup (0) stacksg ends codesg segment assume cs:codesg, ss:stacksg main proc far inicio: mov ah,00h mov al,'T' push ax mov al,'S' push ax

mov al,'T' push ax mov al,'I' push ax mov cx,0004h continuar: pop ax mov ah,0eh int 10h loop continuar Fin: mov ah,4ch int 21h main endp codesg ends end main end

Ejemplo2
.model small .stack ;Nos sirve como un almacen (segmento de pila) .data var1 db 5 var2 db 3 .code .startup mov mov add int mov int mov add int mov int mov mov add ah, 02h dl, var1 dl, 30h 21h dl, '+' 21h dl, var2 dl, 30h 21h dl,'=' 21h ah,0h al, var1 al, var2

;feo push AX ;Se guarda en la pila para no perder valores mov dl,ah mov ah, 02h add dl, 30h int 21h pop AX ; Saca todos los valores de la pila mov dl,al add dl,30h mov ah,02h int 21h .exit end