подпрограммы по сборке - PullRequest
4 голосов
/ 23 мая 2010

могу ли я сделать что-то подобное на сборке bne jsr swap, если нет, то как я могу решить эту проблему из C, заранее спасибо

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

Меня учили, что я должен написать jsr и sub-routine, но могу ли я сделать что-то подобное bne sub-routine

Ответы [ 3 ]

4 голосов
/ 23 мая 2010

В сборке, которая обычно переводится в нечто подобное (псевдосборка):

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, если управляющее выражение неверно.

2 голосов
/ 23 мая 2010

Конечно, вы можете сделать это. На 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
0 голосов
/ 23 мая 2010

Нет, вы не можете сделать bne subroutine вместо jsr subroutine, потому что jsr означает «возврат настройки перехода».

Разница между этим и условными инструкциями ветвления заключается в том, что jsr помещает адрес возврата в стек, поэтому подпрограмма знает, куда возвращать. Если вы просто переходите к подпрограмме, используя bne, обратный адрес не сохраняется, поэтому подпрограмма не знает, куда возвращаться после завершения.

Ответ caf показывает вам типичный способ, которым вы справитесь с этим, вам просто нужно перевести его в операции PDP-11.

...