Title: Introducci
1Introducción a NASM
M.C.C. Sergio Luis Castillo Valerio Esta
presentación puede reproducirse
libremente siempre que se mantengan estos
derechos de autor.
2Partes de un programa
- Todo programa de bajo nivel se compone de tres
segmentos (o secciones) - Datos (opcional) Contiene la definición y los
valores iniciales de las variables que utiliza
nuestro programa. - Pila (opcional) Reserva memoria para la pila
(stack)? - Código Contiene las instrucciones del programa.
El segmento de código se subdivide en
procedimientos. Debe haber por lo menos un
procedimiento principal.
3Definición de segmentos
- Los segmentos se definen con la directiva
segment. - Sintáxis
- segment nombre tipo
- Donde nombre es el nombre del segmento. Este
nombre es definido por el programador. - Y tipo puede ser data, stack o code.
- Por ejemplo
- segment variables data
4Definición de segmentos
- En nuestros programas definiremos los segmentos
en el orden siguiente - segment pila stack
- segment datos data
- segment programa code
- Cada segmento termina donde inicia el siguiente.
- La etiqueta ..start define el procedimiento
principal dentro del segmento de código.
5Definición de variables
- En el segmento de datos se definen las variables
de nuestro programa. - En ensamblador para definir una variable se
define - Su nombre
- Su tamaño (byte, palabra, doble palabra, etc.)?
- Las directivas db, dw, dd, dq y dt se usan para
definir el tamaño de una variable. y asignarles
un valor inicial.
DB Define byte DW Define Word DD Define
double word dq Define quad word dt Define ten
bytes.
6Reservación de espacio para variables
- En NASM se puede reservar espacio para variables
sin asignar un valor inicial usando la directiva
resx, dónde xb,w,d,q,t - resb reserva un byte.
- resw reserva una palabra.
- resd reserva una doble palabra.
- resq reserva una cuadrúple palabra.
- rest reserva 10 bytes.
7Programa ejemplo
- Programa que suma los primeros 30 enteros.
- Pseudocódigo
Suma 0 i 1 Mientras (i 30) haz
sumasumai i i1 fin_mientras fin.
8Programa ejemplo
AX Suma, BX i segment pila stack Define
segmento de pila resb 256 Reserva 256
bytes segment programa code Define segmento de
código ..start mov ax,0 Suma0 mov bx,1
i 1 mientras1 cmp bx,30 Mientras (bx 30)
haz jg fin_mientras1 add ax,bx
sumasumai inc bx i i 1 jmp
mientras1 fin_mientras1 mov ax,4c00h
fin. int 21h
9Ejercicio 1
- Implementa el siguiente pseudocódigo en
ensamblador
x0 y1 z0 Repite z x y x y y
z Hasta (z gt 1000)?
10Segmento de datos
- Cuando se programa en bajo nivel en la PC en modo
real, nos enfrentamos con algunas características
del MS-DOS. - Una de ellas es el PSP Prefix Segment Program.
- Cuando el MS-DOS carga un ejecutable de tipo EXE,
carga a memoria los segmentos de pila, datos y
código. - Inicializa SS y CS para que apunten a sus
respectivos segmentos.
11PSP
- Crea el PSP, que es un bloque de 256 bytes que
contiene datos e instrucciones que el SO utiliza
para retomar el control del sistema cuando
nuestro programa termine su ejecución. - Inicializa DS para que apunte al PSP, no a
nuestro segmento de datos. - Por tanto, siempre que se utiliza un segmento de
datos es necesario inicializar DS a nuestro
segmento de datos.
12Inicialización de DS
- Para esto, cuando utilicemos un segmento de datos
siempre ejecutaremos las siguientes
instrucciones - MOV AX, Nombre_segmento_datos
- MOV DS,AX
- Esto hace que DS apunte a nuestro segmento de
datos y que podamos accesar los datos que
definamos en nuestro programa.
13Ejercicio 2
- El siguiente algoritmo calcula la raíz cuadrada
aproximada de un número positivo N. Impleméntalo
en ensamblador
Lee(N)? Y N Y Y/2 Repite X
Cociente(N/Y)? X X Y X
Cociente(X/2)? Hasta (ABS(X-Y)
1)? Despliega(X)? Fin.
14(No Transcript)
15Niveles de Acceso en Lenguaje Ensamblador
- La programación de entradas-salidas es el área en
la que el lenguaje ensamblador permite a los
programadores tener gran flexibilidad y potencia. - Un programa en ensamblador puede tener tres
niveles de acceso - Nivel 0 Hardware
- Nivel 1 Funciones del BIOS
- Nivel 2 Funciones del Sistema Operativo.
16Nivel 0 Hardware
- Se requiere la información técnica de referencia
del sistema para programar a este nivel. - Se accesan directamente las áreas de memoria y
los registros de E/S de los periféricos a
programar. - Toda la operación de E/S queda bajo la
responsabilidad del programador.
17Nivel 1 Funciones del BIOS
- El BIOS (Basic Input Output System) ofrece una
serie de funciones básicas de E/S. - Se invocan por medio de Interrupciones de
Software. - Se requiere la información de referencia del BIOS
para poder utilizar estas interrupciones.
18Interrupciones
- Interrupciones de hardware y de software
- Las solicitudes de interrupciones de hardware son
producidas por algún evento de E/S (opresión de
una tecla, recepción de un carácter en el puerto
serie, etc.)? - De ser aceptadas por el procesador, detienen la
ejecución del programa, guardan? el estado del
procesador y lo hacen saltar? a una rutina de
servicio? para atender al evento que produjo la
interrupción.
19Interrupciones
- Una rutina de servicio? es un procedimiento que
ejecuta las instrucciones de E/S necesarias para
atender al dispositivo donde se produjo el
evento. - Una vez atendido el evento, el procesador
recupera su estado inicial y continúa la
ejecución del programa suspendido.
20Solicitud de Interrupción (IRQ)?
- Cada dispositivo de E/S tiene asociado un número
de solicitud de interrupción único (Interrupt
ReQuest) que lo identifica. - Cuando algún evento de E/S produce una solicitud
de interrupción (IRQ), el procesador identifica
esa IRQ y determina si la atiende o no.
21Tabla de Vectores de Interrupción
- En caso de atender una solicitud de interrupción,
el procesador utiliza la IRQ como una especie de
subíndice para buscar en la memoria baja la
dirección de inicio de la rutina de servicio
adecuada para el evento. - Los primeros 1024 bytes de la memoria RAM
(Segmento 0000h) están destinados a la Tabla de
Vectores de Interrupción.
22Tabla de Vectores de Interrupción
- La Tabla de Vectores de Interrupción contiene las
direcciones de inicio de las Rutinas de Servicio
de los dispositivos de E/S del sistema. - Cada entrada de esta Tabla ocupa 4 bytes 2 para
el segmento y 2 para el desplazamiento. - El procesador multiplica por 4 el IRQ y obtiene
la entrada a la tabla que contiene la dirección
de inicio de la rutina de servicio a la que debe
saltar.
23Tabla de Vectores de Interrupción
- Por ejemplo, para la interrupción 10h
- 10h x 4 40h
- En la celdas 040h a 043h están almacenados el
Segmento y el Desplazamiento de la dirección de
inicio de la rutina de servicio para la Int 10h - Para Int 11h
- 11h x 4 44h
- En la celdas 044h a 047h están almacenados el
Segmento y el Desplazamiento de la dirección de
inicio de la rutina de servicio para la Int 11h
24Interrupciones de BIOS(Basic Input Output
System)?
25Interrupciones de BIOS
- Las interrupciones del BIOS son interrupciones de
software que nos proveen de un conjunto de
rutinas para el manejo básico de entradas y
salidas en bajo nivel. - Como toda interrupción de software, se invocan
con la instrucción INT , donde identifica a
la Interrupción. - Aunque el origen es distinto, el procesador
maneja igual los 2 tipos de interrupciones.
26Llamada a las rutinas de BIOS
- Como toda subrutina, la mayoría de las
interrupciones del BIOS requiere que se le
pasen? argumentos. - Estos argumentos se transfieren por medio de los
registros. - Hay varias rutinas de BIOS multifunción.
- En estas rutinas multifunción, la función se
especifica por medio del registro AH.
27Llamada a las rutinas de BIOS
- Por tanto, pasar argumentos a estas
interrupciones equivale a guardar o mover a los
registros indicados en la definición de la
interrupción los valores adecuados para cada
función. - Esta información acerca de cada interrupción, la
función que realizan, sus parámetros de entrada y
sus datos de salida se encuentran en los
manuales de referencia de la IBM PC y compatibles.
28Algunas rutinas de BIOS
- Algunas interrupciones de BIOS son
- Int 5h Copia a la impresora el contenido de la
pantalla en modo texto. - Entrada Ninguna.
- Regresa Nada
- Int 11h Banderas de BIOS del equipo
- Entrada Ninguna
- Regresa AX Palabra de equipo
- La palabra de equipo es un grupo de bits que
definen algunas características como número de
puertos serie y paralelo, número de drives y
otros.
29Algunas rutinas de BIOS
- Int 10h Rutinas de video. Esta es realmente una
familia de rutinas que tienen que ver con el
manejo de la tarjeta de video. - Por ejemplo
- Int 10h/0 Fija el modo de video
- Entrada AH 0, AL No. de modo
- Regresa Nada
- Int 10h/0Ch Dibuja un punto en modo gráfico
- Entrada AH 0Ch, AL Color del punto,
CX Columna, DX Renglón. - Regresa Nada.
30Algunas rutinas de BIOS
- Int 10h/6 Desplaza página activa hacia arriba.
- Entrada AH 6, AL No. de líneas a desplazar
(0 para página completa), CLFila, Esquina
Superior Izquierda, CHColumna, Esq. Sup.
Izquierda, DHFila, Esq. Inferior Derecha,
DLColumna, Esq. Inf. Derecha, BHAtributo a ser
usado. - Regresa Nada.
- Esto ejemplos ilustran muy bien que algunas
funciones requieren más parámetros que otras.
31Uso de rutinas de BIOS
- A manera de ejemplo, presentamos el código
utilizado para limpiar la pantalla utilizando Int
10h/6.
Mov cx,0000h Fila 0, Col 0, esq. Sup.
Izq. Mov dx,184fh Fila 24, Col 79, esq. Inf.
Der. Mov bh,7 Atributo Normal mov al,0
Página completa. Int 10h
Note que es necesario inicializar los registros
adecuados antes de ejecutar la instrucción Int.
De esta manera aseguramos que se pasen los
argumentos adecuados a la rutina de servicio.