Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
-
;***************SEGMENTO DE PILA**************************
PILA SEGMENT STACK 'STACK'
DW 100H DUP (?)
PILA ENDS
;**********************************************************
-
***************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
;****************************************************
RET
INICIA ENDP
;****************************************************
MOV ESPERA,DX
RET
ENTRADA ENDP
;*************************************************************
;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
;**********************************************************
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
;******************************************************************
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