domingo, 13 de abril de 2008

EJEMPLO SENCILLO ASSEMBLER

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.

No hay comentarios: