跳过正文

C Var used in Assembly

·46 字·1 分钟

以下是 FreeRTOS 线程切换时,用汇编获取线程栈地址的示意图:

excalidraw
汇编源代码如下 (portASM.S):

LDR   X0, pxCurrentTCBConst
LDR   X1, [X0]
LDR   X0, [X1]
MOV   SP, X0

可见,第一次访存得到 &pxCurrentTCB,第二次访存得到 pxCurrentTCB 的值,第三次访存得到 pxTopOfStack,即线程栈地址。

PS: 之前误认为

pxCurrentTCBConst: .dword pxCurrentTCB`

定义的 pxCurrentTCBConst 保存的是 pxCurrentTCB 的值。但实际上从汇编无法获得 C 变量的值,只能先获取变量地址,再通过地址间接访问得到变量值。 所以实际上定义的 pxCurrentTCBConst 并不是保存 pxCurrentTCB 的值,而是保存了 pxCurrentTCB 的地址。

结论
#

汇编无法获得 C 变量的值,只能先获取变量地址,再通过地址间接访问得到变量值