Assembly 更改登录程序集(16位)
我应该把一个16位的值从正数改为负数。在谷歌搜索了几分钟后,我找到了一个解决方案,但我仍然不确定它是否正确,所以如果你能帮助我,那就太好了。谢谢Assembly 更改登录程序集(16位),assembly,arm,bit,16-bit,Assembly,Arm,Bit,16 Bit,我应该把一个16位的值从正数改为负数。在谷歌搜索了几分钟后,我找到了一个解决方案,但我仍然不确定它是否正确,所以如果你能帮助我,那就太好了。谢谢 eor r4,r1,#0x8000000使用reversesub轨迹指令rsb执行任务 rsb r4, r1, #0 @ computes r4 = 0 - r1 此指令在ARM和Thumb状态下都可用,但Thumb1只有 rsbs Rd, Rn, #0 将立即数操作数限制为#0使用rsb指令:rsb r4,r1,#0(这将使用反向减法指令计算
eor r4,r1,#0x8000000使用reversesub轨迹指令
rsb
执行任务
rsb r4, r1, #0 @ computes r4 = 0 - r1
此指令在ARM和Thumb状态下都可用,但Thumb1只有
rsbs Rd, Rn, #0
将立即数操作数限制为
#0
使用rsb
指令:rsb r4,r1,#0
(这将使用反向减法指令计算r4=0-r1
)。请注意,建议的解决方案仅翻转高位。如果有符号整数使用符号大小表示,这将起作用,但ARM和过去30年制造的任何其他主流计算机都不是这种情况;他们使用二的补语。因此,例如,如果输入是1
,您的指令将给出结果0x80000001
,它表示32位有符号整数-2147483647,而不是-1。@NateEldredge:公平地说,它总是将值从非负值更改为负值,反之亦然。问题并不是说他们想保持大小不变:P但是,是的,第一步应该是对输入进行一个微不足道的实验,比如0
,1
,以及-1
。(或者使用调试器单步执行实际实验,也很容易。)是否要对16位值求反0x8000000
是32位寄存器的顶部,因此不可能正确,您只需在低位16之外更改1位。(0x8000
也不正确,如果您希望使用eor
进行求反而不是添加INT\u MIN
,但是您确定要在寄存器中使用16位值吗?通常您会进行符号扩展,将加载从半个字扩展到完整寄存器。)