4

我可以在 Assembly 上做这样的事情吗 bne jsr swap,如果不是,我该如何从 C 中解决这个问题,在此先感谢

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

我被教导我必须写作jsrsub-routine但我能做这样的事情吗bne sub-routine

4

3 回答 3

4

在通常会被翻译成这样的东西的汇编中(伪汇编):

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

于 2010-05-23T11:44:51.533 回答
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
于 2010-05-23T11:44:46.073 回答
0

不,你不能bne subroutine代替jsr subroutine,因为jsr意味着“跳转设置返回”。

它与条件分支指令的区别在于,它将jsr返回地址压入堆栈,因此子程序知道从哪里返回。如果您只是使用 跳转到子程序bne,则没有保存返回地址,因此子程序不知道完成后返回到哪里。

caf 的回答向您展示了处理该问题的典型方式,您只需将其转换为 PDP-11 操作即可。

于 2010-05-23T12:03:08.737 回答