HCS12 汇编语言后缀计算器

HCS12 postfix calculator with assembly language

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

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

       ROM:          EQU     00
       DATA:        EQU     00
       PROG:     EQU     00

     ORG     DATA         
      ORG     PROG
   EQUATION      FCB , , , B, , A, B, , D     ;(512+4*+3-)
   INDEX         FCB [=10=]
   TEMP          FCB [=10=]
   ; Insert your code following the label "Entry"          
    Entry:                          ; KEEP THIS LABEL!!

      LDS     #PROG
      LDX    #EQUATION
      LDAB   INDEX

   LOOP:
LDAA  B,X
TSTA

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

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

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

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

PSHA
RET:
INCB
CMPB      
BHI     LOOP





      ; Branch to end of program
      BSR     FINISH           
       FINISH: END

使用飞思卡尔 CodeWarrior IDE

问题看起来像 C 中的常见问题 switch/case,您在其中编写

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

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

   cmp <value>
   beq label
label:

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

你已经反转了分支条件:

    CMPA #F
    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 #f
BEQ DIVIDE
CMPA #D
BEQ SUBTRACT
CMPA #B
BEQ ADD
CMPA #A
BEQ MULTIPLY
...

DIVIDE:
    <do the divide stuff>
    BRA RET
MULTIPLY:
    <do the multiply stuff>
    BRA RET
etc