3.290. 硬编码Tag方案

这里给做某个实现的同事提供一个在自定义指令中实现硬编码一个Tag的软件实现技巧。

问题是这样的:我需要在一个CPU上增加一个调试指令,以便调用这个指令可以在一个端口上打一个点,这样我调试初始化代码的时候就可以看到启动的过程了。

问题是现在我不想修改编译器,所以我需要在我的程序中硬编码这段代码,比如汇编上我可以写::

.2byte OPCODE
.2byte tag

这样我在CPU中译码匹配到这个指令,我就可以把tag输出到某条总线上。现在的问题是,这个代码怎么写?我才能实现这样的代码效果?::

...
debug_reach(tag);
...

这肯定不能是个函数,因为tag必须硬编码到指令中。那就只能让它是个宏了,是个宏,那我的汇编就只能是嵌入式汇编了。所以应该这样弄:

#define OPCODE 0xdeb0

#define stringify(str) #str
#define debug_reach(TAG) asm( \
                "     .4byte " stringfy(OPCODE) "\n" \
                "     .4byte " stringfy(TAG) "\n")

int test(void) {
        ...
        debug_reach(0x1111);
        ...
}

这样,就可以在启动代码中大量打点,而不需要动态传递参数到指令中。