EJEMPLO.ASM:
.MODEL SMALL ; Tipo .COM, este modelo de memoria
; significa que SS, DS, ES y CS son iguales al
;comenzar el programa. Y que los datos y el stack
;están sobre el mismo segmento pero claro, en
; distinto offset.
.CODE ; Para decirle al Assembler que aquí
; comienza el código. En otros modelos, como .HUGE
; hay que definir la parte de datos, con .DATA y
; la parte de Stack, con .STACK.ORG
100h; Esta orden, para el compilador también
; le dice que comience el programa en el offset
; 100h. Todos los .COMs deben comenzar en el
; offset 100h. Mas adelante voy a explicar bien el; funcionamiento de esta orden.
; Y luego completar el programa con lo que sea.
EJEMPLO:
; Esta es una etiqueta, es un nombre que
; se le da a una posición para, luego, poder
; referirnos a ella por su nombre. Esta es una
; ayuda que nos da el Assembler para no tener que
; referirnos a números todo el tiempo. Acá hace
; falta para que el compilador sepa que todo
; comienza allí. No es necesario que sea el nombre
; del programa, puede ser cualquier otra cosa pero
; yo acostumbro esto.
; La orden MOV (MOVE), lleva dos parámetros. Lo
; que hace es copiar el contenido del segundo
; parámetro al primero
mov di,offset mensaje;
Esta orden, significa poner en DI el offset de
; la posición que representa mensaje. (mirar mas
; abajo para ver mensaje).
; DI = Offset Mensaje
Repetir: ; Pongo un 'label' o etiqueta, para
; usarlo luego.
mov al,byte ptr [di]
; Pongo en AL el contenido de la posición que
; indica [DI].
; Recordemos que [DI] solo, significa DS:[DI],
; porque el segmento por omisión para DI es DS.
; Con 'byte ptr' indico que DS:[DI] es un
; puntero a un BYTE. AL = DS:[DI]
add al,40h ; le sumo a AL 40h.
; AL+=40h (AL=AL+40h)
mov byte ptr [di],al
; Pongo en DS:[DI] (lo que apunta DS:DI) el
; contenido de AL. DS:[DI]=AL
inc di ; Incrementa DI en 1.
; DI++ (DI=DI+1)
cmp al,'$' ; !!! Compara AL con '$', es decir
; con el valor ASCII de '$'. El resultado de la
; comparación es guardado en los flags del micro.
; AL??'$'jne Repetir
; Salta si el resultado de la última
; comparación fue que son iguales.
; Jump if Not Equal. Si no eran iguales salta a
; Repetir, el label que habíamos puesto al
; principio. AL=='$' ? Go Repetir
mov ah,09h ; Pongo en AH un 09h; AH=09hmov dx,offset mensaje
; DX = Offset Mensajeint 21h
; !!! Ejecuto la Interrupción 21hmov ax,4c00h
; AX=4C00hint 21h ; INT 21h
Mensaje db 08h, 2Fh, 2Ch, 21h, 0E1h, 0E1h, 0E1h
; Aca estoy definiendo una lista de números,
; cada uno es un byte. (DB = Define Byte). El
; primer byte de la lista esta bajo el nombre
; mensaje. También podría haber puesto:
; Mensaje db 'El día esta lindo!'
; Se toma cada caracter como un byte.
db 0CDh, 0CAh, 0E4h
; Esta línea es la continuación de la anterior.
; Es necesario volver a poner
DB.END EJEMPLO
; Con esta orden, le digo a
; assembler que mi programa termina acá.
; El nombre después de END tiene que ser el
; mismo del principio.
domingo, 13 de abril de 2008
Suscribirse a:
Enviar comentarios (Atom)

No hay comentarios:
Publicar un comentario