You are on page 1of 20

1

ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Alternativas de programacin
Enteramente en bajo nivel
programa completo
librera
rutina particular
Embebido en alto nivel
rutinas
librera
2
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Alternativas de programacin
Enteramente en bajo nivel
programa completo
librera
rutina particular
Embebido en alto nivel
rutinas
librera
Programa fuente en ensamblador
.asm
Ensamblador
Programa objeto
.obj
Linkeador
Programa ejecutable
.com .exe
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Alternativas de programacin
Enteramente en bajo nivel
programa completo
librera
rutina particular
Embebido en alto nivel
rutinas
librera
procedimiento donothing
lista de variables
cuerpo en ensamblador
fin
cuerpo principal
sentencias alto nivel
codigo ensamblador
sentencias alto nivel
fin cuerpo
3
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Primera alternativa
MASM: Microsoft assembler
parte del paquete Microsoft C
TASM: Turbo assembler
provisto con los paquetes
Borland C
BorlandPascal 3.0 o sup.
Se parte de un texto puramente assembler
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Turbo assembler
Como buen competidor de microsoft reconoce programas hechos para MASM
Modos de operacin
Modo MASM
Compacto
usa comandos breves
Estandar
usa comandos completos
Modo IDEAL
Permite un estilo de programacin similar al alto nivel
4
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Estructura de un programa
No hay una estructura definida
Bloque
de cdigo
Bloque
de datos
Bloque
de cdigo
Bloque
de datos
Bloque
de cdigo
Bloque
de datos
Bloque
de cdigo
Bloque
de
cdigo
y
datos
Bloque
de datos
Bloque
de cdigo
Bloque
de datos
Cada bloque representa un segmento diferente dentro del programa
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Bloque de datos
Permite definir los smbolos a usar en el programa
Permite asociar espacio de almacenamiento a los smbolos
<symbol_name> <symbol_type> [<value>]
A-Z
a-z
_
@
$
?
0-9
DB definebyte(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]
5
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Ejemplos de definicin de smbolos
a DB 5
_dossegptr df
aux1 dd 03fc40a8
@aux2_1 dw 1500d
bcd1 dt 14fd6a3efc80a602edfa
real1 dq 0.31415926E+1
La definicin de smbolos siguiente
a db 5
b dw 8
c dd 56
d dt 4
p dp
genera un espacio de datos de
23bytes
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Diferencia con las variables de alto nivel
Un smbolo define una referencia o desplazamiento dentro del
rea de datos y NO UN REPOSITORIO PARA UN TIPO DE
DATOS
a db5
b dw8
c dd56
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
smbolos
6
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Diferencia con las variables de alto nivel
a db5
b dw8
c dd56
d dt 4
p dp
Dada esta definicin
de smbolos
Es posible hacer
movax, a
movb, al
addeax, c
sub p, cl
movax, [0]
mov[1], al
addeax, [3]
sub [17], cl
Assembler cod. mquina
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definiciones complejas
arreglo dw 1, 2, 3, 4, 5 ; define un arreglo de 5 words, inicializado.
matriz db1, 2, 3 ; define una matriz de 3 x 3bytes.
db 4, 5, 6 ; inicializada.
db 7, 8, 9
arreglo_vacio dw 100 DUP(0) ; define un arreglo de 100 wordsinicializado 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
7
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
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
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definiciones complejas
Estructuras
Astruct struct
B db xyz
C dw 1
D dd 2
astruct ENDS
Definicin
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
Instanciacin
8
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definiciones complejas
Uniones (difieren de las estructuras en que sus elementos se
superponen unos con otros)
Aunion union
B db xyz
C dw 1
D dd 2
aunionENDS
Definicin
Reg_a aunion ; no inicializado
Reg_a aunion? ; no inicializado
Reg_a aunion{} ; invlido
Reg_a aunion{B=abc, C=5} ; invlido
Reg_a aunion {C=5} ; equivalente a
dw5
dw?
Instanciacin
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definiciones complejas
Records(Un tipo de datos record representa una coleccin
de campos debit)
Arecrecord B : 3=4, C : 2, D : 4=15 Definicin
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)
9
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Pasamos a otra cosa
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Bloque de cdigo
Secuencia de lneas de cdigo de 8086 o 80x86 de la forma:
[rtulo] : instruccin [; comentario]
Ejemplo:
inicio : mov ax, 1 ; valor a acumular
movcx, 10 ; itero 10 veces
acum : add bx, ax ; sumo AX con BX
loop acum ; si CX <>0 sigo
fin : ret ; retorno
10
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo MASM estandar
Se define la estructura de cada segmento que se va a usar
Tipos de segmentos : pila, datos, cdigo
Formato de un segmento:
<name>SEGMENT <alineacin> <acceso> <tipo>
byte private DATA
word public CODE
dword memory STACK
para virtual
page at xxx
mempage common
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo MASM estandar
pila SEGMENT PARA stack
DB 200 DUP(?)
pila ENDS
datos SEGMENT WORD public data
hello_msgDB Hola mundo, 13, 10, $
datos ENDS
codigo SEGMENT WORD public code
ASSUME cs:codigo, ds:datos
inicio: mov ax, datos
mov ds, ax
movah, 9
movdx, OFFSET hello_msg
int 21h
movah, 4ch
int 21h
codigo ENDS
END inicio
Todo segmento es de la forma
nameSEGMENT....
Cuerpo
nameENDS
La directiva ASSUME indica a
TASM en que segmentos debe
asumir los selectores de segmento
El programa empieza en la primer
instruccin del segmento de cdigo
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
11
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo estandar: otro ejemplo
datos1 SEGMENT WORDpublicdata
a db 5
datos1 ENDS
datos2 SEGMENT WORDpublicdata
b db 5
datos2 ENDS
codigoSEGMENT WORDpubliccode
ASSUME cs:codigo, ds:datos1
mov ax, datos1
mov ds, ax
movah, a
ASSUME ds:datos2
mov ax, datos2
mov ds, ax
movah, b
codigoENDS
Si esta clusula no estuviera
TASM arroja un error
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo estandar: uso del ASSUME
datos1 SEGMENT WORDpublicdata
a db 5
b db 6
datos1 ENDS
datos2 SEGMENT WORDpublicdata
b db 5
datos2 ENDS
codigoSEGMENT WORDpubliccode
ASSUME cs:codigo, ds:datos1
mov ax, datos1
mov ds, ax
movah, a
ASSUME ds:datos2
mov ax, datos2
mov ds, ax
movah, b
codigoENDS
Si esta clusula no estuviera
TASM usar el smbolo b
de datos1 en lugar de el de
datos2
12
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Grupos de segmentos: directiva DGROUP
Combina 2 o mas segmentos en una
nica entidad lgica de manera que
todos ellos pueden ser accedidos
relativos a un nico registro de
segmento
Datagroup GROUP datos 1, datos2
datos1 SEGMENT WORDpublicdata
a db 5
datos1 ENDS
datos2 SEGMENT WORDpublicdata
b db 5
datos2 ENDS
codigoSEGMENT WORDpubliccode
ASSUME cs:codigo, ds:datagroup
mov ax, datagroup
mov ds, ax
movah, a
movah, b
codigoENDS
ProgramacinenEnsamblador
Ing. MarceloTosini - 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
13
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo MASM compacto
. MODEL small
. STACK 100
. DATA
hello_msg DB Hola mundo, 13, 10, $
.CODE
mov ax, @data
mov ds, ax
mov ah, 9
movdx, OFFSET hello_msg
int 21h
mov ah, 4ch
int 21h
END
Modelo de trabajo
Tamao de la pila
Segmento de datos
Segmento de cdigo
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
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 cdigo 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 alfabticamente
.SEQ indica al ensamblador poner los segmentos en el OBJ en el orden en
que aparecen en el fuente
14
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
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 lmites del
procedimiento en que se define
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definicin de procedimientos
Sintxis:
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 estandefinidos
NEAR el procedimiento solo es visible dentro del segmento
en que esta definido
15
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
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
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Definicin de procedimientos
Language BASIC, FORTRAN, PROLOG, C, CPP, PASCAL
lang_modif 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
16
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
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 tmp3:DWORD:4 tmp es un arreglo de 3 elementos de 4 dwords cada uno
symbol : TASM iguala ese smbolo al tamao total de la lista de argumentos enbytes
ARG a:word, b:dword:4, c:byte=d ; d =20 (debido a la alineacin de pila)
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Ejemplo
Sumar PROC PASCAL far
ARG op1:byte:4, op2:byte:4=count RETURNS resul:DWORD
LOCAL de_gusto:word
moveax, op1
add eax, op2
mov resul, eax
ret count
Sumar ENDP
Dir ret
op2
De_gusto
BP
op1
resul
BP+2
BP+6
BP-2
BP
BP+10
BP+14
stack
17
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Acceso a los datos...
Dado:
var1 db? ; en el segmento de datos
var2 dd 4567
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 ; OJ O, carga en EAX 4bytes
empezando desde var1
(var1 y los 3 primerosbytesde var2)
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Acceso a los datos...
Dado:
t_var STRUCT ; en el segmento de datos
a dw7
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
movcx, offset mi_var.b ; CX =2, en este caso
18
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Rtulos de salto...
.DATA
rotulo dd ? ; defino una variable puntero
.CODE
un_proc PROC FAR ; una rutina far tiene direccin de 4bytes
.............
Un_proc ENDP
.start ; comienzo del programa
mov ax, offset un_proc ; guardo en es:ax la direccin de la rutina
mov es, seg un_proc
mov word ptr rotulo, ax ; almaceno dicha direccin en rotulo
mov word ptr [rotulo+2], es
call un_proc ; llamo al procedimiento as
call dword ptr [rotulo] ; o as
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo IDEAL
Caractersticas
Permite ver el cdigo fuente tal como una expresin
o instruccin de alto nivel
Los programas son ms claros y sin los trucos del MASM
Adiciona chequeo estricto de tipos a las expresiones (lo que
evita la escritura de sentencias confusas o errneas)
19
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Modo IDEAL
El cambio entre modo MASM e IDEAL se hace a travs de
las directivas MASM e IDEAL.
La aparicin de una de las directivas en el texto cambia
automticamente a dicho modo hasta la aparicin de la otra
directiva.
.CODE
.......... ; modo masm por defecto
IDEAL
.......... ; modo ideal
MASM
.......... ; modo masm
END
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Diferencias entre MASM e IDEAL
El acceso a smbolos 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 comoWORDPTR o BYTE PTR en una carga
mov bl, var ; solo es posible si var esbyte, ya que se carga en BL
Las declaraciones de segmentos o procedimientos se invierten para asemejarlas
a las de alto nivel
SEGMENT datos1WORDdata
PROC mi_proc
20
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Pasos para generar un ejecutable
MOV AX,1ADE
MOV DS,AX
MOV AH,09
MOV DX,0000
INT 21
MOV AH,4C
INT 21
.MODEL small
.STACK 100h
.DATA
hello_msgDB 'Holamundo', 13, 10, '$'
.CODE
mov ax, @data
mov ds, ax
movah, 9
movdx, OFFSET hello_msg
int 21h
movah, 4ch
int 21h
END
tasm /la hello;
Hello.obj
tlink hello;
Hello.map Hello.lst
ProgramacinenEnsamblador
Ing. MarceloTosini - 2001
Ejemplos
Modo compacto.asm
Modo estndar.asm
Modo compacto.map
Modo compacto.lst
Modo compacto.exe Modo estndar.exe

You might also like