【问题标题】:Unsigned integers in assembly汇编中的无符号整数
【发布时间】:2017-08-05 08:34:09
【问题描述】:

全新的汇编程序需要一些无符号算术方面的帮助。从 C 程序转换是什么意思。

使用:

Linux

NASM

x86(32 位)

我想从用户那里读入一个数字。我希望这个号码没有签名。当我输入一个高于有符号整数限制的数字并使用信息寄存器时,我注意到我的寄存器存储的是负数,这意味着发生了溢出。 (显然输入的数字低于最大无符号整数)如何将此寄存器视为无符号,以便我可以根据结果进行比较和跳转?

【问题讨论】:

    标签: c assembly x86 unsigned-integer


    【解决方案1】:

    在汇编中,没有不同的有符号和无符号类型。寄存器保存的值可以是有符号的也可以是无符号的,这取决于您如何看待它。

    有与有符号解释一致的指令(jgjl等)和与无符号解释一致的指令(jajb等)cmp指令适用于两者 - 它设置可以被 jl 之类的指令使用的标志,以基于有符号的解释进行跳转,并设置可以被jb 等指令使用的标志,以基于无符号的解释进行跳转。无论您不使用哪个标志,您都可以忽略。

    因此,当您说“我的寄存器存储是否定的”时,这是没有意义的。如果您选择这样解释,它只会显得消极。

    【讨论】:

    • 有没有办法让命令(在 gdb 中)信息寄存器显示为无符号?
    • 演员应该可以工作:print (unsigned)$eax。或者可能是print/u
    • ...info registers 似乎不太灵活。我没有看到任何明显的 /u 等价物
    • 它超越了有符号和无符号。寄存器保存位,这些位在您使用它们之前绝对没有任何意义。例如,高级语言中的地址/指针可能需要一个偏移量,该偏移量可能是加法指令期间的加法指令,您认为是指针的那些位只是加法的一些操作数。在用于加载或存储某些东西之前,它们不是指针/地址。这些位只与程序员有关,对硬件/芯片/指令集没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2021-07-30
    相关资源
    最近更新 更多