【问题标题】:Conditional move problem条件移动问题
【发布时间】:2010-09-02 12:25:45
【问题描述】:

Assembly 练习中的代码片段(GNU Assembler,Linux 32 位)

。数据 更多的: .asciz "更多\n" 。文本 ... movl $more, %eax # 这是编译的 cmova more, %eax # 这是编译的 cmova $more, %eax # 未编译

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

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

【问题讨论】:

    标签: linux assembly x86


    【解决方案1】:

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

    (参考:http://www.intel.com/Assets/PDF/manual/253666.pdf - 来自http://www.intel.com/products/processor/manuals/index.htm 上的手册集。)

    【讨论】:

    • 那么,在这种情况下,$more 是立即操作数,因为它被带有字符串地址的汇编程序替换了?
    • 是的。 (嗯......从技术上讲,汇编器用偏移量和重定位记录替换它 - 因为最终地址直到链接时间才知道 - 然后链接器稍后应用重定位。但这只是一个细节;到时候代码正在运行,那么是的,movl $more, %eax 是将字符串的地址 - 立即操作数 - 移动到 EAX 寄存器。)如果你想在这里使用cmova,你必须做类似@987654325的事情@ 后跟 cmova %edx, %eax
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2010-11-28
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多