- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想将下面的 C 代码翻译成汇编语言。
但是,我没有看到我需要在这个例子中使用堆栈。
此外,我想知道“beq”是否像“jal”那样将后面指令的地址保存在$ra中,因为当循环结束时,我想回到原来的函数foo , 并继续说明(这里只是返回。)
int foo(int* a, int N) {
if(N > 0)
{
for(int i = 0; i != N; i = i + 1)
{
a[i] = bar(i << 4, a[i]);
}
}
return N & 7;
}
#assume *a in $a0, N $N in $a1
foo:
slt $t0, $zero, $a1 #put 1 in $t0 if 0 < N
li $t1,0 # use $t1 as loop counter
beq $t0, 1, loop # enter loop if 0 < N
and $v0, $a1, 7 # do bitwise and on N and 7 and save in $v0 as return value
loop:
beq $t1, $a1, exit # exit loop when i = N
sll $t3, $t1, 2 # obtain 4 * i
add $t3, $a1, $t3 # obtain address of a[i] which is address of a plus 4i
lw $t3, o($t3) # load a[i] into $t3
sll $t4, $t1, 4 #perform i<< 4 and save in $t4
# the 2 previous load arguments for bar
jal bar # assume bar saves return value in $v2
sw $t3, 0($v1)
j loop
exit:
and $v0, $a1, 7
最佳答案
beq
用于条件分支,而不是调用——它改变了 PC
(有条件地)但不是 $ra
.我们用它来将结构化语句(例如 if、for)翻译成汇编语言的 if-goto 风格。
However, I do not see that I need to use the stack in this example.
您必须为此代码使用堆栈,因为对 bar
的调用(如 jal bar
)将消灭 foo
s $ra
,同时 bar
将能够回到foo
, foo
将无法返回给它的调用者。由于这需要堆栈,因此您需要 prologue and epilogue分配和释放一些堆栈空间。
您的代码没有正确地将参数传递给 bar
, i << 4
,例如,应传入 $a0
, 而 a[i
] 应该传入 $a1
.
您在 foo
中没有返回说明— 它缺少 jr $ra
.
关于c - 如何在程序集循环后转移控制权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290144/
所以我使用 PyGame 制作了 Pong,我想使用遗传算法让 AI 学习玩这个游戏。我希望它只知道其桨、球和控件的位置。我只是不知道如何让人工智能自己移动桨。我不想这样做:“如果球在你上方,就向上。
我有包含 4 个子选项卡的 TabControl。 每个选项卡都包含图片框控件。 我需要获取选中的Tab控件的图片框控件。 知道如何实现吗? 最佳答案 也许 var picBox = TabContr
我需要使用 Java 代码控制 Windows XP 的 Windows,我需要单击/键入 windowsXP 给定窗口的特定按钮/文本字段,如何做到这一点有什么想法吗? 我尝试过的方法是:(1) 我
我是一名优秀的程序员,十分优秀!