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