我必须在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
是相同的
答案 0 :(得分:1)
是的,lw $s0, 0($a0)
会从$a0
到$s0
的地址读取完整的字词。与lb不同,通过lw的存储器访问必须使用字对齐的地址(即,两个LSB为零)。我怀疑这就是问题发生的地方。