【问题标题】:sub-routines on Assembly汇编中的子程序
【发布时间】:2010-05-23 11:39:06
【问题描述】:

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

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

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

【问题讨论】:

  • pdp-11 但我在 windows 上工作,有模拟器

标签: c assembly pdp-11


【解决方案1】:

在通常会被翻译成这样的东西的程序集中(伪程序集):

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】:

    当然可以。在 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
    

    【讨论】:

    • 抱歉,我正在使用 pdp-11 模拟器,我可以做同样的事情吗?
    • 好吧。对于 PDP11 采用 x86 代码,调整寄存器的名称并使用 jsr 而不是调用跳转.. 应该可以。
    【解决方案3】:

    不,你不能用bne subroutine代替jsr subroutine,因为jsr的意思是“跳转设置返回”。

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多