【发布时间】:2021-07-12 00:57:50
【问题描述】:
我有一个问题是这样的:
mov r15, 0x407116EF3867BBCA sub r15, 0x95F67F70A1BCEE9D这段代码执行后 r15 的值是多少?
(注意整数上溢/下溢)
解决方案: 用于调试的 python 3 数学字符串:(i64 - i64_2) % (2**64) 当我按照这个公式解决了这个问题时,我得到了 0xaa7a977e96aacd2d。
我怀疑答案应该是否定的,但我认为它已转换为 2 的补码。但是如果是这样的话,有什么必要把它转换成 2 的补码呢?那么,我的想法是否正确?如果不是,请纠正我。另外,这个公式背后的逻辑是什么(取模2 ^ 64)。
【问题讨论】:
-
你得到了和我一样的答案。 Python 有无限长的整数。模 2^64 是将结果截断为您拥有的 64 位寄存器。
-
@timroberts 不,我不明白的是,指令将作为“r15=r15-1”执行,即 (0x407116EF3867BBCA - 0x95F67F70A1BCEE9D) 所以我们从 a降低一个,所以答案应该是肯定的?但我们得到了一个积极的结果。
-
Python
%是模数(总是正数),而不是 x86idiv指令后的 RDX 之类的余数。无论如何,我不会使用%。按位与& 0xFFFFFFFFFFFFFFFF之类的操作对于您要执行的操作似乎更直观(按位截断为 64 位)。 -
另外,如果这应该是 x86-64,那将无法组装:只有
mov可以使用 64 位立即数,而0x95F67F70A1BCEE9D不适合 / is' t 可表示为 32 位符号扩展立即数。 -
0x95F67F70A1BCEE9D 为负数(设置了高位)。所以,实际上,你是在取正值减去负值,但无论哪种方式都会导致溢出。
标签: python assembly hex integer-overflow twos-complement