Assembly MSP430中的sxt指令真正做什么?

Assembly MSP430中的sxt指令真正做什么?,assembly,reverse-engineering,msp430,Assembly,Reverse Engineering,Msp430,我知道sxt是符号扩展指令。但我不明白这到底是怎么回事。 例如,如果我的r15寄存器存储字节0045,那么sxt r15会对它做什么?sxt指令符号将字节扩展为16位字,即它将位7复制到位8到15,然后适当地更新标志 例如,sxt将无效,因为字节0045未设置其最高有效位,因此r15的高位字节保持为零。sxt指令符号将字节扩展为16位字,即将位7复制到位8到15,然后适当更新标志 例如,sxt将无效,因为字节0045未设置其最高有效位,因此r15的高位字节保持为零。我一直在解决大量使用此指令的问

我知道
sxt
是符号扩展指令。但我不明白这到底是怎么回事。
例如,如果我的
r15
寄存器存储字节
0045
,那么
sxt r15
会对它做什么?

sxt指令符号将字节扩展为16位字,即它将位7复制到位8到15,然后适当地更新标志


例如,
sxt
将无效,因为字节
0045
未设置其最高有效位,因此
r15
的高位字节保持为零。
sxt
指令符号将字节扩展为16位字,即将位7复制到位8到15,然后适当更新标志


例如,
sxt
将无效,因为字节
0045
未设置其最高有效位,因此
r15
的高位字节保持为零。

我一直在解决大量使用此指令的问题。要将其压缩为单个函数,我将(使用Pythonic语法)编写为:

这可以写得更简洁,也可能更有效。本版本旨在为非asm本地人提供最直观的体验


还请注意,该函数假设您将输入作为两个字节的字传入,例如
sxt
指令操作,其中h是十六进制数字,您可以在Python中执行此操作。

我一直在研究大量使用此指令的问题。要将其压缩为单个函数,我将(使用Pythonic语法)编写为:

这可以写得更简洁,也可能更有效。本版本旨在为非asm本地人提供最直观的体验


还请注意,该函数假定您将输入作为两个字节的字传递,例如
sxt
指令操作在,
0xhhh
中,其中h是十六进制数字,您可以在Python中执行此操作。

为什么它没有效果?我是说。。。7位仍然会被复制到8位,因为7位是1,它仍然有一些效果,对吗?哦,我现在明白了,7位不是1,而是0>为什么它没有效果?我是说。。。7位仍然会被复制到8位,因为7位是1,它仍然有一些效果,对吗?哦,我现在明白了,在C中,7位不是1而是0>,你可以将其表示为
(int)(int8_t)val
,以从int8_t向上扩展到更宽的宽度。Python没有窄整数类型,因此您可能希望用常规Python整数模拟它,并保持所有带符号的正=无符号。不过,我认为您有一个错误:如果
x&0x80
为零,则需要将高位置零。所以你可以做
x&=0xFF/
x |=((x>>7)-1)和0xffff如果这在Python中有效。你几乎肯定不想要模运算。@PeterCordes说得对!你不想要
%
是什么意思
x%256>127
相当于检查
x&80==0
,对吗?如果设置了第8个LSB,它们都返回true,对吗?更新答案以解释这种情况。好的,但这意味着假设的MSP430 Python仿真器不能只使用
x-y
,因为这可能会产生一个负整数。符号扩展的全部要点是,您接受一个窄的有符号输入,并生成一个更宽的有符号输出(MSP430中的补码编码是2),因此我假设您希望它适用于负Python整数。(在假设的仿真器中,它可能表示一个16位整数及其高位集)。但是当然,您只需将16位模式作为非负Python整数保存是有意义的。不过,我刚刚进行了测试,Python3的
%
确实以负整数所需的方式工作。e、 g.
(15-32)%256
239
,这是正确的结果。与
(15-32+65536)%256相同。Python的
%
是一个真正的模,而不是C中的余数。在C中,您可以将其表示为
(int)(int8_t)val
以从int8_t向后扩展到更宽的宽度。Python没有窄整数类型,因此您可能希望用常规Python整数模拟它,并保持所有带符号的正=无符号。不过,我认为您有一个错误:如果
x&0x80
为零,则需要将高位置零。所以你可以做
x&=0xFF/
x |=((x>>7)-1)和0xffff如果这在Python中有效。你几乎肯定不想要模运算。@PeterCordes说得对!你不想要
%
是什么意思
x%256>127
相当于检查
x&80==0
,对吗?如果设置了第8个LSB,它们都返回true,对吗?更新答案以解释这种情况。好的,但这意味着假设的MSP430 Python仿真器不能只使用
x-y
,因为这可能会产生一个负整数。符号扩展的全部要点是,您接受一个窄的有符号输入,并生成一个更宽的有符号输出(MSP430中的补码编码是2),因此我假设您希望它适用于负Python整数。(在假设的仿真器中,它可能表示一个16位整数及其高位集)。但是当然,您只需将16位模式作为非负Python整数保存是有意义的。不过,我刚刚进行了测试,Python3的
%
确实以负整数所需的方式工作。e、 g.
(15-32)%256
239
,这是正确的结果。与
(15-32+65536)%256相同。Python的
%
是一个真正的模,而不是像C中那样的余数。
def sxt(x):
    if x % 256 > 127:    # if top bit of low byte is set
        x |= 0xff00
    else:
        x &= 0x00ff