martedì 14 giugno 2011

matrice 4x4 di 1 byte in assembler






#
# programma per utilizzo delle matrici in assembler
# gestione di una matrice semplice 4x4
# ogni elemento è di un byte
#
# integrazione con messaggi e stampe di controllo
# e verifica
#


.GLOBAL _main

.DATA
matrice: .FILL 16,1,0x00
# --------------------------------
# var in memoria per tenere traccia
# del corretto inserimento delle cordinate
# --------------------------------
col_ok: .BYTE 0
rig_ok: .BYTE 0



# --------------------------------
# var in memoria per tenere traccia
# delle cordinate e per stampare a
# video le reali coordinate
# in numeri
# --------------------------------
x_col: .BYTE 0x00
y_rig: .BYTE 0x00

indice: .BYTE 0

mess1: .ASCII "\nValori ammessi: [A - D]\n\r"
mess2: .ASCII "\nValori ammessi: [0 - 3]\n\r"
mess3: .ASCII "\nLe tue coordinate:\r"

mess_col: .ASCII "\nColonna scelta: \n\r"
mess_rig: .ASCII "\nRiga scelta: \n\r"
mess_elem: .ASCII "\nValore elemento scelto: \n\r"
mess_print: .ASCII "\nStampo tutta la matrice per verifica incremento: \n\r"

.TEXT
_main: NOP
# --------------------------------
# inserimento indice colonna: %EDX
# --------------------------------
ins_col: MOV $0, %EAX
MOVB $0,col_ok

CALL newline
MOV $'X',%AL
CALL output
MOV $':',%AL
CALL output
MOV $' ',%AL
CALL output

AND $0x00,%EAX
CALL input
CALL output
CMP $'A', %AL
JB print_mess1
CMP $'D',%AL
JA print_mess1
JMP ins_ok_1


print_mess1: PUSH %EBX
MOV $mess1,%EBX
CALL outline
POP %EBX
JMP ins_col

ins_ok_1: SUB $'A',%AL
MOV $0,%EDX
MOVB %AL,%DL
MOVB %AL,x_col
ADDB $1,col_ok

# --------------------------------
# inserimento indice riga: %ECX
# --------------------------------
ins_rig: MOV $0, %EAX
MOVB $0,rig_ok

CALL newline
MOV $'Y',%AL
CALL output
MOV $':',%AL
CALL output
MOV $' ',%AL
CALL output

AND $0x00,%EAX
CALL input
CALL output
CMP $'0', %AL
JB print_mess2
CMP $'3',%AL
JA print_mess2
JMP ins_ok_2


print_mess2: PUSH %EBX
MOV $mess2,%EBX
CALL outline
POP %EBX
JMP ins_rig

ins_ok_2: SUB $'0',%AL
MOV $0,%ECX
MOV %AL,%CL
MOVB %AL,y_rig
ADDB $1,rig_ok

# -------------------------------------
# controllo inserimenti colonna e riga
# -------------------------------------

CMPB $0,col_ok
JE ins_col
CMPB $0,rig_ok
JE ins_rig

CALL newline
PUSH %EBX
MOV $mess_col,%EBX
CALL outline
POP %EBX
MOV x_col,%AL
CALL outbyte

CALL newline
PUSH %EBX
MOV $mess_rig,%EBX
CALL outline
POP %EBX
MOV y_rig,%AL
CALL outbyte

# ----------------------------------------------
# stampo le coordinate scelte di colonna e riga
# ----------------------------------------------

CALL newline
print_choice: PUSH %EBX
MOV $mess3,%EBX
CALL outline
POP %EBX
CALL newline
MOV $0,%EAX
MOV $'(',%AL
CALL output
MOVB x_col,%AL
ADD $'A',%AL
CALL output
MOV $',',%AL
CALL output
MOVB y_rig,%AL
ADD $'0',%AL
CALL output
MOV $')',%AL
CALL output
CALL newline
# ----------------------------------------------
# incremento di 1 del valore dell' elemento di posizione (X,Y) scelto
# ----------------------------------------------
elemento: INCB matrice(%EDX,%ECX,4)
MOVB matrice(%EDX,%ECX,4),%AL
PUSH %EBX
MOV $mess_elem,%EBX
CALL outline
POP %EBX
CALL output
PUSH %EAX
MOV $' ',%AL
CALL output
POP %EAX
CALL outbyte

stampa_mat: PUSH %EBX
MOV $mess_print,%EBX
CALL outline
POP %EBX

PUSH %EAX
PUSH %EBX
PUSH %ECX
PUSH %EDX

MOV $0,%EAX
MOV $0,%EBX
MOV $0,%ECX
MOV $16,%EDX

CALL newline
stampa: MOV $' ',%AL
CALL output
MOVB matrice(%EBX,%ECX,4), %AL
#ADD $'0',%AL
CALL outbyte
DEC %EDX
INC %EBX
CMP $4,%EBX
JNE stampa
CALL newline

MOV $0,%EBX
INC %ECX
CMP $0,%EDX
JNE stampa

POP %EDX
POP %ECX
POP %EBX
POP %EAX



CALL pause

fine: RET


.INCLUDE "C:/GAS/utility"







0 commenti:

Posta un commento