【问题标题】:HCS12 postfix calculator with assembly language带有汇编语言的 HCS12 后缀计算器
【发布时间】:2016-03-14 08:20:25
【问题描述】:

我无法弄清楚如何让我的代码仅访问基于分支语句的某些函数。而不是跳过它不等于的函数,它只是通过第一个函数,然后永远循环,只在我希望它在一定长度后停止并且只访问它需要访问的函数时才访问第一个函数。我编写了 C++ 代码来帮助我弄清楚我缺少什么并且我得到了它的工作,但我不知道如何将它转换成汇编语言。如果有人能给我一些建议或者给我更多关于如何使用每个分支以及哪些分支在这种情况下可以很好地工作的说明,那就太好了。提前致谢! :D

       XDEF      Entry       ; export 'Entry' symbol
       ABSENTRY  Entry       ; for absolute assembly: mark this as application entry point

       ROM:          EQU     $0400
       DATA:        EQU     $1000
       PROG:     EQU     $2000

     ORG     DATA         
      ORG     PROG
   EQUATION      FCB $05, $01, $02, $2B, $04, $2A, $2B, $03, $2D     ;(512+4*+3-)
   INDEX         FCB $00
   TEMP          FCB $00
   ; Insert your code following the label "Entry"          
    Entry:                          ; KEEP THIS LABEL!!

      LDS     #PROG
      LDX    #EQUATION
      LDAB   INDEX

   LOOP:
LDAA  B,X
TSTA

CMPA #$2F
BEQ    DIVIDE
DIVIDE:
STAB   TEMP
PULX
PULD
IDIVS
PSHD
PULA
LDAB  TEMP
BRA     RET

CMPA #$2D
BEQ     SUBTRACT
SUBTRACT:
STAB     TEMP
PULB
PULA
SBA
PSHA
LDAB     TEMP
BRA     RET

CMPA #$2B
BEQ     ADD
ADD:
STAB     TEMP
PULA
PULB
ABA
PSHA
LDAB     TEMP
BRA     RET

CMPA #$2A
BEQ      MULTIPLY
MULTIPLY:
STAB     TEMP  
PULA
PULB
MUL
PSHA
LDAB     TEMP
BRA     RET    

PSHA
RET:
INCB
CMPB $09     
BHI     LOOP





      ; Branch to end of program
      BSR     FINISH           
       FINISH: END

使用飞思卡尔 CodeWarrior IDE

【问题讨论】:

    标签: assembly stack branch


    【解决方案1】:

    这个问题看起来像是 C 语言中常见的 switch/case 问题,你在其中编写

    switch(char) {
        case '*' : <do multiply> break;
        case '/' : <do divide> break;
        case '+' ...
    

    如果条件不满足,则跳过每个代码块。组装中的正常方法是相似的,看起来就像你尝试的那样。但是:你的跳跃条件是错误的

       cmp <value>
       beq label
    label:
    

    这个总是跳转到(或自动移动到)标签。

    你已经反转了分支条件:

        CMPA #$2F
        BNE    NO_DIVIDE    ; it'S NOT a divide, so skip the code for divide
    DIVIDE:
        STAB   TEMP
        PULX
        PULD
        IDIVS
        PSHD
        PULA              ; what is this for??
        LDAB  TEMP
        BRA     RET
    NO_DIVIDE:
    

    另一种选择是,将所有操作放在一组子函数中,并从比较中跳转到它们,就像您尝试的那样(这对于有限的分支范围通常是不可能的):

    CMPA #$2f
    BEQ DIVIDE
    CMPA #$2D
    BEQ SUBTRACT
    CMPA #$2B
    BEQ ADD
    CMPA #$2A
    BEQ MULTIPLY
    ...
    
    DIVIDE:
        <do the divide stuff>
        BRA RET
    MULTIPLY:
        <do the multiply stuff>
        BRA RET
    etc
    

    【讨论】:

    • 非常感谢!它按照现在的方式运行:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多