【问题标题】:Interpret Assembly Code解释汇编代码
【发布时间】:2012-04-18 11:29:19
【问题描述】:

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

恢复指针

返回资源

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

【问题讨论】:

  • 你在哪里找到的?应该给你一个线索,目的是什么。
  • 在一个文档中,还有大量其他用于执行数学函数的子例程。该文档没有注释,因此从这个意义上说它非常无用。
  • 我猜这是某种数学运算。但这对我帮助不大。
  • 您是否丢失了源代码并想根据您的可执行代码重建它?
  • 没有源代码。我从机器码开始。

标签: c function assembly x86-64 x86


【解决方案1】:

此代码返回 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 替换这个值。

【讨论】:

  • 如果 x = 1,你还不会得到 0 吗?!
  • @DanP.: 不。test %edx, %edx 指令将x0 进行比较。由于它大于 0,cmovg 指令会将 1 放入 eax
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 2010-10-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2013-06-04
相关资源
最近更新 更多