Apunte TASM

Anuncio
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
Descargar