我可以在Assembly bne jsr swap
上做这样的事情,如果没有,我怎么能从C解决这个问题,提前谢谢
if(start!=pivot_index){
swap(board,start,pivot_index);
}
我被告知我必须写jsr
和sub-routine
,但我可以做这样的事情bne sub-routine
答案 0 :(得分:4)
在汇编中通常会被翻译成类似的东西(伪装配):
load [start]
compare [pivot_index]
branch-if-equal label1
push [pivot_index]
push [start]
push [board]
call swap
add-stack-pointer 12
label1:
即。如果控制表达式不为真,则if
语句将转换为跳过if
主体的跳转。
答案 1 :(得分:2)
当然可以这样做。在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
答案 2 :(得分:0)
不,您不能bne subroutine
代替jsr subroutine
,因为jsr
表示“跳转设置返回”。
它和条件分支指令之间的区别在于jsr
将返回地址压入堆栈,因此子例程知道返回的位置。如果您只使用bne
转移到子例程,则没有保存返回地址,因此子例程在完成时不知道返回的位置。
caf的回答显示了您处理这种情况的典型方式,您只需要将其转换为PDP-11操作。