Assembly 需要调试程序集代码的帮助(HCS 12)
调试时需要帮助,当汇编代码转到我的子程序时,它将打印出寄存器B的值而不是寄存器A的值。非常感谢您的帮助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
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
替换,因为它们都是常量,结果可以由汇编程序或程序员计算。