Alternativas de programación Enteramente en bajo nivel programa completo librería rutina particular Embebido en alto nivel rutinas librería 1
Alternativas de programación Enteramente en bajo nivel programa completo librería rutina particular Embebido en alto nivel rutinas librería Programa fuente en ensamblador.asm Ensamblador Programa objeto.obj Linkeador Programa ejecutable.com ó.exe 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 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. 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 3
Estructura de un programa No hay una estructura definida de datos de código de código de datos de código de datos de código de código y datos de datos de código de datos Cada bloque representa un segmento diferente dentro del programa de datos Permite definir los símbolos a usar en el programa Permite asociar espacio de almacenamiento a los símbolos <symbol_name> <symbol_type> [<value>] A-Z a-z _ @ $? 0-9 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) nn..nnb n in [0,1] nn..nnd n in [0,9] nn..nn n in [0,9 a,f] 4
Ejemplos de definición de símbolos a DB 5 _dossegptr df aux1 dd 03fc40a8 @aux2_1 dw 1500d bcd1 dt 14fd6a3efc80a602edfa real1 dq 0.31415926E+1 La definición de símbolos siguiente a db 5 b dw 8 c dd 56 d dt 4 p dp genera un espacio de datos de 23 bytes 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 a=0 00 08 b=1 00 00 00 38 c=3 00 00 00 00 00 00 00 00 00 04 d=7 00 00 00 00 00 00 p=17 Contenido del segmento de datos Valor de los símbolos 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 Assembler mov ax, a mov b, al add eax, c sub p, cl Es posible hacer cod. máquina mov ax, [0] mov [1], al add eax, [3] sub [17], cl Definiciones complejas arreglo dw 1, 2, 3, 4, 5 matriz db 1, 2, 3 db 4, 5, 6 db 7, 8, 9 ; define un arreglo de 5 words, inicializado. ; 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 ) string2 db A, B, C, D string3 db ABCD ; define el string AAAAAAAAAA ; define el string ABCD ; igual a string2 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 Definiciones complejas Estructuras Definición Instanciación Astruct struct B db xyz C dw 1 D dd 2 astruct ENDS Reg_a astruct Reg_a astruct? Reg_a astruct {} Reg_a astruct {B= abc, C=5} ; no inicializado ; no inicializado ; valores por defecto ; B y C con nuevos valores, D por defecto 7
Definiciones complejas Uniones (difieren de las estructuras en que sus elementos se superponen unos con otros) Definición Instanciación Aunion union B db xyz C dw 1 D dd 2 aunion ENDS Reg_a aunion Reg_a aunion? Reg_a aunion {} Reg_a aunion {B= abc, C=5} Reg_a aunion {C=5} ; no inicializado ; no inicializado ; inválido ; inválido ; equivalente a dw 5 dw? 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 0?? 1 1 1 1 B=4 C=? D=15 TASM genera internamente: Arec dw (4 SHL 6) + (0 SHL 4) + (15 SHL 0) 8
Pasamos a otra cosa 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 ; valor a acumular mov cx, 10 ; itero 10 veces acum : add bx, ax ; sumo AX con BX loop acum ; si CX <> 0 sigo fin : ret ; retorno 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 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 inicio: mov ax, datos mov ds, ax mov ah, 9 mov dx, OFFSET hello_msg int 21h mov ah, 4ch int 21h codigo ENDS END inicio 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 El programa empieza en la primer instrucción del segmento de código Las 2 primeras intsrucciones son mandatorias para cargar DS con el segmento a usar El programa empieza en el rotulo indicado en la directiva final END 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 ASSUME ds:datos2 mov ax, datos2 mov ds, ax mov ah, b codigo ENDS Si esta cláusula no estuviera TASM arroja un error 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 mov ax, datos2 mov ds, ax mov ah, b codigo ENDS Si esta cláusula no estuviera TASM usará el símbolo b de datos1 en lugar de el de datos2 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 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 12
Modo MASM compacto. MODEL small. STACK 100. DATA hello_msg DB Hola mundo, 13, 10, $.CODE END mov ax, @data mov ds, ax mov ah, 9 mov dx, OFFSET hello_msg int 21h mov ah, 4ch int 21h Modelo de trabajo Tamaño de la pila Segmento de datos Segmento de código Modo MASM compacto Algunas directivas mas comunes.8086 habilita uso del set de inst. del 8086 e inhibe las de 286, 386, 486, etc..386 habilita uso de las inst. adicionales del 386 sin modo protegido P386P habilita uso de las inst. adicionales del 386 con modo protegido.486 habilita uso de las inst. adicionales del 486 sin modo protegido P486P habilita uso de las inst. adicionales del 486 con modo protegido USE16 fuerza el uso de segmentos de 16 bits en 386/486 USE32 fuerza el uso de segmentos de 32 bits en 386/486 CODESEG name inicio de un nuevo segmento de código de nombre name.code name igual al anterior. Modo MASM solamente DATASEG inicio de un nuevo segmento de datos.data igual al anterior. Modo MASM solamente.alpha indica al ensamblador poner los segmentos en el OBJ alfabéticamente.seq indica al ensamblador poner los segmentos en el OBJ en el orden en que aparecen en el fuente 13
Modo MASM compacto Algunas directivas mas comunes ORG exp fuerza el contador de programa a exp en el segmento actual ALIGN pot2 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 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 14
Ejemplo codigo1 SEGMENT code proc1 PROC near... proc1 ENDP proc2 PROC far... proc2 ENDP inicio : call proc1 ; OK call proc2 ; OK codigo1 ENDS codigo2 SEGMENT code inicio2 : call proc1 ; falla call proc2 ; OK codigo2 ENDS Definición de procedimientos Language lang_modif BASIC, FORTRAN, PROLOG, C, CPP, PASCAL NORMAL, WINDOWS, ODDNEAR, ODDFAR Lenguaje: none Basic Fortran Pascal C CPP Prolog orden de argumentos L-R L-R L-R L-R R-L R-L R-L left-right right-left quien limpia proc proc proc proc caller caller caller la pila 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) 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 16
Acceso a los datos... Dado: var1 db? var2 dd 4567 se accede como: mov al, var1 mov al, byte ptr var1 ; en el segmento de datos ; warning, intenta cargar un puntero en AL ; al = contenido de var1 mov al, byte ptr [ds:var1] mov ax, offset var1 mov eax, dword ptr var1 ; al = contenido de var1 ; ax = desplazamiento de var1 ; OJO, carga en EAX 4 bytes empezando desde var1 (var1 y los 3 primeros bytes de var2) Acceso a los datos... Dado: t_var STRUCT a dw 7 b db 5 t_var ENDS 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 ; en el segmento de datos mov cx, offset mi_var.b ; CX = 2, en este caso 17
Rótulos de salto....data rotulo dd? ; defino una variable puntero.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 call un_proc call dword ptr [rotulo] ; 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 ; llamo al procedimiento así ; o así 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) 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 END... ; modo masm por defecto IDEAL... ; modo ideal MASM... ; modo masm Diferencias entre MASM e IDEAL El acceso a símbolos es obligatorio hacerlo como sigue: mov ax, [var] mov ax, OFFSET var ; para cargar en AX el contenido de DS: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 19
Pasos para generar un ejecutable.model small.stack 100h.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 Hello.obj tlink hello; MOV AX,1ADE MOV DS,AX MOV AH,09 MOV DX,0000 INT 21 MOV AH,4C INT 21 tasm /la hello; Hello.map Hello.lst Ejemplos Modo compacto.asm Modo estándar.asm Modo compacto.map Modo compacto.lst Modo compacto.exe Modo estándar.exe 20