【问题标题】:MIPS using arrays with any number problemMIPS 使用具有任意数量问题的数组
【发布时间】:2018-09-04 07:35:18
【问题描述】:
  .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, m($s1) sw $t3, 48($s1)

都给我错误。这意味着它们是完全错误的并且基本上是错误的语法。但我不知道除此之外还能做什么。

【问题讨论】:

    标签: arrays mips offset


    【解决方案1】:

    如果您在 MIPS 指令集参考中查找 lwsw,很明显没有任何形式的指令可以匹配,例如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) 是完全有效的,所以当你说它给你一个错误时,你不清楚你的意思。

    【讨论】:

    • 你的最后一行代码 'lw $t1, ($t0)' 似乎也不是合法指令——它只是返回一个错误。
    • 这是一个完全有效的指令。确切的错误信息是什么?你还没有说清楚你使用的是哪个汇编器。
    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多