Assembly 需要调试程序集代码的帮助(HCS 12)

Assembly 需要调试程序集代码的帮助(HCS 12),assembly,subroutine,68hc12,Assembly,Subroutine,68hc12,调试时需要帮助,当汇编代码转到我的子程序时,它将打印出寄存器B的值而不是寄存器A的值。非常感谢您的帮助 dc.b "Type a character" dc.b 0 ; using zero terminated strings LDS #ROMStart ; load stack pointer JSR TermInit ; needed for Si

调试时需要帮助,当汇编代码转到我的子程序时,它将打印出寄存器B的值而不是寄存器A的值。非常感谢您的帮助

            dc.b    "Type a character"
            dc.b    0    ; using zero terminated strings

         LDS   #ROMStart         ; load stack pointer
         JSR   TermInit         ; needed for Simulator only
LOOP
         LDD   #PROMPT          ; pass the adr of the string
         JSR     printf     ; print the string         
         JSR     getchar     ; call getchar function -result is: character in B
         JSR    putchar
         CMPB           ‘W’     ;COMPARE USER INPUT TO W
         BNE     LOOP       ;
         JSR    WFCN
-------------------------------------------------------------------------------------------------------
  WFCN  PSHA
        LDAA    #$3D
        EORA     #$6F
        JSR     out2hex
        PULA
        RTS```


这些C函数的名称总是令人误解
getchar
返回一个
int
char
,16位。类似地,
putchar
采用16位
int
参数。因此,您的特定调用约定很可能使用双累加器D(Codewarrior调用约定就是这样工作的)


由于D=A+B(和big-endian),您期望的结果最终会出现在ls字节累加器B中。

这台机器的寄存器非常有限。虽然返回值是在寄存器中完成的,但我相信参数是在堆栈上传递的。因此,您需要在
JSR putchar
之前将要打印的值推送到堆栈上。你能把
B
寄存器推到堆栈上吗?Thx Chris这实际上就是我在我的子程序中所做的(pshb),然后清除它并将我想要打印的值存储到寄存器B上。对于立即模式,这应该是
CMPB#“W”
(注意
符号)。另外,
LDAA
然后
EORA
两个立即操作数都可以被一个带有异或结果(
LDAA#$52
)的
LDAA
替换,因为它们都是常量,结果可以由汇编程序或程序员计算。