2012-04-18 99 views
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 

因此,这里是如何我已经解释这么远: 推入堆栈

一个新的指针(堆栈指针)创建在相同的位置为基指针

获取输入到点(让我们称之为X)

拷贝x转换成寄存器%eax中(RES = X)

解析度= RES >> 31符号扩展

测试x

设置x = 1

如果>,RES = X

恢复指针

回报水库

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

+1

你从哪里找到它的?应该给你一个线索是什么目的。 – 2012-04-18 11:31:19

+0

在一个文档中连同大量的其他子程序是用来执行数学函数的。该文件没有注释,所以在这个意义上它是无用的。 – 2012-04-18 11:32:37

+0

我猜测这是某种数学运算。但是这对我没有多大帮助。 – 2012-04-18 11:33:16

回答

6

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

int sign(int x) { 
    if (x>0) 
     return 1; 
    else if (x==0) 
     return 0; 
    else 
     return -1; 
} 

指令sarl $31, %eax会把-1eax如果它是消极的,或者以其他方式0。如果x为正,那么cmovg指令将用1代替该值。

+0

如果x = 1,你还不会得到0吗?! – 2012-04-18 12:09:34

+0

@DanP .:否。'test%edx,%edx'指令将'x'与'0'进行比较。由于它大于0,因此'cmovg'指令会将1放入'eax'中。 – interjay 2012-04-18 12:17:35