如何将一个16位数字分解为两个8位数字?

How to decompose one 16bit number to two 8bit numbers?

我有这段C代码,我想在nasm中,将16位分解成两个8位,我该怎么做? C

uint16_t data = 0xCAFE; // global
uint8_t result[2];
...

decompose();
printf(
  "result %d %d \n", 
  result[0], result[1]
);

ASM

 global decompose
decompose:
  enter 0,0
  movzx ax, word[data],
  movzx al, [ax]
  leave
  ret

首先:创建具有全局副作用的函数是非常糟糕的设计,例如获取他们的参数或通过全局变量传递他们的结果。
第二:绝对没有理由在此使用汇编。特别是如果你将结果传递给相当慢的打印例程。

如果你真的想要这样的函数,我建议引入小的内联函数

static inline uint8_t u16High(uint16_t v){ return (uint8_t)(v >> 8); }
static inline uint8_t u16Low (uint16_t v){ return (uint8_t)(v);      }

另一个(在我看来很丑)选项是:

static inline uint8_t* u16decompose(uint16_t* v){ return (uint8_t*)v; }

但要注意:这只允许用于 uint8_t* 你不能将它用于 'decompose' uint32_tuint16_t 因为这违反了严格的别名规则。