汇编中的子程序

时间:2010-05-23 11:39:06

标签: c assembly pdp-11

我可以在Assembly bne jsr swap上做这样的事情,如果没有,我怎么能从C解决这个问题,提前谢谢

if(start!=pivot_index){
  swap(board,start,pivot_index);
 }

我被告知我必须写jsrsub-routine,但我可以做这样的事情bne sub-routine

3 个答案:

答案 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操作。