| 仔细看了下,这段代码其实就是OS的任务切换代码,上面的H,X,A出入栈注释不准确,至于你说的PC指针的问题,我后面会试着解释一下,重新注释如下: 
 PSHH    ;保存当前的H值,因为每个任务的H值可能会不同。
 PSHX    ;同上
 PSHA    ;同上
 TSX      ;SP的值(是栈地址)加1后,赋给H:X,即 H:X = SP+1
 PSHH   ;H入栈,也就是SP地址的高字节入栈
 PULA   ;SP地址的高字节从栈中弹出到A,其实这句与上句,功能就是A = H
 STA OSMainOrIntSp.Byte.bAddrH  ;   OSMainOrIntSp.Byte.bAddrH = A
 STX OSMainOrIntSp.Byte.bAddrL   ;   OSMainOrIntSp.Byte.bAddrL = X
 
 LDX OSModeSp.Byte.bAddrL     ; X= OSModeSp.Byte.bAddrL
 LDA OSModeSp.Byte.bAddrH     ; A=  OSModeSp.Byte.bAddrH
 PSHA                                         ;
 PULH                                         ;与上句一起,就是 H = A
 TXS                                           ; SP = H:X -1
 PULA                                         ;恢复新任务的A值
 PULX                                         ;恢复新任务的X值
 PULH
 =====================================
 由于代码不完整,只能试着推测一下。中断时,执行OsTmIntIsrAsm之前的PC值,也就是当前任务的返回值,会入栈,在OsTmIntIsrAsm之中,接着会H,X,A入栈,这些都是当前任务的运行环境,然后,把当前的SP指针赋给H:X, 并最保存到OSMainOrIntSp,也就是保存当前的运行环境到OSMainOrIntSp。接着从OSModeSp中恢复一个新的运行环境。至入OSModeSp在何处被写入的,代码并不完整,所以不得而知。 如果你画出栈的详细图,就清楚了。
 |