MIPS从内存地址返回值

时间:2012-04-08 14:36:27

标签: assembly mips

我必须在Assembly(MIPS)中编写一个函数来返回数组的最大值。

C代码是这样的:

#include <stdio.h>
#include <stdlib.h>

int MaxAssembly(int *ptr, int num_elements); 

int main ( ) 
{ 
  int n=9; 
  int tab[] = {2, -8, 0, 25, 14, 2, 9, 15, -32}; 
  printf("The maximum is %d \n", MaxAssembly(tab,n)); 

MaxAssembly是我必须在Assembly中编程的函数。

我不是在找到最大值的部分。我在阅读函数参数时遇到的问题。我已经使这段代码做了一些测试。

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    add $9,$5,$zero
    move    $2,$9
    jr  $ra

执行此代码我可以看到我正在按预期读取第二个函数参数。它打印在屏幕上The maximum is 9 将代码更改为:

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    move    $2,$4
    jr  $ra

我可以看到它正在将该函数的第一个参数作为内存地址读取,并将其打印在屏幕The maximum is 2143429780上。到目前为止工作正如预期的那样。

问题是当我尝试读取存储在该内存地址的元素(数组的第一个元素)时。我收到一个分段错误... 我这样做:

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    lw      $16,0($4)
    move    $2,$16
    jr  $ra

我做错了什么?是不是lw应该存储在$16阵列的第一项?使用lb是相同的

1 个答案:

答案 0 :(得分:1)

是的,lw $s0, 0($a0)会从$a0$s0的地址读取完整的字词。与lb不同,通过lw的存储器访问必须使用字对齐的地址(即,两个LSB为零)。我怀疑这就是问题发生的地方。