msp430 中的汇编否定
Assembly negation in msp430
我在 msp430 的汇编中有以下版本的否定某些整数值(在 R12 中):
inv R12
inc R12
这是根据手册进行的,我认为这同样有效?
inv R12
add #1, R12
但这行得通吗?为什么不行? :
sub #1, R12
inv R12
对此还是个新手,感谢您的帮助!
INC dst
是用ADD #1, dst
模拟的,所以前两个版本完全一样。
至于第三个版本:在二进制补码表示中,反转所有位计算负数减一,因此您正在计算 (−x − 1) + 1 或 − (x + 1) + 1,确实是一样的。
如果你想要更实际的演示,只需使用暴力:
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
int main()
{
for (uint32_t i = 0; i < 0x10000; i++) {
uint16_t input = i;
uint16_t output1 = (~input) + 1;
uint16_t output2 = ~(input - 1);
assert(output1 == output2);
}
puts("it works!");
return 0;
}
我在 msp430 的汇编中有以下版本的否定某些整数值(在 R12 中):
inv R12
inc R12
这是根据手册进行的,我认为这同样有效?
inv R12
add #1, R12
但这行得通吗?为什么不行? :
sub #1, R12
inv R12
对此还是个新手,感谢您的帮助!
INC dst
是用ADD #1, dst
模拟的,所以前两个版本完全一样。
至于第三个版本:在二进制补码表示中,反转所有位计算负数减一,因此您正在计算 (−x − 1) + 1 或 − (x + 1) + 1,确实是一样的。
如果你想要更实际的演示,只需使用暴力:
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
int main()
{
for (uint32_t i = 0; i < 0x10000; i++) {
uint16_t input = i;
uint16_t output1 = (~input) + 1;
uint16_t output2 = ~(input - 1);
assert(output1 == output2);
}
puts("it works!");
return 0;
}