|
楼主 |
发表于 2011-8-12 13:34:07
|
显示全部楼层
咱就再发个技术贴吧,c_imul在本例中的汇编代码如下:
0xa6b1 PUSH A
0xa6b2 LDW 0xce,X
0xa6b4 LD A,YL
0xa6b6 SWAPW X
0xa6b7 MUL X,A
0xa6b8 LDW c_x,X
0xa6ba LD A,YH
0xa6bc LDW X,0xce
0xa6be MUL X,A
0xa6bf ADDW X,c_x
0xa6c3 LDW c_x,X
0xa6c5 LD A,YL
0xa6c7 LDW X,0xce
0xa6c9 CLR 0xcf
0xa6cb MUL X,A
0xa6cc ADDW X,0x00ce
0xa6d0 POP A
0xa6d1 RET
如果某个中断例程包含了c_imul计算,编译器就会汇编代码在进出中断时保护和恢复除通用寄存器以外的如下内存:(0xc9,0xca),(0xcb,0xcc),(0xcd,0xce),这些是按字保存的,c_imul中只用了0xcd,0xce,0xcf三个字节,其中的c_x就是字(0xcd,0xce),如果中断例程包含了32位计算之类(不仅仅)的,会见到有保护0xcf,0xd0,0xd2之类的操作,但是恰好有个中断例程仅仅包含了c_imul计算,而且它就没有保护0xcf,在上述汇编片段第二行: LDW 0xce,X ,就将0xcf用来保存XL了,在倒数第6行:LDW X,0xce 取出0xcf到XL时,更高中断级别的c_imul可能已经在倒数第5行的: CLR 0xcf 操作中将它清零了。也就是说,当没有保护0xcf的高级别中断在第二行到倒数第6行之间发生且执行c_imul计算的情况下,现场被破坏。
(本文中所指0xcd等内存地址随不同的上下文变化是浮动的。) |
|