C 使用汇编 : operand type mismatch for push

标签 c assembly linux-kernel

我正在尝试在 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/

相关文章:

c - C中过程的使用

c - 收到神秘信号的应用程序

c - 为什么如果我不 malloc() 一些内存,使用 char * 会导致程序停止?

linux-kernel - 如何正确唤醒中断处理程序内的进程

linux - 驱动程序 CH341 USB 适配器串行端口或 QSerialPort 在 Linux 中不工作

c - 我的输出文件文本与输入文本不同

assembly - 将汇编代码转换为机器代码

c - 这些无用的 assembly 线从何而来?

c - 用于在 x86 程序集中在 8bpp 位图和 24bpp 位图上绘制实心圆的 Bresenham 算法

linux - 允许非root用户ioctl访问linux模块中的/dev/mytest文件