Я не могу напечатать "войти" в Mips - PullRequest
0 голосов
/ 28 сентября 2019

Я конвертирую код 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

dddddddddddddddddddddddddddddddddddasdfasdfasdfasdfasdfasdf1016 *

Пожалуйста, помогите мне dddddddddddddddddddddddddddddddddddd

1 Ответ

0 голосов
/ 28 сентября 2019

Вы не зарезервировали достаточно памяти для массива data..space 10 резервирует 10 байтов памяти, но вы пытаетесь сохранить 10 слов (40 байтов).В итоге вы перезаписываете символ новой строки.

Если вы измените объявление на data: .space 40, вы должны получить ожидаемый результат.

...