解释汇编代码

Dan*_* P. 1 c x86 assembly x86-64 function

我发现了以下汇编代码,我不知道它应该做什么(主要是因为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
Run Code Online (Sandbox Code Playgroud)

所以这就是我到目前为止解释它的方式:推进堆栈

新指针(堆栈指针)创建指向与基指针相同的位置

获取输入(让我们称之为x)

将x复制到寄存器%eax(res = x)

res = res >> 31符号扩展名

测试x

设置x = 1

if>,res = x

恢复指针

返回res

但是,我不确定这个子程序的意义是什么.对我来说似乎毫无用处.如果你能指出这里做了什么,我将不胜感激.

int*_*jay 6

此代码返回X的符号.在C中:

int sign(int x) {
    if (x>0)
        return 1;
    else if (x==0)
        return 0;
    else
        return -1;
}
Run Code Online (Sandbox Code Playgroud)

该指令sarl $31, %eax将会把-1eax,如果它是消极的,或者0以其他方式.然后cmovg指令将替换此值,1如果x是肯定的话.