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