You are on page 1of 7

Ayudanta Assembly x86 21 de septiembre de 2005 Sebastin Echeverra Conceptos Previos - Tamaos: 8 bits = 1 byte 16 bits = 2 byte = 1 word

d 32 bits = 4 byte = 1 double word (o long word) - Terminologa: Assembly: lenguage de bajo nivel, cercano a lenguaje de mquina pero en texto. Assembler: programa que transforma un programa en assembly a lenguaje de mquina (compilador de assembly). Muchas veces se suele usar el trmino assembler para el lenguaje assembly, aunque no sea lo correcto.

I Registros - Diagrama Registros Pre-386

1) Registros de x86 (post-386) Todos aumentaron de 16 a 32 bits, menos los de segmento (CS, SS, DS, ES). a) Generales: Tienen funciones asignadas, pero pueden ser usados indistintamente dentro del programa. 1. EAX (AX; AH-AL) acumulador 2. EBX (BX; BH-BL) base 3. ECX (CX; CH-CL) contador 4. EDX (DX; DH-DL) datos

b) De Direccin o ndices:

5. ESP (SP) top del stack (SS:ESP) 6. EBP (BP) base del stack (SS:EBP) 7. ESI (SI) ndice de origen, offset en segmento de datos de origen, uso de strings 8. EDI (DI) ndice de destino, offset en segmento de datos de destino, uso de strings c) De Segmento (para direccin de memoria): Todos indican segmentos para near mode. 9. CS (de codigo) indica el segmento donde estn las instrucciones (instr. sgte: CS:EIP) 10. DS (de datos) indica el segmento donde estn las variables (DS:SI o DS:DI) 11. SS (de stack) indica el segmento donde est el stack (stack: SS:ESP y SS:EBP) 12. ES (de strings o general) para segmentos definidos por usuario (string: ES:EDI) 13. FS para segmentos definidos por usuario 14. GS para segmentos definidos por usuario d) Instrucciones y Flags: 15. EIP (IP) - instruction pointer (CS:EIP) 16. Eflags 2) Usabilidad de los Registros - Uso General: EAX, EBX, ECX, EDX, ESI, EDI: se usan directamente. ES, FS, GS: se pueden cargar directamente para varios segmentos. - Uso en Caso Especial: DS: se puede usar si se devuelve tras usarlo, y no se usan variables mientras. SS: se puede cargar stack directamente, no muy recomendado. ESP, EBP: mejor no usarlos, a menos que se quiera modificar el stack directamente. - No Usables Directamente: EIP, CS, EFLAGS: no se cargan directamente.

3) Relacin Entre Segmentos y Registros Base Una direccin efectiva est compuesta por un segmento (bloque) y un offset (lugar en el bloque). Dir = SEG:OFFS. El clculo de una direccin real se obtiene as: Dir = Segmento*16 + Offset o Dir = Segmento*10h +Offset Un ejemplo para obtener la direccin real de la siguiente instruccin, que est en CS:IP: CS= 3701h IP= 0100h 10h*CS = 37010 h + IP = 0100 h D.Eff. = 37110 h
Registro Segmento DS SS ES CS Registro Offset EAX, EBX, ECX, ESI, EDI EBP, ESP EDI (instrucciones de strings) EIP

4) Resumen Registros
Tipo Generales Nombre Registro EAX EBX ECX EDX ESP EBP ESI EDI CS DS SS ES FS GS EIP EFlags Tamao (bits) 32 32 32 32 32 32 32 32 16 16 16 16 16 16 32 32 Funcin Uso general Uso general y base para direcciones Uso general Uso general Top del stack (SS: ESP) Base del stack (SS:EBP) Offset de origen de strings Offset de destino de strings Segmento de cdigo Segmento de datos Segmento del stack Segmentos extra Segmentos extra Segmentos extra Direccin de la siguiente intruc. Indican estado ltima operacin Modificable s s s s no recomendable no recomendable s s no no recomendable no recomendable s s s no no

Direcciones o ndices

Segmento

Instruccin Flags

II Lenguaje Assembly 1) Estructura Programa Assembly .MODEL small .STACK 200h ; Indica el tipo de programa que es, valores dependen de ; assembler ; Inicializa Stack en dir. indicada, necesario si se usar stack ; (push o pop por ejemplo). Puede no indicarse 200h y ; se asigna direccin automticamente (ie, .STACK).

.DATA

; Indica zona de datos, OPCIONAL (algunos assemblers usan DATASEG)

; Aqu se definen variables y datos .CODE ; Indica inicio zona de cdigo (algunos assemblers usan CODESEG)

; Aqu viene el cdigo, particularmente subrutinas o procedimientos START: ; Label que indica inicio del main del programa

; Aqu est el cdigo del main END START 2) Declaracin Variables Se realiza dentro de la zona .DATA. La sintaxis es la siguiente: <nombrevariable> <tamao_datos> <valor> Donde: Ej: var1 unArreglo unString db dw db 3 2,12,8,108 hola a todos$ nombrevariable: corresponde a un nombre con caracteres y nmeros (ej: var1). tamao_datos: corresponde a un indicador del tamao de l o los datos siguientes. Puede ser: db (byte), dw (word = 2 bytes), dd (double word = 4 bytes). valor: corresponde al valor que se le asigna a la variable. Puede ser un nmero, un string, o varios separados por comas (un arreglo).

; Strings van terminados por $

Para obtener la direccin donde qued la variable, se usa OFFSET para obtene el offset, y SEGMENT para el segmento. Ej: MOV DX, OFFSET var1

3) Direccionamiento Forma de referirse a los operandos de una instruccin. - Implcito: no se especifica operando (ej: PUSHA). - Inmediato: entrega el dato explcitamente (ej: el n 14 en ADD EAX, 14). - Registro: la instruccin menciona el registro (ej: el n 14 en ADD EAX, EBX). - Memoria: se usan [x] para obtener el valor de la memoria indicado por x. Puede ser directo, indirecto, relativo a base, directo indexado o la combinacin de todas. - Directo: MOV BX,[0400h], el valor en la la direccin 0400h. - Indirecto: MOV AX,[BX], el valor en la direccin en BX. - Relativo a base: MOV CX,[BX+6], el valor en BX ms 6. - Directo indexado: MOV DH,[SI+0400h], el valor de DH ms 0400h. - Completo (indexado a base): la forma general de uso es: Offset: [Base + Index + Directo] Ej: [EBX + ESI + 10h] - I/O: relativo a dispositivo de entrada o salida. 4) Subrutinas, Procedimientos Instrucciones especiales: CALL <label>: llama a la subrutina o procedimiento marcada por label. RET: al final de cada subrutina o procedimiento, retorna a la instruccin siguiente al CALL realizado sobre esa subrutina o procedimiento.

Tanto las subrutinas como los procedimientos van fuera del main, tpicamente dentro del sector .CODE antes de START. La diferencia entre subrutina y procedimiento, adems del formato, es que el procedimiento est hecho como una funcin misma, y la subrutina es simplemente un label que acta simulando ser una funcin. En la prctica, son escencialmente lo mismo, solo que algunos compiladores soportan procedimientos para hacer mas claro que es una funcin, y otros no. Ninguno de los dos tipos respalda los registros antes de ejecutarse. En resumen: basta con usar el formato de subrutina, y siempre funcionar.

a) Formato subrutina:
<label>: ; cdigo RET

Ej:
miRutina: ADD AX, 1 RET

b) Formato procedimiento: Depende del assembler (compilador) que se use. Est por definirse cul se usar en el curso, o si se dejar a libre eleccin. - Formato MASM: <label> PROC ;cdigo RET <label> ENDP Ej:
miProcedimiento PROC ADD AX, 1 RET miProcedimiento ENDP

- Formato TASM: PROC <label> ;cdigo RET ENDP


PROC miProcedimiento ADD AX, 1 RET

ENDP