带汇编语言的HCS12后缀计算器

时间:2016-03-14 08:20:25

标签: assembly stack branch

我无法弄清楚如何让我的代码只能根据分支语句访问某些函数。而不是跳过它不相等的函数它只是通过第一个函数,然后永远循环只访问第一个函数,当我希望它在一定长度后停止并且只访问它需要访问的函数。我编写了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

使用Freescale CodeWarrior IDE

1 个答案:

答案 0 :(得分:0)

这个问题看起来像C中常见的开关/案例,你写的是

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