【发布时间】:2021-02-16 11:06:10
【问题描述】:
我在 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
【问题讨论】:
-
您的汇编代码永远不会写入
result。此外,没有movzx r16, r/m16。只需使用普通的mov。 -
取决于哪个字节应该是 MS 和 LS,或者它是否应该与 CPU 字节序相同。无论如何,只需研究按位运算符,或者在网站上找到这个问题的众多重复项中的任何一个。
-
AX 已经是 2 个独立的寄存器,AH 和 AL。在
movzx eax, word [data]之后,您就可以有效地将 16 位加载到 EAX 中(AX 中的低 16 位)。或将 AX 存储到[result],如果你想要它,就像memcpy(result, &data, 2);。字节只是字节,一次复制多个并不特殊。 -
或者更好的是,将
result设为data的别名,或与它联合的一部分,这样您就不必复制了,这只是访问相同底层字节的另一种C 方式.
标签: c assembly x86 x86-64 nasm