Tutoriales de ensamblador

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

 

Autor: elgame(fuente:mis-algoritmos.com)

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

Autor: Marco Azpurua

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

Autor: