Professional Documents
Culture Documents
Karina Solano
Ma.Dolores Defàz
INTRODUCCIÓN
Los ensambladores son programas que procesan los enunciados del programa origen
en lenguaje ensamblador y los traducen en archivos en lenguaje máquina que son
ejecutados por un microprocesador o un micro controlador.
Los ensambladores permiten que los programas origen se escriban y se editen en una
computadora para generar un código ejecutable en otra computadora. El archivo en
lenguaje objeto ejecutable resultante se carga y se ejecuta en el sistema destino.
Directivas:
Seguimos con nuestro mini-curso de asm. Hoy vamos a hablar de los registros y el
conjunto de instrucciones “básicas”. Sé que va a ser un poco latazo, pero no tenemos
más remedio hacerlo.
REGISTROS
Ya dijimos en su momento que, para que nos entendamos, los registros son como
nuestras “variables nativas”.
eax (accumulation register): cuando llamamos a una función del sistema, el código de
retorno va normalmente en eax (0=SUCCESS por lo general).
ebx (base register)
ecx (count register): el contador, usado para manejar strings, bucles ...
edx (data register)
esi, edi (source index, destination index): se suelen usar como punteros para ir
recorriendo strings o zonas de memoria
ebp (base pointer): apunta a la base del stack
esp (stack pointer): apunta al último elemento metido en el stack
Para nosotros, la regla genérica será: preservar el valor de los registros y luego
usarlos para lo que nos de la gana. Nada nos impide usar eax como si fuera el stack
register, siempre y cuando tengamos cuidado de ir actualizando todo.
Aparte, para preservar en su momento la compatibilidad con las CPUs de 16-bits, los
registros de 32-bits se subdividen en partes de 16 y 8 bits, que son las siguientes:
Lo mismo aplicaría a ebx, ecx y edx. Sin embargo, ebp, esp, edi y esi sólo tienen un
subregistro de 16 bits (bp, sp, di y si respectivamente).
Estos flags sirven para meter saltos condicionales en el código, como veremos más
adelante.
INSTRUCCIONES BÁSICAS
xor eax, eax; hace un or exclusivoeax con eax y el resultado lo guarda en eax
xor ebx, eax; hace un or exclusivo de ebx con eax y el resultado lo mete en ebx
push edi; envía el valor de edi al stack, y además el valor de esp baja en 4 para que
apunte al nuevo elemento.
pop edi; mete el contenido del stack en edi y aumenta esp en 4 para que apunte al
valor anterior almacenado en el stack.
Y esta se usa mucha como método rápido de guardar el valor de algún registro:
xchg eax, ebx; intercambia los valores de eax y ebx
La instrucción call, que ya la vimos en el tutorial anterior, lo que hace es enviar al stack
la dirección de retorno, que es la siguiente al call, y saltar a la función. Es decir, estos
dos bloques de instrucciones son equivalentes:
; bloque 1
call eax
retorno:
; bloque 2
push addr retorno
jmp eax
retorno:
Finalmente, la instrucción ret es la que se usa para volver de las llamadas a las
funciones. Lo que hace es leer la dirección a la que tiene que volver del stack y saltar
allí. Es decir, es lo mismo que:
jmp [esp]
add esp, 4
Así mismo, no debemos olvidar que todas estas instrucciones también existen en sus
versiones de 8 y 16 bits (bueno, todas no... pero la mayoría sí). Por ejemplo:
xor al, ah
mov bl, cl
inc cl
mov al, 0x90
Teniendo cuidado de que el tamaño de que el tamaño del origen y el destino sea el
mismo.
Iremos comentando nuevas instrucciones pero sólo conforme vayan saliendo, para
hacer esto un poco más o menos... Con lo visto en este tutorial, tenemos suficiente
más que suficiente para empezar a programar.
EJERCICIOS
bcd el
; resultado
.modeltiny
.stack
.data
Msgdb’Echame los numeros a sumar $'
.code
.startup
movah,09h;interrupcion para imprimir una cadena
leadx,msg;entenemos la dirección de memoria de ms
int 21h ;lee el carácter 1 del número 2
subal,30h ;ajustamos el numero
addbl,al;lo sumamos a las decenas
int 21h ;lee el carácter 2 del número 2
subal,30h ;ajustamos el numero
addcl,al;sumamos a las unidades
addbl,ch;sumamos el acarreo a las decenas
movax,bx;pasamosax para convertir a BCD
movdl,bl;muevo las decenas a dl
adddl,30h ;ajusto las decenas
invokewrite, addrsalt
invokewrite, addr num1 ;mensaje del primer valor
call leer ;lee un número
movEbx,numero;muevo al a bl
invokewrite, addrsalt
invokewrite, addr num2 ;mensaje del segundo valor
call leer ;lee un numero
sub Ebx,numero;sumo bl - al
movnumero,Ebx
invokewrite, addrsalt
invokewrite, addr res ;mensaje del resultado
call mostrar ;muestra el resultado
callreadc ;espero a que presione tecla
jmp repite
FUENTES DE CONSULTA
*Internet
*Apuntes
BIBLIOGRAFIA
http://www.google.com/search?
hl=es&source=hp&q=introduccion+DE+UN+ENSAMBLADOR&lr=&aq=f&
aqi=&aql=&oq=
http://www.abreojosensamblador.net/html/Pags/Cap20.html
http://www.alegsa.com.ar/Dic/compilador.php
http://www.monografias.com/trabajos11/compil/compil.shtml
http://www.mastermagazine.info/termino/4368.php