【问题标题】:Most efficient method of adding 16-bit numbers, lookup table, binary addition or simple addition?添加 16 位数字、查找表、二进制加法或简单加法的最有效方法?
【发布时间】:2015-07-13 18:10:38
【问题描述】:

我正在尝试为我正在尝试构建的 MSP-430 仿真器编写 ADD 函数。

我想知道用于添加两个 16 位数字的查找表是否是有效检索我的结果的可行解决方案。我想到的替代方法是二进制加法循环,它逐位相加或简单的十进制加法。我需要能够确定符号和进位(如果有的话)。

微控制器的任何规格都可以在here找到。

【问题讨论】:

  • 只需使用+ 添加它们。
  • 我同意 EugeneSh。查找表将有 40 亿个条目。您需要使用 C 中的算术运算符来模拟指令所做的任何事情。要找出标志,您应该使用uint32_t 进行计算,然后使用按位运算符检查结果。
  • 即使假设 MCU 没有 16 位加法器(我相信它有),您也不太可能超越编译器优化。
  • @EugeneSh。 OP 正在尝试编写代码来模拟 MSP-430。
  • 哦。我懂了。无论如何,模拟器主机是一些 32 位或 64 位的 PC,它可以随时处理添加。

标签: c binary addition msp430


【解决方案1】:

您可以使用简单的 32 位二进制补码算法。假设srcdst 存储在uint32_t 的低16 位中,则以下代码序列模拟ADD 指令:

uint32_t xor = src ^ dst;
dst += src;
flags.N = (dst >> 15) & 1;
flags.C = (dst >> 16) & 1;
flags.V = ((~xor & (src ^ dst)) >> 15) & 1;
dst &= 0xFFFF;
flags.Z = (dst == 0);

加法本身的结果可以通过简单地取32位加法的低16位得到。 N、Z 和 C 标志也很容易计算。 (有符号的)溢出标志 V 更棘手。该代码主要测试srcdst的符号在加法之前是否相等,之后是否不同。

【讨论】:

  • 您是否检查过进位可以防止零,就像您的解决方案一样?否则 flags.Z = (dst & 0xFFFF) == 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2013-10-31
  • 2015-01-31
  • 2010-09-18
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多