Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从内存地址返回值_Assembly_Mips - Fatal编程技术网

Assembly 从内存地址返回值

Assembly 从内存地址返回值,assembly,mips,Assembly,Mips,我必须在汇编(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", M

我必须在汇编(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)); 
在编写这段代码时,我可以看到我正在按预期读取第二个函数参数。它打印在屏幕上
最大值为9
将代码更改为:

    .data

    .text
    .globl  MaxAssembly

MaxAssembly:
    move    $2,$4
    jr  $ra
我可以看到它正在读取函数的第一个参数作为内存地址,并打印在屏幕上
最大值为2143429780
。到目前为止,它的工作正如预期的那样

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

    .data

    .text
    .globl  MaxAssembly

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

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

是,
lw$s0,0$a0
将从
$a0
$s0
中的地址读取一个完整的单词。与lb不同,通过lw的内存访问必须使用字对齐地址(即,两个LSB为零)。我怀疑这就是问题所在。

发现了问题。寄存器16至23是功能寄存器,必须保留。使用了8到15个寄存器,所有寄存器都按预期运行:)@Favolas Yes寄存器16-23($s0-$s7)应保留。这就是为什么您通常使用$t0-$t7(寄存器8-15)。但是,这不会导致lw发生故障。但是,如果使用它,将导致寄存器$s0出现(可能)问题。(但这个问题会发生在被叫人身上)
    .data

    .text
    .globl  MaxAssembly

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