在x86汇编语言中,有没有有效的方法将字节转换为二进制数字字符串(表示为0和1的字节数组)?据我所知,x86程序集中没有任何'toString'函数,就像在大多数高级编程语言中一样。
.stack 2048
.data
theString byte 0, 0, 0, 0, 0, 0, 0, 0 ;store eax as a binary string here.
ExitProcess proto, exitcode:dword
.code
start:
mov eax, 3;
;now I need to convert eax to a binary string somehow (i. e., a byte array of 0s and 1s)
invoke ExitProcess, 0
end start
答案 0 :(得分:1)
那难吗?:
.data
mystr db 33 dup(0)
.code
EaxToBinaryString:
mov ebx, offset mystr
mov ecx, 32
EaxToBinaryString1:
mov dl, '0' ; replace '0' with 0 if you don't want an ASCII string
rol eax, 1
adc dl, 0
mov byte ptr [ebx], dl
inc ebx
loop EaxToBinaryString1
ret
答案 1 :(得分:0)
使用 SSE内在函数,可以将其编码为:
char in[2];
char string[16];
__m128i zeroes = _mm_set1_epi8('0');
__m128i ones = _mm_set1_epi8('1');
__m128i mask = _mm_set_epi8(
0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1,
0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1);
__m128i val = _mm_set_epi8(
in[1], in[1], in[1], in[1], in[1], in[1], in[1], in[1],
in[0], in[0], in[0], in[0], in[0], in[0], in[0], in[0]);
val = _mm_cmplt_epi8(val, _mm_and_si128(val, mask));
val = _mm_or_si128(_mm_and_si128(val, zeroes), _mm_andnot_si128(val, ones));
_mm_storeu_si128(string, val);
代码执行以下步骤:
_mm_set1_epi...()
0xffff
或0x0
的数组。'0'
和'1'
个字符,然后将它们合并。这样就可以使用移位和测试序列,但是_mm_set*()
的价格会扩展为每个SSE指令的序列。它仍然比位测试循环的128次迭代更快。