使用数组转换为MIPS汇编语言

本文关键字:MIPS 汇编语言 转换 数组 | 更新日期: 2023-09-27 18:02:35

不擅长转换,尤其是MIPS汇编语言。

这是原始代码:

void swap(int v[], int k, int j) { 
int temp; 
temp = v[k]; 
v[k] = v[j]; 
v[j] = temp; 
}

在一些帮助下,我们设法做到了这一点,现在我需要将其转换为MIPS汇编代码,只是刚刚完成学习Java仍然是一个新手。欢迎任何帮助。

k = k << 2;
k = k + v
j = j << 2;
j = j + v
temp0 = load(k)
temp1 = load(j)
store(k) = temp1
store(j) = temp0

使用数组转换为MIPS汇编语言

好的,这是asm。它是基于上面的伪代码的,但是我是基于顶部的HLL从头开始编写的。

符合 mips ABI。因此,可以自由地更改(即销毁)参数寄存器。因此,如果在循环中调用,调用方必须在每次调用之前设置a0-a3

#   void
#   swap(int v[],int k,int j)
#   {
#       int temp;
#
#       temp = v[k];
#       v[k] = v[j];
#       v[j] = temp;
#   }
# swap -- swap two elements in an array
#
# arguments:
#   a0 -- pointer to array
#   a1 -- array index "k"
#   a2 -- array index "j"
#
# registers:
#   t0 -- v[k]
#   t1 -- v[j]
swap:
    sll     $a1,$a1,2               # k <<= 2 (i.e. byte offset)
    addu    $a1,$a1,$a0             # get address of v[k]
    sll     $a2,$a2,2               # j <<= 2 (i.e. byte offset)
    addu    $a2,$a2,$a0             # get address of v[j]
    lw      $t0,0($a1)              # fetch v[k]
    lw      $t1,0($a2)              # fetch v[j]
    sw      $t1,0($a1)              # v[k] = v[j]
    sw      $t0,0($a0)              # v[j] = v[k]
    jr      $ra                     # return

更新:

我知道sll代表向左移位。addu代表什么?

u"后缀"表示无符号。但是,不像在其他很多地方使用。

[add]有两个版本。有符号版本为add无符号版本为addu。它们产生完全相同的结果,因为它们都做了相同的两个补相加。

唯一的区别是,如果加法导致溢出,add将生成处理器异常(例如:"算术溢出"),但是addu而不是——它会自动换行。sub和underflow类似。

例如,如果一个寄存器中有0x7FFFFFFF,你给它加一个,这会导致溢出。这是因为你从最大的有符号值开始,你加上 1,然后瞧,你就在最大的有符号值处(即称为溢出的"量子飞跃")。

因此,当添加可能合法溢出的东西时(即如地址计算,最好使用无符号版本。

这是因为,在mips中,程序[代码/数据/堆栈]的某些部分可能在0x80000000或更高的位置加载。

例如,堆栈可能从0x80001000开始,如果你将足够的数据压入其中(即$sp寄存器与sub一起递减),它最终会到达0x80000000的邻域。当你在这个地址附近推/弹出时,你会得到溢出/下溢

不是错误——这是很自然的,你不希望处理器在执行sub进行push操作时产生异常,所以你使用subu[和/或指令subiu直接形式]。

如果你还没有找到它,这里有一个很好的指令集参考[很多人使用]:http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html它很容易阅读,涵盖了大多数你可能需要/使用的指令。

下面是ABI调用约定的简要概述:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/altReg.html