将十六进制转换为二进制——asm



给定AX中的数字,将相应的位串存储在str1中。如果AX = 0x1234,结果应该是:Str1 = 0001001000111

如何将AX中的所有内容转换为二进制我必须使用循环吗?如何实现这个方法?

ax输入数字,[rdi]输出二进制字符串。

如果ax = 0x1234,[rdi] = "0001001000110100"

带有终止空字符。使用NASM瞄准x86_64.

SSE2优化版

基于Peter Cordes的帖子,手动调整调度

movd xmm2, eax
mov rdx, 0x0102040810204080
movq xmm1, rdx
mov edx, 0x30303030
movd xmm0, edx
punpcklbw xmm2, xmm2
punpcklwd xmm2, xmm2
punpckldq xmm2, xmm2
pshufd xmm2, xmm2, 0x4e; swap high64/low64
punpcklqdq xmm1, xmm1; bit-select mask
pand xmm2, xmm1
pcmpeqb xmm1, xmm2
pshufd xmm0, xmm0, 0; "0000..."
psubb xmm0, xmm1
movdqu [rdi], xmm0
mov byte [rdi + 16], 0

使用展开循环的旧版本

每次迭代都不依赖于前一次迭代,循环完全展开。

如果您不熟悉NASM宏。阅读文档(https://www.nasm.us/xdoc/2.10rc8/html/nasmdoc4.html)。

%assign i 0
%rep 16
xor edx, edx
bt eax, 15 - i
adc edx, 48
mov [rdi + i], dl
%assign i i + 1
%endrep
mov byte [rdi + 16], 0

最新更新