Professional Documents
Culture Documents
0 1 2 3 4 5 6 7 8 9AB C DE F
101111
Lo separamos en grupos de a 4:
10 | 1111
101 | 111
111 = 7
101 = 5
Ahora que usted conoce las relaciones entre las bases, le será mucho
más fácil leer código assembly, y posiblemente en un futuro próximo,
comenzar a entender qué está leyendo
Se aprende mejor con ejemplos
En DOS
Llamado a la Rutina:
DisplayString:
mov ax,cs
mov ds,ax
mov ah,9 ; Función DOS: mostrar display
int 21h ; Llama la interrupción del DOS
ret
En BIOS
Llamado a la Rutina:
La Rutina:
BiosDisplayString:
bnxtchar:
lodsb ; buscar el próximo carácter a mostrar
push ax ; preservar ax de cualquier cambio
cmp al,'$' ; marca de final de string?
Jz endbprtstr
Pop ax ; restaura ax
Call BiosDisplayChar
Jmp bnxtchar
endbprtstr:
pop ax ; limpiar
ret
Y LOS NUMEROS?
(Código Assembly para mostrar números en cualquier base)
Llamado a la Rutina:
DisplayWord endp
;**********************************************
;
; MODELO DE ARCHIVO EJECUTABLE .COM (COM.ASM)
;
; Compilar con:
;
; TASM COM.ASM
; TLINK /t COM.OBJ
;
; +gthorne'97
;
;**********************************************
.model small
.code
.386
org 100h
;----------------------
MAIN_PROGRAM:
;---------------
; Código de programa
;---------------
;---------------
exit_program:
end start
;**********************************************
;
; MODELO DE ARCHIVO EJECUTABLE.COM #2(COM_B.ASM)
;
; Lo incluimos para poderlo comparar con
; el modelo .EXE mostrado más abajo
;
; Compilar con:
;
; TASM COM_B.ASM
; TLINK /t COM_B.OBJ
;
; +gthorne'97
;
;**********************************************
assume cs:COM_PROG
org 100h
;----------------------
MAIN_PROGRAM:
;---------------
; Código de programa
;---------------
;---------------
exit_program:
COM_PROG ends
end start
;**********************************************
;
; MODELO DE ARCHIVO EJECUTABLE .EXE (EXE.ASM)
;
; Compilar con:
;
; TASM EXE.ASM
; TLINK EXE.OBJ
;
; +gthorne'97
;
;**********************************************
;----------------------
MAIN_PROGRAM:
;---------------
; Código de programa
;---------------
;---------------
exit_program:
EXE_PROG ends
end start
;**********************************************
;
; MODELO DE ARCHIVO EJECUTABLE .EXE 2 (EXE2.ASM)
; (Comparar con el primer modelo .COM)
; Probado con TASM 4.1
; Donado por Eyes22, Modificado para semejarse
; los otros modelos
; Compilar con :
;
; TASM EXE2.ASM
; TLINK EXE2.OBJ
;
; +gthorne'97
;
;**********************************************
.model small
.stack 200h
.data
.code
start: jmp MAIN_PROGRAM
;----------------------
; Zona de datos
;----------------------
;---------------
; Código de programa
;---------------
;---------------
exit_program:
end start
Programas COM:
Hello.asm
.model tiny
.code
org 100h
maine proc
mov ah,9
mov dx, offset helo_msg
int 21h
mov ax, 4c00h
int 21h
maine endp
Desarrollo de programas
(Se aplica para cualquier lenguaje)
Más Recientemente
En la tierra del sentido común
(El cual tiende a no ser tan común...)
Qué es IPO?
Del Inglés: INPUT - PROCESS - OUTPUT
En castellano: ENTRADA - PROCESO - SALIDA
Comienzos en Assembly
Primero necesito que usted comprenda qué son los registros (las hiper-
rápidas variables construidas dentro del procesador x86 de su PC).
o más simplemente:
No he mencionado aún que los datos deben separarse del código para
evitar ser ejecutados. Si pone atención en los modelos de programas
.COM y .EXE vistos un par de capítulos antes, verá que en ellos hay
una zona para datos y otra para código ejecutable. La primera
sentencia del programa hace un salto por sobre la zona de datos para
que el nunca se confundan con instrucciones de máquina.
Cada uno de estos registros tiene 16 bits (dos bytes) aunque desde el
80386 en adelante estos registros pasan a ser de 32 bits y a llamarse
EAX, EBX, etc (aunque sigue siendo válido referirse a la parte baja
del registro como AX, o a los más pequeños AH y AL -por high y low).
Los virus (otra vez usando estas bestias como ejemplo) tienden a usar
bastante instrucciones que cambian al IP de manera no convencional.
Los encabezados de archivos .EXE informan al DOS cuál es el
segmento de arranque de código (que debe cargarse en CS) y cuál es la
dirección de la primera instrucción a ejecutar (que debe cargarse en
IP).
Por lo común los virus de archivos EXE ponen su código al final del
programa y alteran el encabezado de tal forma que los registros CS e
IP apunten a sus instrucciones de inicio, con lo cual logran ejecutarse
antes que cualquier otra instrucción del programa. Luego al final de
su código hacen un salto al inicio del programa (cuya dirección saben
porque la leyeron del encabezamiento antes de cambiarla). Más que
creativo, podría decirse.
-d 80
1788:0080 12 20 6D 61 73 74 65 72 - 20 67 72 65 79 74 68 6F
1788:0090 72 6E 65 0D ...............
Lo que estamos viendo es la parte del PSP que DOS crea para correr el
programa MODE.COM, en donde se almacenan los parámetros que el
usuario ingresa en la línea de comandos. Los valores son todos hexa y
el primer 12 indica que el largo de la línea de comandos es 18
caracteres (=12h), la que comienza con 20h (código ASCII del espacio
que separa el nombre del programa cargado MODE.COM del primer
parámetro). Notar además que finaliza con 0Dh, que es el ASCII para
el retorno de línea, pero que ese caracter no se cuenta entre los 12h de
largo. También sobre la derecha de la ventana DOS verá el texto que
ha escrito como parámetro. Los caracteres más allá del 0Dh no tienen
ninguna importancia. No olvide que para salir de debug se utiliza el
comando "q".
Ante todo, insistamos sobre los comentarios, todo aquello que sigue al
punto y coma en cada línea, que son muy útiles y que el compilador los
ignora. Note además que la convención del punto y coma iniciando un
comentario es para los assemblers, pero no intente comentar así una
porción en lenguaje assembly de un programa C: el compilador C/C++
interpreta el símbolo ";" de manera distinta al assembler.
;**********************************************
;
; .COM Modelo de archivo de programa (COM.ASM)
;
; Compilar con:
;
; TASM COM.ASM
; TLINK /t COM.OBJ
;
; +gthorne'97
;
;**********************************************
.model small
.code
.386
org 100h
MAIN_PROGRAM:
EXIT_PROGRAM:
end start
Primero veamos dos líneas que son muy útiles y que muestran cómo
obtener un caracter del teclado. En esta versión, el se examina el teclado
hasta que el usuario apriete una tecla.
mov ah,08h ; DOS función 08h, esperar que el usuario apriete una
int 21h ; tecla.
;**********************************************
;
; KEYPRESS.ASM
; Nuestro primer programa interactivo
;
; Compilar con:
;
; TASM KEYPRESS.ASM
; TLINK /t KEYPRESS.OBJ
;
; +gthorne'97
;
;**********************************************
.model small
.code
.386
org 100h
;----------------------datos-------------------
PressEnter db 0Dh,0Ah,'$'
;----------------------código------------------
MAIN_PROGRAM:
end start
Es usual que se establezca un lazo infinito del que sólo se sale en un caso
especial o cuando se ingresa determinado código. En nuestro caso,
aceptaremos como teclas válidas una "Y" o una "N" tanto en mayúscula
como en minúscula.
; el código va aqui
Lo que necesitamos ahora es saber cómo se sale del lazo (la lógica que
nos lleva al rótulo GO_ON_WITH_PROGRAM). Debemos poder decirle
que si se obtuvo una tecla válida que salga del lazo. Para esto,
disponemos de la función CMP (comparar), que evalúa dos variables y
prende o apaga flags según sean iguales o una mayor que la otra (pero no
modifica a ninguna de las variables).
CMP BL,'Y'
CMP BL, 89
START_OF_LOOP:
;**********************************************
;
; KEYPRESS.ASM
; Nuestro primer programa interactivo
;
; Compilar con:
;
; TASM KEYPRESS.ASM
; TLINK /t KEYPRESS.OBJ
;
; +gthorne'97
;
;**********************************************
.model small
.code
.386
org 100h
;----------------------
;----------------------
MAIN_PROGRAM:
START_OF_ENDLESS_LOOP:
JMP START_OF_ENDLESS_LOOP
GO_ON_WITH_PROGRAM:
end start
Desarrollo de Aplicaciones
Recientemente me preguntador cómo crear grandes programas. Hay
algunos trucos para hacerlo. En la segunda parte haremos una revisión
para hacer que nuestros programas sean modulares.
;***********
;***********
---------------
Modularidad:
endp PrintLine
Loop:
inc ah
cmp ah, 092h
jne Loop
ret
endp CompareByte
;----------------------
Loop:
inc ax
cmp ax, 02942h
jne Loop
ret
endp CompareWord
;----------------------
CmpByteLoop1:
inc ah
cmp ah, 092h
jne CmpByteLoop1
ret
endp CompareByte
;----------------------
CompareWordLoop1:
inc ax
cmp ax, 02942h
jne CompareWordLoop1
ret
endp CompareWord
;----------------------
;----------------------
ideal
assume cs:COM_PROG
org 100h
start:
;----------------------
proc PrintLine
endp PrintLine
@@Loop:
inc ah
cmp ah, 092h
jne @@Loop
ret
endp CompareByte
;----------------------
proc CompareWord
@@Loop:
inc ax
cmp ax, 02942h
jne @@Loop
ret
endp CompareWord
;----------------------
; entrada
call input
call process
call output
; salida
.model small
.code
.386
ideal
org 100h
endp PrintString
;----------------------
endp PrintChar
;----------------------
endp CopyRight
;----------------------
@@Loop:
@@Done:
endp GetInput
;----------------------
MAIN_PROGRAM:
;-----------------------
end start
------------------------------------------------------