gpt4 book ai didi

assembly - 识别程序集中的有符号和无符号值

转载 作者:行者123 更新时间:2023-12-03 22:20:11 25 4
gpt4 key购买 nike

当我查看用 C/C++ 编写的代码的反汇编时,我总是觉得这很令人困惑。

有一个具有某些值的寄存器。我想知道它是代表有符号数还是无符号数。我怎样才能找到这个?

我的理解是,如果它是一个有符号整数,如果它是负数,MSB 将被设置,如果它是正数,则不会设置。如果我发现它是一个无符号整数,则 MSB 无关紧要。这是正确的吗?

无论如何,这似乎没有帮助:在使用此信息之前,我仍然需要确定整数是否有符号。如何做到这一点?

最佳答案

您最好的选择是寻找比较和相关的操作/标志使用,如分支。根据类型,编译器将生成不同的代码。由于大多数(相关)架构提供标志来处理有符号值。以 x86 为例:

jg, jge, jl, jle = branch based on a signed comparison (They check for the SF flag)
ja, jae, jb, jbe = branch based on a unsigned comparison (They check for the CF flag)

CPU 上的大多数指令对于有符号/无符号操作都是相同的,因为我们现在使用的是二进制补码表示。但也有异常(exception)。

让我们以右移为例。对于 X86 上的无符号值,您将使用 SHR 将某些内容向右移动。这将在左侧的每个“新创建的位”上添加零。

但是对于有符号值,通常会使用 SAR,因为它会将 MSB 扩展为所有新位。这就是所谓的“符号扩展”,再次仅适用于因为我们使用了二进制补码。

最后但并非最不重要的是,有符号/无符号乘法/除法有不同的指令。
imul+idiv = signed
mul+div = unsigned

正如评论中所指出的, imul 是一种特殊情况,因为它也可以用于无符号乘法。唯一的区别在于设置的标志。因此,如果您看到具有值的 imul,请不要太相信代码,这将取决于具体情况。

此外,NEG 指令通常仅用于有符号值,因为它是二进制补码否定。

关于assembly - 识别程序集中的有符号和无符号值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11205522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com