如何将一个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_t
到 uint16_t
因为这违反了严格的别名规则。
我有这段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_t
到 uint16_t
因为这违反了严格的别名规则。