Programación en Ensamblador Ing. Marcelo Tosini - 2001 Alternativas de programación • Enteramente en bajo nivel • programa completo • librería • rutina particular • Embebido en alto nivel • rutinas • librería Programación en Ensamblador Ing. Marcelo Tosini - 2001 1 Alternativas de programación • Enteramente en bajo nivel • programa completo • librería • rutina particular Programa fuente en ensamblador .asm Ensamblador Programa objeto • Embebido en alto nivel • rutinas • librería .obj Linkeador Programa ejecutable .com ó .exe Programación en Ensamblador Ing. Marcelo Tosini - 2001 Alternativas de programación • Enteramente en bajo nivel • programa completo • librería • rutina particular • Embebido en alto nivel • rutinas • librería procedimiento donothing lista de variables cuerpo en ensamblador fin cuerpo principal sentencias alto nivel codigo ensamblador sentencias alto nivel fin cuerpo Programación en Ensamblador Ing. Marcelo Tosini - 2001 2 Primera alternativa Se parte de un texto puramente assembler • MASM : Microsoft assembler parte del paquete Microsoft C • TASM : Turbo assembler provisto con los paquetes Borland C Borland Pascal 3.0 o sup. Programación en Ensamblador Ing. Marcelo Tosini - 2001 Turbo assembler Modos de operación • Modo MASM • Compacto usa comandos breves • Estandar usa comandos completos • Modo IDEAL Permite un estilo de programación similar al alto nivel Como buen competidor de microsoft reconoce programas hechos para MASM Programación en Ensamblador Ing. Marcelo Tosini - 2001 3 Estructura de un programa No hay una estructura definida Bloque de datos Bloque de código Bloque de código Bloque de datos Bloque de código Bloque de datos Bloque de código Bloque de código y datos Bloque de datos Bloque de código Bloque de datos Cada bloque representa un segmento diferente dentro del programa Programación en Ensamblador Ing. Marcelo Tosini - 2001 Bloque de datos • Permite definir los símbolos a usar en el programa • Permite asociar espacio de almacenamiento a los símbolos <symbol_name> A-Z a-z _ @ $ ? 0-9 <symbol_type> DB define byte (1) DW define word (2) DD define double (4) DF, DP define far/pointer (6) DQ define quad word (8) DT define tera word (10) [<value>] nn..nnb n in [0,1] nn..nnd n in [0,9] nn..nn n in [0,9 a,f] Programación en Ensamblador Ing. Marcelo Tosini - 2001 4 Ejemplos de definición de símbolos La definición de símbolos siguiente a DB 5 _dossegptr df a db 5 b dw 8 c dd 56 d dt 4 p dp aux1 dd 03fc40a8 @aux2_1 dw 1500d bcd1 dt 14fd6a3efc80a602edfa real1 dq 0.31415926E+1 genera un espacio de datos de 23 bytes Programación en Ensamblador Ing. Marcelo Tosini - 2001 Diferencia con las variables de alto nivel Un símbolo define una referencia o desplazamiento dentro del área de datos y NO UN REPOSITORIO PARA UN TIPO DE DATOS a db 5 b dw 8 c dd 56 d dt 4 p dp Se ensambla como 05 00 08 00 00 00 38 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 Contenido del segmento de datos a=0 b=1 c=3 d=7 p=17 Valor de los símbolos Programación en Ensamblador Ing. Marcelo Tosini - 2001 5 Diferencia con las variables de alto nivel Dada esta definición de símbolos a db 5 b dw 8 c dd 56 d dt 4 p dp Es posible hacer Assembler mov ax, a mov b, al add eax, c sub p, cl cod. máquina mov ax, [0] mov [1], al add eax, [3] sub [17], cl Programación en Ensamblador Ing. Marcelo Tosini - 2001 Definiciones complejas arreglo dw 1, 2, 3, 4, 5 ; define un arreglo de 5 words, inicializado. matriz db 1, 2, 3 db 4, 5, 6 db 7, 8, 9 ; define una matriz de 3 x 3 bytes. ; inicializada. arreglo_vacio dw 100 DUP(0) ; define un arreglo de 100 words inicializado a 0. string db 10 DUP(‘A’) ; define el string ‘AAAAAAAAAA’ string2 db ‘A’, ’B’, ’C’, ’D’ ; define el string ‘ABCD’ string3 db ‘ABCD’ ; igual a string2 Programación en Ensamblador Ing. Marcelo Tosini - 2001 6 Definiciones complejas string4 db ‘ABCD’, 0dh, 0ah,0 ; define un string con salto de linea al final a db 5 DUP(3 DUP(0), 3 DUP (4)) ; define un arreglo a como sigue 000444000444000444000444000444 b dw 2 DUP(3 DUP(1, 3), 5) define 1, 3, 1, 3, 1, 3, 5, 1, 3, 1, 3, 1, 3, 5 Programación en Ensamblador Ing. Marcelo Tosini - 2001 Definiciones complejas Estructuras Instanciación Definición Astruct struct B db “xyz” C dw 1 D dd 2 astruct ENDS Reg_a astruct ; no inicializado Reg_a astruct ? ; no inicializado Reg_a astruct {} ; valores por defecto Reg_a astruct {B=“abc”, C=5} ; B y C con nuevos valores, D por defecto Programación en Ensamblador Ing. Marcelo Tosini - 2001 7 Definiciones complejas Uniones (difieren de las estructuras en que sus elementos se superponen unos con otros) Instanciación Definición Aunion union B db “xyz” C dw 1 D dd 2 aunion ENDS Reg_a aunion ; no inicializado Reg_a aunion ? ; no inicializado Reg_a aunion {} ; inválido Reg_a aunion {B=“abc”, C=5} ; inválido Reg_a aunion {C=5} ; equivalente a dw 5 dw ? Programación en Ensamblador Ing. Marcelo Tosini - 2001 Definiciones complejas Records (Un tipo de datos record representa una colección de campos de bit) Definición Arec record B : 3=4, C : 2, D : 4=15 Equivale a un registro de 9 bits de la forma: 1 0 B=4 0 ? ? C=? 1 1 1 1 D=15 TASM genera internamente: Arec dw (4 SHL 6) + (0 SHL 4) + (15 SHL 0) Programación en Ensamblador Ing. Marcelo Tosini - 2001 8 Pasamos a otra cosa Programación en Ensamblador Ing. Marcelo Tosini - 2001 Bloque de código Secuencia de líneas de código de 8086 o 80x86 de la forma: [rótulo] : instrucción [; comentario] Ejemplo: inicio : mov ax, 1 mov cx, 10 acum : add bx, ax loop acum fin : ret ; valor a acumular ; itero 10 veces ; sumo AX con BX ; si CX <> 0 sigo ; retorno Programación en Ensamblador Ing. Marcelo Tosini - 2001 9 Modo MASM estandar • Se define la estructura de cada segmento que se va a usar • Tipos de segmentos : pila, datos, código • Formato de un segmento: <name> SEGMENT <alineación> <acceso> <tipo> byte private ‘DATA’ word public ‘CODE’ dword memory ‘STACK’ para virtual page at xxx mempage common Programación en Ensamblador Ing. Marcelo Tosini - 2001 Modo MASM estandar pila SEGMENT PARA ‘stack’ DB 200 DUP(?) pila ENDS datos SEGMENT WORD public ‘data’ hello_msg DB ‘Hola mundo’, 13, 10, ‘$’ datos ENDS codigo SEGMENT WORD public ‘code’ ASSUME cs:codigo, ds:datos • Todo segmento es de la forma name SEGMENT.... Cuerpo name ENDS • La directiva ASSUME indica a TASM en que segmentos debe asumir los selectores de segmento inicio: mov ax, datos mov ds, ax mov ah, 9 mov dx, OFFSET hello_msg int 21h mov ah, 4ch int 21h • El programa empieza en la primer instrucción del segmento de código codigo ENDS END inicio • El programa empieza en el rotulo indicado en la directiva final END • Las 2 primeras intsrucciones son mandatorias para cargar DS con el segmento a usar Programación en Ensamblador Ing. Marcelo Tosini - 2001 10 Modo estandar: otro ejemplo datos1 SEGMENT WORD public ‘data’ a db 5 datos1 ENDS datos2 SEGMENT WORD public ‘data’ b db 5 datos2 ENDS codigo SEGMENT WORD public ‘code’ ASSUME cs:codigo, ds:datos1 mov ax, datos1 mov ds, ax mov ah, a Si esta cláusula no estuviera TASM arroja un error ASSUME ds:datos2 mov ax, datos2 mov ds, ax mov ah, b codigo ENDS Programación en Ensamblador Ing. Marcelo Tosini - 2001 Modo estandar: uso del ASSUME datos1 SEGMENT WORD public ‘data’ a db 5 b db 6 datos1 ENDS datos2 SEGMENT WORD public ‘data’ b db 5 datos2 ENDS codigo SEGMENT WORD public ‘code’ ASSUME cs:codigo, ds:datos1 mov ax, datos1 mov ds, ax mov ah, a ASSUME ds:datos2 Si esta cláusula no estuviera TASM usará el símbolo ‘b’ de datos1 en lugar de el de datos2 mov ax, datos2 mov ds, ax mov ah, b codigo ENDS Programación en Ensamblador Ing. Marcelo Tosini - 2001 11 Grupos de segmentos: directiva DGROUP Datagroup GROUP datos 1, datos2 Combina 2 o mas segmentos en una única entidad lógica de manera que todos ellos pueden ser accedidos relativos a un único registro de segmento datos1 SEGMENT WORD public ‘data’ a db 5 datos1 ENDS datos2 SEGMENT WORD public ‘data’ b db 5 datos2 ENDS codigo SEGMENT WORD public ‘code’ ASSUME cs:codigo, ds:datagroup mov ax, datagroup mov ds, ax mov ah, a mov ah, b codigo ENDS Programación en Ensamblador Ing. Marcelo Tosini - 2001 Segmentos por defecto Modelo CS DS Tiny _TEXT DGROUP Small _TEXT DGROUP Compact _TEXT DGROUP Medium filename_TEXT DGROUP Large filename_TEXT DGROUP Huge filename_TEXT calling_filename_DATA DGROUP GROUP _data, _bss Programación en Ensamblador Ing. Marcelo Tosini - 2001 12 Modo MASM compacto . MODEL small . STACK 100 . DATA hello_msg DB ‘Hola mundo’, 13, 10, ‘$’ Modelo de trabajo Tamaño de la pila Segmento de datos .CODE mov ax, @data mov ds, ax mov ah, 9 mov dx, OFFSET hello_msg int 21h mov ah, 4ch int 21h Segmento de código END Programación en Ensamblador Ing. Marcelo Tosini - 2001 Modo MASM compacto Algunas directivas mas comunes .8086 .386 P386P .486 P486P USE16 USE32 CODESEG name .CODE name DATASEG .DATA .ALPHA .SEQ habilita uso del set de inst. del 8086 e inhibe las de 286, 386, 486, etc. habilita uso de las inst. adicionales del 386 sin modo protegido habilita uso de las inst. adicionales del 386 con modo protegido habilita uso de las inst. adicionales del 486 sin modo protegido habilita uso de las inst. adicionales del 486 con modo protegido fuerza el uso de segmentos de 16 bits en 386/486 fuerza el uso de segmentos de 32 bits en 386/486 inicio de un nuevo segmento de código de nombre name igual al anterior. Modo MASM solamente inicio de un nuevo segmento de datos igual al anterior. Modo MASM solamente indica al ensamblador poner los segmentos en el OBJ alfabéticamente indica al ensamblador poner los segmentos en el OBJ en el orden en que aparecen en el fuente Programación en Ensamblador Ing. Marcelo Tosini - 2001 13 Modo MASM compacto Algunas directivas mas comunes ORG exp ALIGN pot2 :: fuerza el contador de programa a exp en el segmento actual alinea el comienzo del segmento al valor pot2 permite definir labels con ámbito mas alla de los límites del procedimiento en que se define Programación en Ensamblador Ing. Marcelo Tosini - 2001 Definición de procedimientos Sintáxis: name PROC [[lang_modif] lang] [distance] [ARG argument_list] [RETURNS item_list] [LOCAL argument_list] [USES item_list] name ENDP Distance : FAR permite llamar los procedimientos desde fuera del segmento en el que estan definidos NEAR el procedimiento solo es visible dentro del segmento en que esta definido Programación en Ensamblador Ing. Marcelo Tosini - 2001 14 Ejemplo codigo1 SEGMENT ‘code’ proc1 PROC near ................. proc1 ENDP proc2 PROC far ................. proc2 ENDP inicio : call proc1 call proc2 codigo1 ENDS ; OK ; OK codigo2 SEGMENT ‘code’ inicio2 : call proc1 call proc2 codigo2 ENDS ; falla ; OK Programación en Ensamblador Ing. Marcelo Tosini - 2001 Definición de procedimientos Language BASIC, FORTRAN, PROLOG, C, CPP, PASCAL lang_modif NORMAL, WINDOWS, ODDNEAR, ODDFAR Lenguaje: orden de argumentos left-right right-left quien limpia la pila none Basic Fortran Pascal C CPP Prolog L-R L-R L-R L-R R-L R-L R-L proc proc proc proc caller caller caller Programación en Ensamblador Ing. Marcelo Tosini - 2001 15 Argumentos y variables locales ARG argument [, argument]...[=symbol] [RETURNS argument [, argument]...] LOCAL argument [, argument]...[=symbol] argument ::= argname [[count1_exp] : complex_type [: count2_exp]] Complex_type : es el tipo de dato del argumento (byte, word, dword, .....) count2_exp : especifica cuantos items del tipo dado define el argumento ARG tmp:DWORD:4 define un argumento llamado tmp de 4 doble palabras count1_exp : especifica la cantidad de elementos de la variable (arreglo) ARG tmp 3:DWORD:4 tmp es un arreglo de 3 elementos de 4 dwords cada uno symbol : TASM iguala ese símbolo al tamaño total de la lista de argumentos en bytes ARG a:word, b:dword:4, c:byte = d ; d = 20 (debido a la alineación de pila) Programación en Ensamblador Ing. Marcelo Tosini - 2001 Ejemplo Sumar PROC PASCAL far ARG op1:byte:4, op2:byte:4=count RETURNS resul:DWORD LOCAL de_gusto:word mov eax, op1 add eax, op2 mov resul, eax ret count Sumar ENDP BP-2 BP BP+2 BP+6 BP+10 BP+14 De_gusto BP Dir ret op2 op1 resul stack Programación en Ensamblador Ing. Marcelo Tosini - 2001 16 Acceso a los datos... Dado: var1 db ? var2 dd 4567 ; en el segmento de datos se accede como: mov al, var1 ; warning, intenta cargar un puntero en AL mov al, byte ptr var1 ; al = contenido de var1 mov al, byte ptr [ds:var1] ; al = contenido de var1 mov ax, offset var1 ; ax = desplazamiento de var1 mov eax, dword ptr var1 ; OJO, carga en EAX 4 bytes empezando desde var1 (var1 y los 3 primeros bytes de var2) Programación en Ensamblador Ing. Marcelo Tosini - 2001 Acceso a los datos... Dado: t_var STRUCT a dw 7 b db 5 t_var ENDS ; en el segmento de datos mi_var t_var {} se accede como: mov ax, word ptr mi_var.a ; AX = 7 mov bl , byte ptr mi_var.b ; BL = 5 mov cx, offset mi_var.b ; CX = 2, en este caso Programación en Ensamblador Ing. Marcelo Tosini - 2001 17 Rótulos de salto... .DATA rotulo dd ? .CODE un_proc PROC FAR ............. Un_proc ENDP .start mov ax, offset un_proc mov es, seg un_proc mov word ptr rotulo, ax mov word ptr [rotulo+2], es ; defino una variable puntero ; una rutina far tiene dirección de 4 bytes ; comienzo del programa ; guardo en es:ax la dirección de la rutina ; almaceno dicha dirección en rotulo call un_proc ; llamo al procedimiento así call dword ptr [rotulo] ; o así Programación en Ensamblador Ing. Marcelo Tosini - 2001 Modo IDEAL Características • Permite ver el código fuente tal como una expresión o instrucción de alto nivel • Los programas son más claros y sin los trucos del MASM • Adiciona chequeo estricto de tipos a las expresiones (lo que evita la escritura de sentencias confusas o erróneas) Programación en Ensamblador Ing. Marcelo Tosini - 2001 18 Modo IDEAL El cambio entre modo MASM e IDEAL se hace a través de las directivas ‘MASM’ e ‘IDEAL’. La aparición de una de las directivas en el texto cambia automáticamente a dicho modo hasta la aparición de la otra directiva. .CODE .......... ; modo masm por defecto IDEAL .......... ; modo ideal MASM .......... ; modo masm END Programación en Ensamblador Ing. Marcelo Tosini - 2001 Diferencias entre MASM e IDEAL • El acceso a símbolos es obligatorio hacerlo como sigue: mov ax, [var] ; para cargar en AX el contenido de DS:var mov ax, OFFSET var ; para cargar en AX el offset de var • No es necesario poner directivas como WORD PTR o BYTE PTR en una carga mov bl, var ; solo es posible si var es byte, ya que se carga en BL • Las declaraciones de segmentos o procedimientos se invierten para asemejarlas a las de alto nivel SEGMENT datos1 WORD ‘data’ PROC mi_proc Programación en Ensamblador Ing. Marcelo Tosini - 2001 19 Pasos para generar un ejecutable .MODEL small .STACK 100h tlink hello; .DATA hello_msg DB 'Hola mundo', 13, 10, '$' .CODE mov ax, @data mov ds, ax mov ah, 9 mov dx, OFFSET hello_msg int 21h mov ah, 4ch int 21h END MOV AX,1ADE MOV DS,AX MOV AH,09 MOV DX,0000 INT 21 MOV AH,4C INT 21 Hello.obj Hello.map Hello.lst tasm /la hello; Programación en Ensamblador Ing. Marcelo Tosini - 2001 Ejemplos Modo compacto.asm Modo compacto.map Modo estándar.asm Modo compacto.lst Modo compacto.exe Modo estándar.exe Programación en Ensamblador Ing. Marcelo Tosini - 2001 20