有条件的举动问题

问题描述:

从大会行使(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。)

+0

因此,在这种情况下,$更是立即数,因为它是用字符串地址汇编更换? – 2010-09-03 17:42:00

+0

是的。 (呃......从技术上讲,汇编器用一个偏移量和一个重定位记录代替它 - 因为最后的地址在链接时间之前是未知的 - 然后链接器稍后应用重定位,但这只是一个细节;代码正在运行,那么是的,'movl $ more,%eax'是字符串地址的移动 - 一个立即数操作数 - EAX寄存器。) 如果你想在这里使用'cmova',你会必须先执行'movl $ more,%edx',然后加上'cmova%edx,%eax'。 – 2010-09-03 19:39:27