簡體   English   中英

大會上的子程序

[英]sub-routines on Assembly

我可以在Assembly bne jsr swap上做這樣的事情,如果沒有,我怎么能從C解決這個問題,提前謝謝

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

我被教導我必須編寫jsrsub-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:

即。 if控制表達式不為真, 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操作即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM