我发现了以下汇编代码,我不知道它应该做什么(主要是因为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
if>,res = x
恢复指针
返回res
但是,我不确定这个子程序的意义是什么。对我来说似乎毫无用处。如果你能指出这里做了什么,我将不胜感激。
答案 0 :(得分:6)
此代码返回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
。如果cmovg
为正数,则1
指令会将此值替换为x
。