gpt4 book ai didi

python - 在Python中模拟SHL和SHR ASM指令

转载 作者:行者123 更新时间:2023-12-01 08:36:03 25 4
gpt4 key购买 nike

在x86_64 ASM中,以下指令分别执行按位左移和右移。

SHL rax, cl
SHR rax, cl

我想用 Python 模拟这些指令。

对于诸如:0x613025F862 之类的值,我可以执行以下操作:

result = 0x613025F862 << 0x10

但是,对于较大的值,我得到不同的结果:

0x60018DDDBD500063 << 0x10

它给我的结果为:0x60018dddbd5000630000。但是,在 ASM 中,结果将是:0x8dddbd5000630000

我可以通过执行以下操作在 Python 中获得上述结果:

(0x60018DDDBD500063 << 0x10) & 0xffffffffffffffff

现在,我怎样才能编写一个有效的通用函数来给出正确的结果?

为此目的,我编写了一个如下所示的函数:

def shift_left(input):
result = input << 0x10
if result > 0xffffffffffffffff:
result = result & 0xffffffffffffffff
else:
result = result

return result

谢谢。

最佳答案

对于可变计数类次,不要忘记也屏蔽类次计数。 shl/shr​​ 只看cl的低位。对于 bts reg,regreg,imm 以及 BMI2 shlx r64、r64/m64、r64 来说也是如此。

cl & 0x3f 用于 64 位移位,或者 cl & 0x1f 用于 32、16 或 8 位移位。 (因此,16 位和 8 位移位可以通过移出所有位来将 8 位或 16 位寄存器清零)。伪代码请参阅手册的操作部分:http://felixcloutier.com/x86/SAL:SAR:SHL:SHR.html

<小时/>

您不需要将屏蔽设为有条件

result = (input << 0x10) & 0xffffffffffffffff

or
result = (input << (cl & 0x3f)) & 0xffffffffffffffff

Python2 有一个固定宽度的整数类型,它会隐式地为您丢弃高位,但 Python3 不会。

对于右移,您可能不需要屏蔽,假设当您右移时 Python 的整数类型不会变成浮点或定点。

<小时/>

我也不确定 Python 如何处理有符号整数:shr​​ 移入零,而 sar 移入符号位的副本。 在 x86 asm 中,-10xffffffffffffffff 实际上是同一件事(所有位均已设置),因此在 Python 中,您可能会发现需要标准化shr​​ 的输入在 0 .. 0xffffffffffffffff 范围内无符号,或者 sar 规范化要在 中签名的输入-2^63 .. +2^63-1 范围。

左移可能会“溢出”并设置结果的高位。任何使用带符号解释查看该值的指令都会将其视为负数。 (例如,sar、加宽单操作数imul ecxtest/cmp/其他设置的指令>SFOF。)

当然,在 32、16 或 8 位寄存器中,该寄存器的最高位是符号位。

关于python - 在Python中模拟SHL和SHR ASM指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53715944/

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