代码之家  ›  专栏  ›  技术社区  ›  user6719511

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

  •  0
  • user6719511  · 技术社区  · 9 年前

    不擅长转换,尤其是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
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Craig Estey    9 年前

    好的,这是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 “suffix”代表 未签名的 但是 就像它在很多其他地方使用一样。

    有两个版本 add ]. 这个 签署 版本为 添加 未签名的 版本 他们 二者都 生产 确切地 结果相同,因为它们都做了相同的两个补码加法。

    这个 只有 不同的是,如果加法导致溢出, 添加 将生成处理器异常(例如“算术溢出”),但 添加 --它就这样包装好了。类似于 sub 和下溢。

    例如,如果寄存器 0x7FFFFFFF 如果在其中添加一个,则会导致溢出。那是因为你从最大签名开始 积极乐观的 价值,你 添加 一对一,并且 您已达到签名上限 消极的 值(即称为溢出的“量子跳跃”)。

    因此,当添加可能 合法地

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

    例如,堆栈可能从开始 0x80001000 如果您向其上推送足够的数据(即 $sp 寄存器被递减 附属的 ),它最终将袭击 0x80000000 。当您在该地址附近按下/弹出时,会出现溢出/下溢。

    这是 错误——这是很自然的,您不希望处理器在执行 附属的 对于推送操作,因此您使用 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