有条件的举动问题
问题描述:
从大会行使(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”
我可以将字符串地址无效的%eax中使用MOVL ,但是cmova没有被编译。我需要源操作数为$ more而不是更多,用于打印。最后,这个值到Linux系统调用的%ecx寄存器4(写入)。
答
汇编程序是正确的!指令比MOV更有限:它们只能将16/32/64位值从存储器移入寄存器或从一个寄存器移动到另一个寄存器。它们不支持立即(或8位寄存器)操作数。
(参考:http://www.intel.com/Assets/PDF/manual/253666.pdf - 从集合手册可在http://www.intel.com/products/processor/manuals/index.htm。)
因此,在这种情况下,$更是立即数,因为它是用字符串地址汇编更换? – 2010-09-03 17:42:00
是的。 (呃......从技术上讲,汇编器用一个偏移量和一个重定位记录代替它 - 因为最后的地址在链接时间之前是未知的 - 然后链接器稍后应用重定位,但这只是一个细节;代码正在运行,那么是的,'movl $ more,%eax'是字符串地址的移动 - 一个立即数操作数 - EAX寄存器。) 如果你想在这里使用'cmova',你会必须先执行'movl $ more,%edx',然后加上'cmova%edx,%eax'。 – 2010-09-03 19:39:27