Assembly 从内存地址返回值
我必须在汇编(MIPS)中编写一个函数来返回数组的最大值 C代码如下所示: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
#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