我无法在 Mips 中打印 "enter"
I can't print "enter" in Mips
我正在将 C 代码转换为 Mips 代码
C代码为
int main(void) {
int i;
int data [10] = { 10, -2, 5, 22, 99, 0, -5, 8, 30, 7};
for(i=0; i<10; i++){
printf("%d\n", data[i]);
}
return 0;
}
我的 Mips 代码是
.data
data: .space 10
enter: .asciiz "\n"
.text
.globl main
main:
addi $s0, $zero, 10
add $t0, $zero, $zero
sw $s0, data($t0)
addi $s0, $zero, -2
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 5
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 22
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 99
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 0
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, -5
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 8
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 30
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 7
addi $t0, $t0, 4
sw $s0, data($t0)
addi $t0, $zero, 0
Loop: slti $t1, $t0, 10
beq $t1, $zero, Exit
mul $t2, $t0, 4
li $v0, 1
lw $a0, data($t2)
syscall
li $v0, 4
la $a0, enter
syscall
addi $t0, $t0, 1
j Loop
Exit:
end:
li $v0, 10
syscall
s1 用于保存一个值。
t0 用于索引
t1 是 slt 的标志
t1 乘以 4 是 t2
你应该只关注
li $v0, 4
la $a0, enter
syscall
它打印
10-2522990-58307
ddddddddddddddddddddddddddddddasdfasdfasdfasdfasdfasdfasdf
请帮我 dddddddddddddddddddddddddddddddddddddddd
您没有为 data
数组预留足够的内存。 .space 10
保留 10 bytes 内存,但您正试图存储 10 words(40 字节)。所以你最终覆盖了换行符。
如果将声明更改为 data: .space 40
,您应该会得到预期的输出。
我正在将 C 代码转换为 Mips 代码
C代码为
int main(void) {
int i;
int data [10] = { 10, -2, 5, 22, 99, 0, -5, 8, 30, 7};
for(i=0; i<10; i++){
printf("%d\n", data[i]);
}
return 0;
}
我的 Mips 代码是
.data
data: .space 10
enter: .asciiz "\n"
.text
.globl main
main:
addi $s0, $zero, 10
add $t0, $zero, $zero
sw $s0, data($t0)
addi $s0, $zero, -2
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 5
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 22
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 99
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 0
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, -5
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 8
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 30
addi $t0, $t0, 4
sw $s0, data($t0)
addi $s0, $zero, 7
addi $t0, $t0, 4
sw $s0, data($t0)
addi $t0, $zero, 0
Loop: slti $t1, $t0, 10
beq $t1, $zero, Exit
mul $t2, $t0, 4
li $v0, 1
lw $a0, data($t2)
syscall
li $v0, 4
la $a0, enter
syscall
addi $t0, $t0, 1
j Loop
Exit:
end:
li $v0, 10
syscall
s1 用于保存一个值。 t0 用于索引 t1 是 slt 的标志 t1 乘以 4 是 t2
你应该只关注
li $v0, 4
la $a0, enter
syscall
它打印 10-2522990-58307
ddddddddddddddddddddddddddddddasdfasdfasdfasdfasdfasdfasdf
请帮我 dddddddddddddddddddddddddddddddddddddddd
您没有为 data
数组预留足够的内存。 .space 10
保留 10 bytes 内存,但您正试图存储 10 words(40 字节)。所以你最终覆盖了换行符。
如果将声明更改为 data: .space 40
,您应该会得到预期的输出。