MIPS с использованием массивов с любой проблемой числа - PullRequest
0 голосов
/ 04 сентября 2018
  .data
  .align 2
Z:  .word  6, 7, 8 ,9 , 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36
k:  .word  0            
m:  .word  0            

  .text
  .globl main
main:                   # main is global label
  addu  $s7, $0, $ra    # save return address
  lw  $s1, Z            # base address of Z in $s1

#------------------------------------getting k
  .data
  .globl  message1  
message1:  .asciiz "\nInput value for k: "  #string to print

  .text
  li  $v0, 4            # print_string (system call 4)
  la  $a0, message1     # takes the address of string as an argument 
  syscall
  li  $v0, 5            # read_int (system call 5) 
  syscall
  add  $t1, $0, $v0     # -> $s2
  sw  $t1, k            # k is stored
#------------------------------------getting m
  .data
  .globl  message2
message2:  .asciiz "\nInput value for m: "    #string to print

  .text
  li  $v0, 4            # print_str (system call 4)
  la  $a0, message2     # takes the address of string as an argument 
  syscall
  li  $v0, 5            # read_int (system call 5)
  syscall
  add  $s3, $0, $v0     # -> $s3
  sw  $s3, m            # m is stored


#-----------------------------------calculating Z[12] = Z[k] + Z[k+m]
  .text
  lw $t0, k($s1)        # store Z[k] -> $t0
  add $t1, $s2, $s3     # k + m -> $t1
  lw $t2, m($s1)        # store Z[k+m] -> $t2
  add $t3, $t0, $t2     # Z[k] + Z[k+m] -> $t3
  sw $t3, 48($s1)       # store Z[k] + Z[k+m] -> Z[12]

Кажется, я не понимаю, почему вычисление Z [12] = Z [k] + Z [k + m] кода является полным провалом и просто приводит к ошибкам. Я попытался просмотреть мои заметки и прочитать руководство, но не повезло. я упускаю что-то важное ...

я предполагаю, что это как-то связано с вычислением смещения ?? как lw $ t0, k ($ s1) lw $ t2, м ($ s1) sw $ t3, 48 ($ s1)

все дают мне ошибки. Это означает, что они совершенно неверны и в основном неверный синтаксис. но я не знаю, что делать кроме этого.

1 Ответ

0 голосов
/ 04 сентября 2018

Если вы посмотрите на lw и sw в справочнике по набору команд MIPS, должно стать очевидным, что нет такой формы инструкций, которая соответствует, например, lw $t0, k($s1).

Некоторые ассемблеры на самом деле принимают их как псевдоинструкции (ассемблер преобразует их в две или более фактические инструкции), но имеет значение, отличное от того, на которое вы надеетесь: например, lw $t0, k($s1) будет иметь значение $t0 = k[$s1], , а не $t0 = $s1[k].

Вам нужно сделать что-то вроде этого:

lw $t0, k
sll $t0, $t0, 2     # t0 = k * sizeof(word)
addu $t0, $t0, $s1  # t0 += &Z
lw $t1, ($t0)

Обратите внимание, что sw $t3, 48($s1) совершенно правильно, поэтому неясно, что вы имеете в виду, когда говорите, что оно дает вам ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...