linux - 条件移动问题

标签 linux assembly x86

汇编练习的代码片段(GNU 汇编程序,Linux 32 位)


.data

more:
.asciz "more\n"

.text
...

movl $more, %eax        # this is compiled
cmova more, %eax        # this is compiled
cmova $more, %eax       # this is not compiled

错误:“cmova”的后缀或操作数无效

我可以使用 movl 将字符串地址放入 %eax,但 cmova 未编译。我需要源操作数是 $more 而不是更多,以便将其用于打印。最后,这个值进入 Linux 系统调用 4(写入)的 %ecx 寄存器。

最佳答案

汇编器是正确的! CMOVcc 指令比 MOV 更受限制:它们只能将 16/32/64 位值从内存移动到寄存器,或从一个寄存器移动到另一个寄存器。它们不支持立即数(或 8 位寄存器)操作数。

(引用:http://www.intel.com/Assets/PDF/manual/253666.pdf - 来自 http://www.intel.com/products/processor/manuals/index.htm 提供的手册集。)

关于linux - 条件移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627046/

相关文章:

linux - 在 nasm 程序中隔离余数

linux - 我可以等待不是当前 shell 终端子进程的进程终止吗?

linux - MEncoder 转换 - 破帧

linux - 有没有办法在巨大的并发日志中查看当前目录和文件名的所有所有者(没有 ls)

assembly - 在 MIPS 汇编器中实现检查给定的财政代码是否正确

string - 无法理解寄存器和变量之间的汇编mov指令

linux - 301 由 google 索引的 url 包含/index.php/*

assembly - 在没有AVX2的情况下,如何使用字节中的位设置ymm寄存器中的双字? (vmovmskps的倒数)

c - GNU ARM 汇编程序在错误消息中给出看似无关的寄存器

我可以将 Intel 语法的 x86 程序集与 GCC 一起使用吗?