Está en la página 1de 15

CREANDO EL EJECUTABLE DE ASSEMBLER

ANALISIS DEL CODIGO FUENTE

Expondremos brevemente la estructura del programa fuente en assembler. Este est


compuesto por una serie de segmentos para la pila, el cdigo y los datos. Los
segmentos no pueden estar anidados.

Cada uno comienza con el nombre del segmento seguido de la palabra SEGMENT y
alguna o algunas cadenas exigidas por el enlazador.
Cada segmento termina con el nombre del segmento seguido de la palabra ENDS.
El programa termina con la palabra END seguida del nombre del punto de entrada al
programa.
De esta forma, el armazn del programa en ensamblador es el siguiente:
-

Dentro del segmento PILA se establece, dentro del segmento de pila, se


establece el tamao de sta. La forma habitual de hacerlo es mediante la
sentencia DW (define palabra) seguida del nmero de palabras que vamos a
reservar y la sentencia DUP (?). Se establece el Segmento PILA de tamao
100H palabras (512 bytes), sin especificar el contenido inicial.

;***************SEGMENTO DE PILA**************************
PILA SEGMENT STACK 'STACK'
DW 100H DUP (?)
PILA ENDS
;**********************************************************
-

Dentro del segmento DATOS escribimos los siguientes mensajes:


El ttulo de nuestro juego: <<<<<<<SNAKE EN ASSEMBLER>>>>>>>,
El mensaje que aparecer cuando pierda el jugador ===GAME OVER====.
Las variables que se encuentran en el segmento data ? sin inicializar que se
encuentra con el signo de interrogacin, de la misma manera hay definiciones de
variables que se utilizarn durante el juego.

***************SEGMENTO DE DATOS*************************
DATOS SEGMENT 'DATA'
TITULO DB 10,"<<<<<<< SNAKE EN ASSEMBLER >>>>>>>",13,10, '$'
OVER DB 10,"===GAME OVER===",10, '$'
SALIR DB 0
X DB 100 DUP (?)
Y DB 100 DUP (?)
RAP DW ?
POSCOM DB 2 DUP (?)
DIREC DB 3
TECLA DB ?
TAM DW 0007

AUX DW 0
ESPERA DW 0
ULTX DB ?
ULTY DB ?
DATOS ENDS
;*******************************************************
Dentro de este bloque direccionamos CS al segmento CODIGO, DS al segmento DATOS, SS al
segmento PILA
Luego se hacen todas las llamadas a los segmentos ENTRADA, ACTUALIZA, RENDER, SALIR y en
la etiqueta FIN llamamos a una funcin del DOS para terminar el programa, liberando la
memoria y devolviendo el control al sistema operativo, la encargada de realizar esta tarea es el
segmentos MOV AX, 4C00H, INT 21H.
;***************SEGMENTO CODIGO***********************
CODIGO SEGMENT 'CODE'
PRINCIPAL PROC FAR
ASSUME CS:CODIGO, DS:DATOS, SS:PILA
MOV AX,DATOS
MOV DS,AX
CALL INICIA
BUCLE:
CALL ENTRADA
CALL ACTUALIZA
CALL RENDER
CMP SALIR,0
JE BUCLE
FIN:
MOV AX,4C00H
INT 21H
PRINCIPAL ENDP

;****************************************************

En este segmento es donde se inicia el juego, para ello se esconde el cursor de la


pantalla, luego se llama a la etiqueta BORRA, para que en la pantalla del compilador
borre todo el contenido anterior, y luego se inicializa la variable SI

;**********SEGMENTO INICIA PROCEDIMIENTO*******************


INICIA PROC
MOV RAP,2
MOV POSCOM[0],60
MOV POSCOM[1],15
; OCULTA CURSOR
MOV AH, 1
MOV CH, 2BH
MOV CL, 0BH
INT 10H
CALL BORRA
MOV SI,0
MOV X[SI],40
MOV Y[SI],12
MOV SI,1
MOV X[SI],39
MOV Y[SI],12
MOV SI,2
MOV X[SI],38
MOV Y[SI],12
MOV SI,3
MOV X[SI],37
MOV Y[SI],12
MOV SI,4
MOV X[SI],36
MOV Y[SI],12
MOV SI,5
MOV X[SI],35
MOV Y[SI],12

RET
INICIA ENDP
;****************************************************

;**********SEGMENTO ENTRADA PROC*******************


ENTRADA PROC
VERIFICA:
MOV AH,01H
INT 16H
JZ NOPRES
MOV AH,00H
INT 16H
MOV TECLA,AH
NOPRES:
MOV AH,00H
INT 1AH
CMP DX,ESPERA
JB VERIFICA
ADD DX,RAP

;VELOCIDAD DEL JUEGO

MOV ESPERA,DX
RET
ENTRADA ENDP
;*************************************************************

Este segmento actualiza

;********SEGMENTO ACTUALIZA PROC*******************************


ACTUALIZA PROC
CMP TECLA,48H

;TECLA ARRIBA

JE ARR
CMP TECLA,50H
JE ABA

;TECLA ABAJO

CMP TECLA,4BH

;TECLA IZQ

JE IZQ
CMP TECLA,4DH

;TECLA DERECH

JE DER
CMP TECLA,01H
JE SALIDA
JMP SEGUIR
SALIDA:
MOV SALIR,1
JMP FINACT
ARR:
CMP DIREC,0
JE SEGUIR
CMP DIREC,1
JE SEGUIR
MOV DIREC,0
MARR:
CALL MOVER
DEC Y[0]
JMP FINACT
;-------------ABA:
CMP DIREC,1
JE SEGUIR
CMP DIREC,0
JE SEGUIR
MOV DIREC,1
MABA:
CALL MOVER
INC Y[0]
JMP FINACT

;TECLA ESC

;------------IZQ:
CMP DIREC,2
JE SEGUIR
CMP DIREC,3
JE SEGUIR
MOV DIREC,2
MIZQ:
CALL MOVER
DEC X[0]
JMP FINACT
;------------DER:
CMP DIREC,3
JE SEGUIR
CMP DIREC,2
JE SEGUIR
MOV DIREC,3
MDER:
CALL MOVER
INC X[0]
JMP FINACT
;------------SEGUIR:
CMP DIREC,0
JE MARR
CMP DIREC,1
JE MABA
CMP DIREC,2
JE MIZQ
CMP DIREC,3

JMP MDER
FINACT:
CALL COMIDA
CALL COLISION
RET
ACTUALIZA ENDP
;**********************************************************

;************SEGMENTO COMIDA PROC*************************

COMIDA PROC
MOV AL,POSCOM[0]
CMP X[0],AL
JNE FALSO
MOV AL,POSCOM[1]
CMP Y[0],AL
JNE FALSO
MOV SI,TAM
MOV AL,ULTX
MOV X[SI],AL
MOV AL,ULTY
MOV Y[SI],AL
INC TAM
;----CREA NUEVA
;EJE X
MOV AH,2CH
INT 21H
CMP DL,4EH
JG RESTARX
JMP ASIGNAX
RESTARX:

SUB DL,4CH
ASIGNAX:
MOV POSCOM[0],DL
;EJE Y
MOV AH,2CH
INT 21H
VOLVER:
CMP DL,17H
JG OTRAVEZ
JMP ASIGNAY
OTRAVEZ:
SUB DL,15H
JMP VOLVER
ASIGNAY:
MOV POSCOM[1],DL
FALSO:
RET
COMIDA ENDP
;***************************************************
;*********SEGMENTO COLISION PROC********************
COLISION PROC
;----COLISION CON BORDE---CMP X[0],0
JE FINCOL
CMP X[0],79
JE FINCOL
CMP Y[0],0
JE FINCOL
CMP Y[0],24
JE FINCOL
;---COLISION CONSIGO MISMO---

MOV AX,TAM
MOV CX,AX
DEC CX
MOV SI,CX
COLB:
MOV AL,X[SI]
CMP X[0],AL
JNE SGTEPUNTO
MOV AL,Y[SI]
CMP Y[0],AL
JNE SGTEPUNTO
JMP FINCOL
SGTEPUNTO:
DEC SI
LOOP COLB
;----FIN
JMP SIGUE
FINCOL:
MOV SALIR,1
SIGUE:
RET
COLISION ENDP
;******************************************************************

;**********SEGMENTO RENDER PROC***********************************


RENDER PROC
;DIBUJA COMIDA----MOV DH,POSCOM[1]
MOV DL,POSCOM[0]
MOV AH,02H
MOV BH,00H

INT 10H
MOV DL,15H ;COMIDA
MOV AH,02H
INT 21H
;------FIN COMIDA
;-------TEXTOS----MOV DH,1

;TITULO

MOV DL,20
MOV AH,02H
MOV BH,00H
INT 10H
MOV DX,OFFSET TITULO
MOV AH,09H
INT 21H
;------FIN TEXTOS---------MOV DH,Y[0]
MOV DL,X[0]
MOV AH,02H
MOV BH,00H
INT 10H
MOV DL,2AH ;CUERPO
MOV AH,02H
INT 21H
MOV DH,ULTY
MOV DL,ULTX
MOV AH,02H
MOV BH,00H
INT 10H
MOV DL,20H
MOV AH,02H
INT 21H

RET
RENDER ENDP
;********************************************************
Este segmento borra todo el compilador y le pone el fondo color rojo,
;****************SEGMENTO BORRA PROC********************
BORRA PROC
PUSH CX
PUSH BX
MOV CX,0
MOV DH,24
MOV DL,79
MOV AL,0
MOV AH,6
MOV BH,00000000B
INT 10H
MOV CH,1
MOV CL,1
MOV DH,23
MOV DL,78
MOV BH,11001010B
INT 10H
POP BX
POP CX
RET
BORRA ENDP
;*******************************************************************

;***************SEGMENTO MOVER************************************
MOVER PROC
MOV CX,TAM
DEC CX

MOV SI,CX
MOV AH,X[SI]
MOV ULTX,AH
MOV AH,Y[SI]
MOV ULTY,AH
DEC SI
REPITE:
MOV BX,SI
INC BX
MOV AH,X[SI]
MOV X[BX],AH
MOV AH,Y[SI]
MOV Y[BX],AH
DEC SI
LOOP REPITE
RET
MOVER ENDP
;********************************************************
CODIGO ENDS
END PRINCIPAL

También podría gustarte