En ensamblador existen dos tipos de estructuras para desarrollar un programa en ensamblador.
Pero antes tienes que tener las herramientas para ensamblar tus programas las cuales puedes descargar al final de este tutorial:
MASM.EXE: ensambla el programa y crea el archivo OBJ.
LINK.EXE: linkea el archivo OBJ y hace el archivo ejecutable.
ML: ejecuta los dos archivos de arriba en una sola pasada, es una forma mas rápido de ensamblar.
Intrlist: es una biblioteca de interrupciones para los micros.
NOTEPAD2: es un editor que marca la sintaxis de registros, números, etc.
La primera es una estructura básica de programación:
.model
TINY ; desde MASM 6.0 usado para programas .COM
SMALL ; todos los datos en un segmento y todo el código en un segmento
MEDIUM ; todos los datos en un segmento, pero el código en mas de un segmento
COMPACT ; datos en más de un segmento, pero código en un segmento
LARGE ; Datos y código, en mas de un segmento, pero los areglos no pueden
; exceder 64K
HUGE ; Datos y código, ambos en más de un segmento, y los arreglos pueden
; exceder 64K
.stack
.data
Definicion de datos
directiva descipcion MASM 6.0 Rango
DB Definir Byte BYTE 1 byte +127, -128
DW Definir una palabra WORD 2 bytes +32,767, -32,768
DD Definir doble palabra DWORD 4 bytes +2,147,483,647, -2,147,483,648
DF Definir palabra larga FWORD 6 bytes uso para 386 y posteriores
DQ definir palabra cuadruple QWORD 8 bytes
DT definir diez bytes TWORD 10 bytes proposito para valores numericos
empacados BCD en coprocesqadores
nombre dn expresion
FLD1 DB ? ; elemento no inicializado
FLD2 DB 25 ; elemento inicializado
FLD3 dB 10 DUP (?) ; diez palabras no inicializadas
FLD4 dB 5 DUP (14) ; cinco palabras con 0E0E0E0E0E hexadecimal
.code
.startup ; inicio de código de programa
identificador operacion operando comentario
directiva DB 1 ; comienza con punto y coma
instruccion MOV AX,0 ; comienza con punto y coma
.exit ; sustituye datos de retorno al DOS
end ; fin del programa
Esta estructura es la mas fácil de usar y la que mas se utiliza. Pero tambien existe esta otra:
page 60,132
TITLE p04asm1 (EXE) operaciones de mover y sumar
;-----------------------------------------------------
STACKSG SEGMENT PARA STACK ´Stack´
DW 32 DUP(0)
STACKSG ENDS
;-----------------------------------------------------
DATASG SEGMENT PARA ´Data´
FLDA DW 250
FLDB DW 125
FLDC DW ?
DATASG ENDS
;-----------------------------------------------------
CODESG SEGMENT PARA ´Code´
BEGIN PROC FAR
ASSUME SS:STACKSG,DS:DATASG, CS:CODESG
MOV AX,DATASG ; SE ASIGNA DIRECCION DE DATASG
MOV DS,AX ; EN REGISTRO DS
MOV AX,FLDA ; MOVER 0250 A AX
ADD AX,FLDB ; SUMAR 0125 A AX
MOV FLDC,AX ; ALMACENAR SUMA EN FLDC
MOV AX,4C00H ; SALIDA A DOS
INT 21H
BEGIN ENDP ; FIN DE PROCEDIMIENTO
CODESG ENDS ; FIN DE SEGMENTO
END BEGIN ; FIN DE PROGRAMA
Nuestro amigo Marco Azpurua comparte esta aplicación que permite contar los caracteres de una cadena que se introduce por el teclado, además muestra la cadena.
model small
.stack 64h
.data
cadena1 db 50 dup(' '),'$'; llena las cadenas con espacio
msj1 db 'El numero de caracteres es:$'
msj2 db 'Hola este programa cuenta caracteres de la cadena: $'
.code
.startup
mov ah,06h ; peticion de recorrido de la pantalla
mov al,00h ; indica la pantalla completa
mov bh,17h ; attributos de color y fondo 7 blanco 0 negro
mov cx,0000h ; esquina superior izquierda renglon columna
mov dx,184fh ; esquina inferior derecha renglon columna
int 10h ; llamada a la interrupcion de video BIOS
mov ah,02
mov dx,0402h
mov bh,00
int 10h
mov ah,09 ; Escribir cadena
mov dx,offset msj2
int 21h
mov bx,0000h
lea SI,cadena1 ; llena a SI con la direccion del primer caracter de la cadena1
mov cx,50 ; inicio el registro del contador en 10
regresa:
mov ah,07h ; Recoje por teclado un carater y lo coloca en AL sin eco
int 21h ; ejecuta la funcion del DOS
cmp al,13 ; Compara al con enter
je termina ; salta solo si la tecla oprimida es enter
mov [SI],al; copia el contenido de AL en el registro cuya direccion es igual al contenido de SI
inc SI ; Incrementa en 1 el contenido de SI
inc bx
mov dl,al ; compia el contenido de dl en al
mov ah,02h ; Funcion de mostrar por pantalla el contenido de dl
int 21h ; ejecuta la funcion del DOS
loop regresa ; En contenido de CX disminuye en 1 y salta a regresa
termina:
mov al,bl
and ax,000fh
and bx,00f0h
shr bx,01
mov ah,bl
cmp al,0ah
jb dejar
daa
inc ah
dejar:
mov bl,al
mov al,ah
cmp al,0ah
jb decena
daa
mov dx,31h
decena:
mov bh,al
and bx,0f0fh
or bx,3030h
mov cx,bx
mov ah,02
mov dx,0702h
mov bh,00
int 10h
mov ah,09 ; Escribir cadena
mov dx,offset msj1
int 21h
mov ah,02
mov dx,071eh
mov bh,00
int 10h
mov dl,ch
mov dh,cl
mov ah,02
mov cx,01
int 21h
mov ch,dh
mov dl,ch
int 21h
.exit
end
Para empezar a programar en ensamblador, comenzaremos haciendo el programa mas conocido y popular, el clásico Hola mundo, lo cual es muy simple.
cr equ 13
lf equ 10
dades SEGMENT PARA PUBLIC 'data'
msg1 DB 'Hola Mundo',cr,lf,'$'
dades ENDS
codi SEGMENT PARA PUBLIC 'code'
MAIN PROC FAR
ASSUME cs:codi,DS:dades,SS:pila,ES:dades
MOV AX,dades
MOV DS,AX
MOV ES,AX
MOV AH,09H
LEA DX,msg1
int 21H
MOV AX,4C00H
int 21h
MAIN ENDP
codi ENDS
pila SEGMENT PARA STACK 'stack'
DB 128 DUP(0)
pila ends
END MAIN