MIPS 为什么我不能打印选定的数组位置?
MIPS Why I can't print the selected array position?
用这个代码模拟器说:内存地址越界”和打印(空)
t0是索引,初始设置为0,它是一个cicle的一部分。
la $t1, nome #array address
mul $t2, $t0, 4 # t2=index*4
add $t3, $t2, $t1
lw $a0, nome($t2)
li $v0, 4
syscall
就是这样写的:
la $t1, nome
mul $t2, $s2, 4 #s2 index
la $v0, 4
la $a0, nomedom #input string
syscall
li $v0, 8
syscall
sw $v0, nome($t2)
这是程序的原型,我只留下了一个数组来减少长度
现在,如果你 运行 这段代码你可以 运行 只创建和列出,但如果你 运行 在创建配置文件后列出,函数列表将不会列出任何内容,但我想我读过相同的内存位置.. 之后,如果您 运行 另一次创建,它将在屏幕上打印先例数据!我不明白为什么!我只打印输入的问题
.data #variabili
nome: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
cognome: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
interessi: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
userid: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
email: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
password: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
pp: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
cont: .word 0 #METTERE STO CONTATORE COME RIFERIMENTO INDIRIZZO NEGLI INDICI DEGLI ARRAY
selezione: .byte 0
#menu
menu: .asciiz "\n\n\n\n\n\n1)Creation profile\n2)Modificare il proprio profilo\n3)Cancellare \n4)LIST\n5)Cercare un profilo pubblico per nome e cognome\n0)USCITA\n\n\nSelezione: "
nomedom: .asciiz "Inserire nome: "
cognomedom: .asciiz "Inserire cognome: "
useriddom: .asciiz "Inserire UserID: "
interessidom: .asciiz "Inserire interessi: "
emaildom: .asciiz "Inserire E-mail valida: "
passdom: .asciiz "Inserire password: "
ppdom: .asciiz "Profilo pubblico(0) o privato(1): "
menurid: .asciiz "\n\n\nModifica Profilo(1)\nMenu principale(0) :"
uscita: .asciiz "SEI USCITO"
intro: .asciiz " --------"
troppitx: .asciiz "\n\nIL NUMERO MASSIMO DI PROFILI È 10"
.text
main:
li $s2, 0
li $v0, 4
la $a0, intro
syscall
menupri:
#-------------------------------------------------------------------<<<<<<<MENU
li $v0, 4 # 4 è il codice di print_string
la $a0, menu # domanda all'utente
syscall
li $v0, 5 #leggo intero
syscall
move $t6,$v0 #memorizzo l'intero in t6
li $t1, 1
li $t2, 2
li $t3, 3
li $t4, 4
li $t5, 5
li $t0, 0
beq $t1, $t6, FUNZIONE_CREATION
beq $t2, $t6, FUNZIONE_MODIFICA
beq $t3, $t6, FUNZIONE_CANCELLAZIONE
beq $t4, $t6, FUNZIONE_LIST
beq $t5, $t6, FUNZIONE_RICERCA
beq $t0, $t6, USCITA
#----------------------------------------------------------------------------<<<<FUNCTION
.ent FUNZIONE_CREATION
FUNZIONE_CREATION:
bgeu $s2, 10, TROPPI #s2 indice e contatore
li $t1, 0
li $t2, 0
li $t3, 0
la $t1, nome #indirizzo dell'array
mul $t2, $s2, 4 #di quanto devo spostarmi t2=indice*4
add $t3, $t2, $t1 #indirizzo array di indice s2 è in t3
la $v0, 4 #nomedom
la $a0, nomedom
syscall #scrivo richiesta
li $v0, 8 # lettura
syscall
sw $v0, nome($t2)
add $s7, $s7, 1
li $v0, 4 # 4 è il codice di print_string
la $a0, menurid # domanda all'utente
syscall
li $v0, 5 #leggo intero
syscall
move $t2,$v0 #memorizzo l'intero in t2
li $t1, 1
li $t0, 0
beq $t1, $t2, FUNZIONE_MODIFICA #VA PASSATO L'INDICE COME ARGOMENTO
beq $t0, $t2, esci
esci:
#niente
.end FUNZIONE_CREATION
j menupri #torna al menu principale
.ent FUNZIONE_LIST
FUNZIONE_LIST:
#VISUALIZZA I PROFILI PUBBLICI, se pp= pubblico di un indice scrive
li $t0, 0#indice e contatore
li $t7, 0
li $t1, 0
li $t2, 0
li $t3, 0
li $t5, 0
loop:
bgt $t0, 9, esci1
la $t1, nome #indirizzo dell'array
mul $t2, $t0, 4 #di quanto devo spostarmi t2=indice*4
add $t3, $t2, $t1 #indirizzo array di indice t0 è in t3
#lw $t7, pp
beq $t7, $zero, scrittura #t7 è pp
scrittura:
li $v0, 4
la $a0, nome($t2)
syscall
addi $t0, $t0,1 #condizione e campi del ciclo #prima era sotto bgt
j loop
esci1:
#niente
.end FUNZIONE_LIST
j menupri #torna al menu principale
.ent FUNZIONE_RICERCA
FUNZIONE_RICERCA:
.end FUNZIONE_RICERCA
j menupri #torna al menu principale
.ent FUNZIONE_MODIFICA
FUNZIONE_MODIFICA:
.end FUNZIONE_MODIFICA
j menupri #torna al menu principale
.ent FUNZIONE_CANCELLAZIONE
FUNZIONE_CANCELLAZIONE:
.end FUNZIONE_CANCELLAZIONE
j menupri #torna al menu principale
.ent USCITAMEN
USCITAMEN:
j menupri
.end USCITAMEN
.ent TROPPI
TROPPI:
li $v0, 4
la $a0, troppitx
syscall
j menupri
.end USCITAMEN
#fine
USCITA:
li $v0, 4 # uscita
la $a0, uscita
syscall
li $v0,10
syscall
我猜您希望 nome
是一个整数数组。在这种情况下,您应该使用 $v0 = 1
而不是 $v0 = 4
。 4
in $v0
打印一个字符串。由于 nome
在每个位置都有 0
,因此 $v0
中 4
的值将 0
打印为 ASCII。而0
就是NULL
的ASCII值。这解释了您不需要的输出。
如果要将 0
打印为整数,则需要 $v0=1
.
改变这个:
lw $a0, nome($t2)
li $v0, 4
syscall
对此:
lw $a0, 0($t3) # Since you have $t3 = $t2 + $t1
li $v0, 1 # It is same as Address of nome[0] + index*4
syscall # which is same as Address of nome[i]; i being $t2
用这个代码模拟器说:内存地址越界”和打印(空) t0是索引,初始设置为0,它是一个cicle的一部分。
la $t1, nome #array address
mul $t2, $t0, 4 # t2=index*4
add $t3, $t2, $t1
lw $a0, nome($t2)
li $v0, 4
syscall
就是这样写的:
la $t1, nome
mul $t2, $s2, 4 #s2 index
la $v0, 4
la $a0, nomedom #input string
syscall
li $v0, 8
syscall
sw $v0, nome($t2)
这是程序的原型,我只留下了一个数组来减少长度 现在,如果你 运行 这段代码你可以 运行 只创建和列出,但如果你 运行 在创建配置文件后列出,函数列表将不会列出任何内容,但我想我读过相同的内存位置.. 之后,如果您 运行 另一次创建,它将在屏幕上打印先例数据!我不明白为什么!我只打印输入的问题
.data #variabili
nome: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
cognome: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
interessi: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
userid: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
email: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
password: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
pp: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
cont: .word 0 #METTERE STO CONTATORE COME RIFERIMENTO INDIRIZZO NEGLI INDICI DEGLI ARRAY
selezione: .byte 0
#menu
menu: .asciiz "\n\n\n\n\n\n1)Creation profile\n2)Modificare il proprio profilo\n3)Cancellare \n4)LIST\n5)Cercare un profilo pubblico per nome e cognome\n0)USCITA\n\n\nSelezione: "
nomedom: .asciiz "Inserire nome: "
cognomedom: .asciiz "Inserire cognome: "
useriddom: .asciiz "Inserire UserID: "
interessidom: .asciiz "Inserire interessi: "
emaildom: .asciiz "Inserire E-mail valida: "
passdom: .asciiz "Inserire password: "
ppdom: .asciiz "Profilo pubblico(0) o privato(1): "
menurid: .asciiz "\n\n\nModifica Profilo(1)\nMenu principale(0) :"
uscita: .asciiz "SEI USCITO"
intro: .asciiz " --------"
troppitx: .asciiz "\n\nIL NUMERO MASSIMO DI PROFILI È 10"
.text
main:
li $s2, 0
li $v0, 4
la $a0, intro
syscall
menupri:
#-------------------------------------------------------------------<<<<<<<MENU
li $v0, 4 # 4 è il codice di print_string
la $a0, menu # domanda all'utente
syscall
li $v0, 5 #leggo intero
syscall
move $t6,$v0 #memorizzo l'intero in t6
li $t1, 1
li $t2, 2
li $t3, 3
li $t4, 4
li $t5, 5
li $t0, 0
beq $t1, $t6, FUNZIONE_CREATION
beq $t2, $t6, FUNZIONE_MODIFICA
beq $t3, $t6, FUNZIONE_CANCELLAZIONE
beq $t4, $t6, FUNZIONE_LIST
beq $t5, $t6, FUNZIONE_RICERCA
beq $t0, $t6, USCITA
#----------------------------------------------------------------------------<<<<FUNCTION
.ent FUNZIONE_CREATION
FUNZIONE_CREATION:
bgeu $s2, 10, TROPPI #s2 indice e contatore
li $t1, 0
li $t2, 0
li $t3, 0
la $t1, nome #indirizzo dell'array
mul $t2, $s2, 4 #di quanto devo spostarmi t2=indice*4
add $t3, $t2, $t1 #indirizzo array di indice s2 è in t3
la $v0, 4 #nomedom
la $a0, nomedom
syscall #scrivo richiesta
li $v0, 8 # lettura
syscall
sw $v0, nome($t2)
add $s7, $s7, 1
li $v0, 4 # 4 è il codice di print_string
la $a0, menurid # domanda all'utente
syscall
li $v0, 5 #leggo intero
syscall
move $t2,$v0 #memorizzo l'intero in t2
li $t1, 1
li $t0, 0
beq $t1, $t2, FUNZIONE_MODIFICA #VA PASSATO L'INDICE COME ARGOMENTO
beq $t0, $t2, esci
esci:
#niente
.end FUNZIONE_CREATION
j menupri #torna al menu principale
.ent FUNZIONE_LIST
FUNZIONE_LIST:
#VISUALIZZA I PROFILI PUBBLICI, se pp= pubblico di un indice scrive
li $t0, 0#indice e contatore
li $t7, 0
li $t1, 0
li $t2, 0
li $t3, 0
li $t5, 0
loop:
bgt $t0, 9, esci1
la $t1, nome #indirizzo dell'array
mul $t2, $t0, 4 #di quanto devo spostarmi t2=indice*4
add $t3, $t2, $t1 #indirizzo array di indice t0 è in t3
#lw $t7, pp
beq $t7, $zero, scrittura #t7 è pp
scrittura:
li $v0, 4
la $a0, nome($t2)
syscall
addi $t0, $t0,1 #condizione e campi del ciclo #prima era sotto bgt
j loop
esci1:
#niente
.end FUNZIONE_LIST
j menupri #torna al menu principale
.ent FUNZIONE_RICERCA
FUNZIONE_RICERCA:
.end FUNZIONE_RICERCA
j menupri #torna al menu principale
.ent FUNZIONE_MODIFICA
FUNZIONE_MODIFICA:
.end FUNZIONE_MODIFICA
j menupri #torna al menu principale
.ent FUNZIONE_CANCELLAZIONE
FUNZIONE_CANCELLAZIONE:
.end FUNZIONE_CANCELLAZIONE
j menupri #torna al menu principale
.ent USCITAMEN
USCITAMEN:
j menupri
.end USCITAMEN
.ent TROPPI
TROPPI:
li $v0, 4
la $a0, troppitx
syscall
j menupri
.end USCITAMEN
#fine
USCITA:
li $v0, 4 # uscita
la $a0, uscita
syscall
li $v0,10
syscall
我猜您希望 nome
是一个整数数组。在这种情况下,您应该使用 $v0 = 1
而不是 $v0 = 4
。 4
in $v0
打印一个字符串。由于 nome
在每个位置都有 0
,因此 $v0
中 4
的值将 0
打印为 ASCII。而0
就是NULL
的ASCII值。这解释了您不需要的输出。
如果要将 0
打印为整数,则需要 $v0=1
.
改变这个:
lw $a0, nome($t2)
li $v0, 4
syscall
对此:
lw $a0, 0($t3) # Since you have $t3 = $t2 + $t1
li $v0, 1 # It is same as Address of nome[0] + index*4
syscall # which is same as Address of nome[i]; i being $t2