我正在尝试在 Linux 内核空间中禁用/启用缓存。
我使用的代码是
__asm__ __volatile__(
"pushw %eax\n\t" /*line 646*/
"movl %cr0,%eax\n\t"
"orl $0x40000000,%eax\n\t"
"movl %eax,%cr0\n\t"
"wbinvd\n\t"
"pop %eax");
编译后得到错误信息如下:
memory.c: Assembler messages:
memory.c:645: Error: operand type mismatch for `push'
memory.c:646: Error: unsupported for `mov'
memory.c:648: Error: unsupported for `mov'
memory.c:650: Error: operand type mismatch for `pop'
make[4]: *** [memory.o] Error 1
我的机器是 Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz。 64 位机器。
谁能帮我指出哪一部分不正确以及我该如何解决?
我猜是因为指令和寄存器不匹配。但我对如何修复它感到困惑。 :(
提前致谢!
最佳答案
虽然大多数 32 位寄存器保留到 64 位架构中,但它们不再能够与堆栈交互。因此,试图压入或弹出 %eax
是非法操作。所以如果你想玩堆栈,你必须使用 %rax
,它是 64 位架构等同于 %eax
。
关于C 使用汇编 : operand type mismatch for push,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245245/