我可以在 Assembly 上做这样的事情吗 bne jsr swap
,如果不是,我该如何从 C 中解决这个问题,在此先感谢
if(start!=pivot_index){
swap(board,start,pivot_index);
}
我被教导我必须写作jsr
,sub-routine
但我能做这样的事情吗bne sub-routine
在通常会被翻译成这样的东西的汇编中(伪汇编):
load [start]
compare [pivot_index]
branch-if-equal label1
push [pivot_index]
push [start]
push [board]
call swap
add-stack-pointer 12
label1:
IE。如果控制表达式不为真,该if
语句将转换为跳过主体的跳转。if
你当然可以做到这一点。在 x86 上,您需要两个分支:
# assume EAX = start, EBX = pivot_index
cmp eax, ebx
beq .SkipSwap
call swap
.SkipSwap:
对于 ARM 程序集,它更容易,因为您可以使用条件分支:
# assume r0 = start, r1 = pivot_index
cmp r0, r1
blne swap
不,你不能bne subroutine
代替jsr subroutine
,因为jsr
意味着“跳转设置返回”。
它与条件分支指令的区别在于,它将jsr
返回地址压入堆栈,因此子程序知道从哪里返回。如果您只是使用 跳转到子程序bne
,则没有保存返回地址,因此子程序不知道完成后返回到哪里。
caf 的回答向您展示了处理该问题的典型方式,您只需将其转换为 PDP-11 操作即可。