🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.cracks
Article #93108

CASM - Curso de Ensamblador por Wintermute - Leccion 4.

#93108
From: scottex
Date: Sun, 12 Dec 1999 00:00
300 lines
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-mail

Show 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