1

我找到了以下汇编代码,但我不知道它应该做什么(主要是因为 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

所以到目前为止我是这样解释的: pushes on stack

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

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

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

res = res >> 31 符号扩展

测试 x

设置 x = 1

如果 >, res = x

恢复指针

返回资源

但是,我不确定这个子程序的意义是什么。对我来说似乎没用。如果您能指出这里正在做什么,我将不胜感激。

4

1 回答 1

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输入,否则。然后该指令将用if为正数替换该值。eax0cmovg1x

于 2012-04-18T11:52:05.473 回答