【发布时间】:2020-04-28 20:12:21
【问题描述】:
我知道sxt 是符号扩展指令。但我不明白这到底是如何工作的。
例如,如果我的r15 寄存器存储字节0045,那么sxt r15 会对它做什么?
【问题讨论】:
标签: assembly reverse-engineering msp430
我知道sxt 是符号扩展指令。但我不明白这到底是如何工作的。
例如,如果我的r15 寄存器存储字节0045,那么sxt r15 会对它做什么?
【问题讨论】:
标签: assembly reverse-engineering msp430
我一直在处理大量使用此指令的问题。要将其压缩为单个函数,我会将其(使用 Pythonic 语法)编写为:
def sxt(x):
if x % 256 > 127: # if top bit of low byte is set
x |= 0xff00
else:
x &= 0x00ff
这可以写得更紧凑,也可能更有效。此版本旨在为非 asm-native 用户提供最直观的体验。
另请注意,该函数假定您将输入作为两个字节字传递,就像 sxt 指令在 0xhhhh 上运行的那样,其中 h 是一个十六进制数字,您可以在 Python 中执行此操作。
【讨论】:
(int)(int8_t)val 以从 int8_t 符号扩展至更宽的宽度。 Python 没有窄整数类型,所以是的,您可能想用常规 Python 整数来模拟它,并保留所有有符号正数 = 无符号。
x & 0x80 为零,您需要将高位归零。所以你可以做 x &= 0xFF; / x |= ((x>>7) - 1) & 0xffff; 如果这适用于 Python。你几乎肯定不想要 % 模数。
% 是什么意思? x % 256 > 127 相当于检查 x & 80 == 0,对吗?如果设置了第 8 个 LSB,它们都返回 true,对吗?更新答案以解决该案例。
x - y,因为这可能会产生一个负整数。符号扩展的全部意义在于您采用窄带符号输入并产生更广泛的带符号输出(在 MSP430 的情况下为 2 的补码编码),所以我假设您希望它适用于负 Python 整数。 (在假设的模拟器中,它可能代表一个 16 位整数,其中 its 为高位集)。但可以肯定的是,您只需将 16 位位模式保存为非负 Python 整数是有道理的。
% 实际上确实按照您对负整数的需要的方式工作。例如(15 - 32) % 256 是 239,这是正确的结果。与(15 - 32 + 65536) % 256 相同。 Python 的 % 是真正的模数,而不是 C 中的余数。
sxt 指令符号将一个字节扩展为 16 位字,即将第 7 位复制到第 8 到 15 位,然后适当地更新标志。
对于您的示例,sxt 将不起作用,因为字节 0045 没有设置其最高有效位,因此 r15 的高字节保持为零。
【讨论】: