Article View: es.comp.cracks
Article #93108CASM - Curso de Ensamblador por Wintermute - Leccion 4.
From: scottex
Date: Sun, 12 Dec 1999 00:00
Date: Sun, 12 Dec 1999 00:00
300 lines
16235 bytes
16235 bytes
---------------------------------------------------
8.- La Pila
---------------------------------------------------
Para explicar �sta parte, voy a hacerlo lo m�s mundanamente posible y
sin mucho t�rmino complicado, porque las explicaciones muchas veces suelen
liar m�s sobre una cosa tan sencilla como es �sto.
La pila es una especie de "almac�n de variables" que se encuentra en una
direcci�n determinada de memoria, direcci�n que viene indicada por SS:SP,
como mencion� antes, registros que son SS de segmento de pila y SP de
Offset de �sta.
Entonces nos encontramos con dos �rdenes b�sicas respecto a la pila, que
son PUSH y POP. La �rden PUSH empuja una variable a la pila, y la �rden POP
la saca. Sin embargo, no podemos sacar el que queramos, no podemos decir
"quiero sacar el valor de DX que he metido antes y que fue el cuarto que
met�", por ejemplo.
La estructura de la pila se denomina LIFO, siglas inglesas que indican
'Last In First Out'. Esto significa que al hacer un POP, se sacar� el
�ltimo valor introducido en la pila. Vamos con unos ejemplitos majos:
PUSH DX ; Mete en la pila el contenido de DX
PUSH CX ; Y ahora el contenido de CX
POP AX ; Ahora saca el �ltimo valor introducido ( CX )
;y lo coloca en AX.
POP BP ; Y ahora saca en valor anterior introducido, que
;es el contenido de DX cuando hicimos el PUSH DX
;y se lo asigna a BP.
Ahora, una rutina algo m�s detallada:
MOV DX,0301h ; DX vale ahora 0301 hexadecimal.
PUSH DX ; Empuja DX a la pila. SP se decrementa en dos.
MOV DX,044C4h ; Ahora DX vale 044C4h
POP CX ; Y con �sto, CX vale 0301 hexadecimal, el valor
;que hab�amos introducido con anterioridad.
Dije en la segunda l�nea: SP se decrementa en dos. Cuando por ejemplo
ejecutamos un .COM, SS es el segmento del programa ( o sea, igual que CS,
y si no han sido modificados, DS y ES ), y SP apunta al final, a 0FFFFh.
Cuando empujamos un valor a la pila, SP se decrementa en dos apuntando a
0FFFDh, y en �sta direcci�n queda el valor introducido. Cuando lo saquemos,
se incrementar� de nuevo en dos el valor de SP, y el valor se sacar� de
la pila.
Se puede operar con �sta instrucci�n con los registros AX, BX, CX, DX,
SI, DI, BP, SP, CS, DS y ES, sin embargo no se puede hacer un POP CS, tan
s�lo empujarlo a la pila.
He aqu� un ejemplo de lo que hace en realidad un POP en t�rminos de MOVs,
aunque sea un gasto in�til de c�digo, tiene su aplicaci�n por ejemplo para
saltarse la heur�stica en un antivirus, que busca un POP BP y SUB posterior,
bueno, supongo que ya aprender�is a aplicarlo cuando ve�is el curso de
virus/antivirus:
Partamos de que hay cierto valor en la pila que queremos sacar.
MOV BP,SP ; Ahora BP es igual al offset al que apunta SP
MOV BP,Word ptr [BP] ; Y ahora BP vale el contenido del offset al
;que apunta, que al ser el offset al que apunta
;el de pila, ser� el valor que sacar�amos
;haciendo un POP BP.
ADD SP,2 ; Para acabarlo, sumamos dos al valor de offset
;de la pila.
Y �sto es lo que hace un POP BP, s�mplemente. Para ver lo que hace un PUSH
no habr�a m�s que invertir el proceso, lo pongo aqu�, pero ser�a un buen
ejercicio que lo intent�rais hacer sin mirarlo y luego lo consult�rais, por
ejemplo introduciendo DX a la pila.
SUB SP,2
MOV BP,SP
MOV Word ptr[BP],DX
Como �ltima recomendaci�n, hay que tener bastante cuidado con los PUSH
y POP, sacar tantos valores de la pila como se metan, y estar pendiente de
que lo que se saca es lo que se tiene que sacar. La pila bien aprovechada
es fundamental para hacer programas bien optimizados, ya que entre otras
cosas las instrucciones PUSH y POP s�lo ocupan un byte.
Es por ejemplo mucho mejor usar un PUSH al principio y un POP al final
en vez de dejar partes de c�digo para almacenar variables, m�s velocidad
y menos tama�o.
Y finalmente, hay otras dos �rdenes interesantes respecto a la pila,
PUSHF y POPF, que empujan el registro ( 16 bits ) de flags y lo sacan,
respectivamente
---------------------------------------------------
8.1.- La Orden CALL
---------------------------------------------------
Se trata de una �rden que se utiliza para llamar a subrutinas, y est�
relacionada con la pila, por lo que la incluyo en �sta lecci�n del curso.
La sintaxis del Call es casi la de un Jmp, pudi�ndose tambi�n utilizar
etiquetas, direcciones inmediatas o registros. Si compar�semos un Jmp con
un 'GOTO', el Call ser�a el 'GOSUB'. Es una instrucci�n que nos va a servir
para llamar a subrutinas.
Su forma de actuaci�n es sencilla. Empuja a la pila los valores de CS e
IP ( o sea, los del punto en el que est� en ese momento el programa ),
aunque IP aumentado en el tama�o del call para apuntar a la siguiente
instrucci�n, y hace un salto a la direcci�n indicada. Cuando encuentre una
instrucci�n RET, sacar� CS e IP de la pila, y as� retornar� al lugar de
origen. Veamos un ejemplo:
xor ax,ax ; Ax vale ahora 0
Call quebi�n ; Mete CS e IP a la pila y salta a quebi�n
Int 20h ; �sta �rden sale al dos, explicar� todo �sto
;en el pr�ximo cap�tulo, s�lo que sep�is eso
quebi�n: mov ax,30h
Ret ; Vuelve a la instrucci�n siguiente al punto
;de llamada, o sea, a la de "INT 20h"
La �rden RET puede tener tambi�n varios formatos: RETN o RETF, seg�n se
retorne desde un sitio cercano ( RETN, near ) o lejano ( RETF, far ). No
obstante, pr�cticamente no lo usaremos, la mayor�a de las veces se quedar�
en RET y punto.
Existe entonces la llamada directa cercana, en la que s�lo se introduce
IP ( l�gicamente, apuntando a la �rden siguiente al Call ), y al retornar,
lo hace en el mismo segmento, y la llamada directa lejana, en la que se
introducen CS e IP ( y luego se sacan, claro ). A veces se podr�an producir
confusiones, con lo que quiz� pueda ser conveniente usar RETN y RETF
respectivamente.
Y el pr�ximo cap�tulo empezamos con interrupciones,... venga, que ya
queda menos para poder programar ;-)
---------------------------------------------------
9.- Interrupciones
---------------------------------------------------
A �stas alturas del curso estar�is diciendo: bueno, vale, he aprendido
a mover registros, a meterlos en la pila, etc,... � pero c�mo act�o con
el exterior ?. Porque por mucho registro que tenga no voy a escribir por
ejemplo un car�cter en la pantalla. Bieeeeeen, pues aqu� est�, son las
interrupciones.
La primera cosa que tenemos que hacer es saber como funcionan las
interrupciones. Son principalmente subrutinas de la BIOS o el DOS que
pueden ser llamadas por un programa, por ejemplo la funci�n 21h est�
dedicada especialmente a tratamiento de archivos.
Para utilizarlas, tendremos que poner los registros con un determinado
valor para que se realice el prop�sito que buscamos. Cada interrupci�n
tiene varias funciones, y podremos elegir cual ejecutamos seg�n el valor
de AH.
El formato de la �rden es INT X, donde X puede ir desde 1 a 255 ( aunque
normalmente se escribe en formato hexadecimal ).
Cuando se ejecuta una interrupci�n, el ordenador empuja todos los flags
a la pila, un 'PUSHF', y despu�s mira en la tabla de vectores de
interrupci�n, de la que hablar� m�s adelante, para transferir el control
del programa al punto que indica esa tabla respecto a la interrupci�n
pedida mediante un 'CALL'. Cuando la interrupci�n ha terminado, acabar� con
un IRET, que es una combinaci�n entre 'POPF' y 'RET'.
La tabla de Vectores de Interrupci�n es una tabla de direcciones para
la direcci�n a la que debe saltar cada interrupci�n. Comienza en la
direcci�n de memoria 0000:0000 y acaba en la 0000:0400, siendo cada
direcci�n de 4 bytes de longitud. Para averiguar cual corresponde a cada
interrupci�n, no hay m�s que multiplicar el n�mero de interrupci�n por
cuatro. Por ejemplo, la direcci�n de memoria donde est� el punto al que
salta una INT 21h, es 0000:21h*4. Ah� se contienen el CS e IP a los que
saltar� el programa cuando se ejecute la interrupci�n. Estos valores, son
modificables, pero hay que tener mucho cuidado con ello.
Y ahora voy a ponerme algo m�s mundano, si no hab�is entendido �sto al
menos saber 'qu� hace', quiz� as� adem�s los que os hay�is perdido pod�is
retornar m�s adelante. Vamos con un ejemplo de uso de una interrupci�n:
jmp mesaltomsg ; Esto lo hago porque ejecutar el texto
;puede traer consecuencias imprevisibles
archivo: db 'c:\command.com',0 ; el 0 que va despu�s es necesario
; en operaciones con archivos, o no
; funcionar�.
mesaltomsg: mov ax,4100h ; Al ir a llamar a la interrupci�n, AH
;( que aqu� es 41h ), indica la funci�n
;de dicha interrupci�n que se quiere
;ejecutar. En �ste caso es la 41h, que
;significa borrar un fichero
mov dx,OFFSET archivo ; En dx cargamos la direcci�n del
;offset con la etiqueta archivo,
;o sea, si la etiqueta archivo est�
;en :0014h, ese ser� ahora el valor
;de DX. Como vemos, no s�lo basta
;con tener AX actualizado para poder
;usar la interrupci�n.
Int 21h ; Ejecutamos la interrupci�n 21h en
;su funci�n 41h, borrar un fichero.
Voy a detallar un poco m�s, � por qu� en dx pongo la direcci�n del offset
de archivo ?. Porque la funci�n de la Int21h que busco necesita par�metros.
Cuando AH vale 41h, funci�n de borrar fichero, necesita ciertos par�metros,
y �sto es que en DS:DX se encuentre la cadena de caracteres que indica el
fichero a buscar.
Como DS vale lo mismo que CS si no lo hemos cambiado, tan s�lo hace
falta hacer que DX apunte al lugar donde est� la cadena de caracteres con
el nombre del archivo.
Vamos con otro ejemplo. Ahora, queremos cambiar el nombre de un fichero.
La interrupci�n para ello es la 21h, y la funci�n que queremos es la 56h,
con lo que en AH tendremos que poner ese valor.
El par DS:DX, es la direcci�n de la cadena que contiene la unidad, camino
y nombre del fichero, tal y como suced�a en el anterior ejemplo, y ES:DI
la direcci�n de la cadena que contiene la nueva unidad, camino y nombre.
Vamos con el programa:
Mov ah,56h ; No hace falta inicializar al, como
;hicimos antes, no tiene ninguna
;importancia su contenido.
Mov dx,OFFSET anterior ; Ds ya est� apuntando a �ste segmento,
;s�lo tendremos que asignar Dx
Mov di,OFFSET posterior ; Di apunta al nuevo nombre, Es no ha
;sido variado de ninguna manera.
Int 21h ; Si en �ste directorio de halla el
;archivo de DS:DX, cambia su nombre al
;de ES:DI
Int 20h ; Devuelve el control al Ms-dos.
anterior: db 'berilio.com',0
posterior: db 'magnesio.com',0
En resumen, cambiar� el nombre del archivo berilio.com a magnesio.com
si �ste se encuentra en el directorio.
Hay innumerables cosas que se pueden hacer con las interrupciones:
escribir textos, leer del teclado, cambiar modos de pantalla, escribir
en archivos, leerlos, ejecutarlos,... demasiado para ponerlo aqu�, aunque
al final del curso os podr�is encontrar m�s ejemplos.
Recomiendo tener a mano la lista de interrupciones de Ralf Brown, que
es una aut�ntica biblia de las interrupciones, o las gu�as Norton. El caso
es que es imposible sab�rselas de memoria, y es mejor tener una buena
obra de consulta al lado. La lista de interrupciones de Ralf Brown es
f�cil de encontrar, y ocupa cerca de un disco completo, con largos archivos
de texto, y se actualiza de vez en cuando.
Para dar una idea en general y que sep�is c�mo buscar lo que necesit�is,
aqu� est�n las interrupciones que m�s se usan y sus funciones en general,
s�mplemente para orientaros al buscar.
Interrupci�n 21h: Apuesto a que es la que m�s utilizar�is, con ella se
consigue el acceso a la fecha y hora del sistema, gesti�n de ficheros,
funciones de dos referidas al disco, para la gesti�n de directorios, y
algunas de lectura/escritura en el teclado y pantalla, adem�s de la gesti�n
de la memoria.
Interrupci�n 13h: Funciones de BIOS que se refieren al disco.
Interrupci�n 10h: Gesti�n de la pantalla en modo alfanum�rico, gesti�n
de la pantalla en modo gr�fico.
Interrupciones 25h y 26h: Funciones de dos de acceso directo al disco,
escribir y leer sectores...
Interrupci�n 17h: Impresora.
--
Nota: Todas las lecciones de este curso son a nivel te�rico. Durante este curso y los dem�s
intentar� buscar alg�n sitio web con lecciones pr�cticas (aunque sea en ingl�s) y alg�n buen
ensamblador para windows. Si encuentro esto tratar� de explicarlas de forma simplificada y
adaptarlas un poco al curso de COC. Por ello agradecer�a much�simo el env�o de direcciones con
informaci�n de este tipo. Gracias a todos.
Un Saludo a todos y �Que aproveche!
________________________________________________________________
Curso de ensamblador por Wintermute.
Posteado en es.comp.cracks por Scottex (scottex@diploma.com)
________________________________________________________________
Redactado el verano de 1996 en Madrid, Espa�a, para la bbs Edison's
Temple, y presentado en ese tiempo en las �reas de correo de �sta...
pisando mi modestia, he recibido muchos agradecimientos y dicen que est�
muy majo, as� que si ten�is el disco duro lleno de tutoriales de Asm en
ingl�s de los que no ten�is ni papa,... se os acab� la suerte amigos, a
aprender !!
Wintermute
--
Scottex -> �No te quedes sin �l! ;)
Technical Details
Message-ID:
<2ia75ssvc6tjglvqh7b554982ftb3866m9@4ax.com>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f84e7,34d84c376ba3172b,start X-Google-Attributes: gidf84e7,public From: scottex@diploma.com Subject: CASM - Curso de Ensamblador por Wintermute - Leccion 4. Date: 1999/12/12 Message-ID: <2ia75ssvc6tjglvqh7b554982ftb3866m9@4ax.com> X-Deja-AN: 559818752 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=ISO-8859-1 X-Complaints-To: abuse@uni2.es X-Trace: m2newsread.uni2.es 945032730 62.36.40.135 (Sun, 12 Dec 1999 22:05:30 MET) Organization: Wanadoo MIME-Version: 1.0 Reply-To: scottex@diploma.com NNTP-Posting-Date: Sun, 12 Dec 1999 22:05:30 MET Newsgroups: es.comp.cracks