#
# 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"
Welcome to my blog about my personal experience on programming language, computer science engineering studies, on how to trouble solving hardware and software problem, with some personal solutions.
martedì 14 giugno 2011
matrice 4x4 di 1 byte in assembler
Iscriviti a:
Commenti sul post (Atom)
0 commenti:
Posta un commento