【问题标题】:MIPS swap procedure/function QuestionsMIPS 交换过程/功能问题
【发布时间】:2023-03-17 09:37:01
【问题描述】:

我是 MIPS 的新手,虽然我有点了解如何使用它来完成基本任务,但我在处理过程/功能方面遇到了很大的困难。

我希望有人能解释如何解决一个简单的 CPP 程序,例如

void swap( int & a, int & b )
{
  register int t;
  t = a; a = b; b = t;
}

进入 MIPS。 在课堂上我们讨论了帧指针和堆栈指针,偏移量,我只是迷路了。如何将 int a 和 int b 传递给函数?你如何返回一个值并在 MIPS 中使用它?我已经看到数组有类似的问题,但希望有人可以帮助我解决一个只需要交换两个整数的问题。谢谢。

【问题讨论】:

  • 不清楚您想要什么作为答案。 “解决一个简单的 CPP 程序”是什么意思? - 解释它在 C 级别上是如何工作的?它会如何看待 asm 级别?它在 asm 级别如何工作?
  • 对不起,我的意思是你将如何用汇编语言/MIPS 实现它。
  • 为什么不compile it and see for yourself?您可能需要关闭任何优化,以免它们影响画面。
  • 如果您使用指针而不是引用变量,您可能会发现这更容易。即 void swap(int *a,int *b){register int t; t=*a;*a=*b;*b=t;} 调用使用swap(&c,&d);

标签: stack mips swap


【解决方案1】:

首先,您不应在 C++ 中使用关键字 register,如 it is deprecated 和大多数情况下的 as meaningful as whitespace

如何将 int a 和 int b 传递给函数?

您将 a 和 b 存储在您将在子程序中使用的寄存器中。

如果你想交换一个数组中的两个值,比如 0x80080000:

lui $t0, 0x8008     ;$t0 = 0x80080000
lw  $t1 0($t0)      ;load (0x80080000) in $t1
lw  $t2 4($t0)      ;load (0x80080004) in $t2
sw  $t1 4($t0)      ;store $t1 in 0x80080004
sw  $t2 0($t0)      ;store $t2 in 0x80080000

如果你想交换两个寄存器的值(xor swap algorithm):

xor $t0, $t0, $t1
xor $t1, $t0, $t1
xor $t0, $t0, $t1

或者,如果您关心可读性:

add $t2, $r0, $t0
add $t0, $r0, $t1
add $t1, $r0, $t2

【讨论】:

  • 不要使用 xor 来交换值 --- 如果 $t0$t1 包含相同的值,你最终会得到 $t0=$t1=0
  • $t0=9 ; $t1=9 ; $t0=$t0^$t1=9^9=0 ; $t1=$t0^$t1=0^9=9 ; $t0=$t0^$t1=0^9=9。所以不,你不会得到 $t0=$t1=0。请删除您不合理的-1。
  • 对不起,是的。仅当 $t0$t1 引用相同的 location 时才会出现问题(当然它们不是,因为它们是不同的寄存器)。不幸的是,在编辑帖子之前我无法删除反对票(不知道为什么)。
  • 我已编辑答案以添加指向异或算法维基百科页面的链接。没有必要,使答案比需要的长一点,但它似乎是人们删除帖子中 -1 的唯一方法。
【解决方案2】:

您可以创建一个进行交换的函数。 类似的东西:

swap:                # Swap function

addi    $sp,$sp,-4  
sw  $t0, 0($sp)      # Stack[0] = $t0
    
add $t0,$a0,$zero    # $t0 = $a0
add $a0,$a1,$zero    # $a0 = $a1
add $a1,$t0,$zero    # $a1 = $t0 (swapping $a0 and $a1)

lw  $t0,0($sp)
addi    $sp,$sp,4   # $t0 = Stack[0]
jr  $ra             # Return to the code 

并使用Swap函数,如下:

li  $a0,100    # $a0 = 100
li  $a1,33     # $a1 = 33

jal swap       # Swapping $a0 & $a1

注意:寄存器的名称不重要,你可以使用其他的。

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多