|
把内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中
MAIN:MOV A,20H ;
SWAP A
PUSH ACC ;参数入栈
ACALL HEASC
POP ACC
MOV @R0,A ;存高位十六进制数转换结果
INC R0 ;修改指针
PUSH 20H ;参数入栈
ACALL HEASC
POP ACC
MOV @R0,A ;存低位十六进制数转换结果
SJMP $
HEASC:MOV R1,SP ;借用R1为堆栈指针
DEC R1
DEC R1 ;R1指向被转换数据
XCH A,@R1 ;取被转换数据
ANL A,#0FH ;取一位十六进制数
ADD A,#2 ; 所加值为MOVC与DB间字节数
MOVC A,@A+PC ;查表
XCH A,@R1 ;1字节指令,存结果于堆栈
RET ;1字节指令
ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
以上是题目和代码
问题:请详细解释以上代码,特别是子程序部分。为何要执行两次DEC R1才能指向被转换换数据,该数不是被压入了堆栈而在栈顶吗还为何用再变换栈顶指针?还有只是把栈顶指针的值赋给了R1,而R1在子程序最后指向的并不是栈顶元素,为何弹出的元素确实@R1指向的元素并不是SP指向的栈顶元素(因为SP的值并没有被更改)?多谢!
|
|