我发现了以下汇编代码,但我不知道它应该做什么(主要是因为cmovg遵循movl指令):
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl %edx, %eax
sarl $31, %eax
testl %edx, %edx
movl $1, %edx
cmovg %edx, %eax
popl %ebp
ret到目前为止,我是这样解释它的:推送到堆栈
创建一个新指针(堆栈指针),使其指向与基指针相同的位置
获取输入(让我们称其为x)
将x复制到寄存器%eax (res = x)
res = res >> 31符号扩展
测试x
设置x=1
如果>,则res =x
恢复指针
返回res
但是,我不确定这个子例程的意义是什么。对我来说,它似乎毫无用处。如果你能指出这里正在做什么,我将不胜感激。
发布于 2012-04-18 19:52:05
这段代码返回X的符号。在C:
int sign(int x) {
if (x>0)
return 1;
else if (x==0)
return 0;
else
return -1;
}如果是负数,指令sarl $31, %eax将把-1放入eax,否则放入0。如果x为正,则cmovg指令将用1替换此值。
https://stackoverflow.com/questions/10208410
复制相似问题