最近做的工作需要截获page_fault异常处理,需要模仿着原来的page fault异常处理例程写一个自己的异常处理例程。这个异常处理例程有一部分是汇编代码写的。反汇编原来的内核,发现这样一条指令
66 66 90 data32 xchg %ax, %ax
但是在汇编中,直接用
asm("data32 xchg %ax, %ax);
的方式没有办法编译通过。编译器总是报告:`data32' is not supported in 64 bit system. 而直接
asm("xchg %ax, %ax");
编译之后的汇编代码则只是66 90。
尝试了不少办法,最终去追踪内核代码,发现可以用这种方式来实现
asm(".byte 0x66"); asm("xchg %ax, %ax");
最终编译出来的代码,果然就是66 66 90。
用这种方法就可以实现直接在嵌入式汇编中硬编码机器码。在某些场合,比如底层机器新增加了指令,而编译器还没有做相应的扩展,使用这种方法可以达到使用新指令的目的。