在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
使用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);
代码执行以下步骤:
\u mm\u set1\u epi。。。()
这不需要移位和测试序列,但代价是扩展成每个SSE指令的序列。它仍然比位测试循环的128次迭代快。
有那么难吗?:
.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
我有一根绳子, 我想把它转换成一个字节数组。 有人能在这方面引导我吗?我尝试了以下代码,但我得到了ASCII中的数据。我不想那样。
如果转换过程必须通过汇编语言,即 高级语言====>汇编语言====>目标代码/机器代码, 那么谁把这种高级语言转换成汇编语言,它有什么用?
问题内容: 我是Go的新手,正在尝试执行以下操作: 我搜索了很多,但真的不知道该怎么做。 我知道这行不通: 问题答案: 这不是实现它的最有效方法,但是您可以简单地编写: 被称为:
问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为
本文向大家介绍Intel x86 Assembly& Microarchitecture x86汇编语言,包括了Intel x86 Assembly& Microarchitecture x86汇编语言的使用技巧和注意事项,需要的朋友参考一下 示例 x86汇编语言家族代表了最初的Intel 8086架构数十年来的进步。除了基于所使用的汇编器的几种方言外,多年来添加了附加的处理器指令,寄存器和其他功
问题内容: 我试图将dispatch_queue_create与我在运行时创建的动态字符串一起用作第一个参数。编译器抱怨,因为它期望使用标准的c字符串。如果我将其切换为编译时定义的字符串,错误就会消失。谁能告诉我如何将String转换为标准c字符串? 问题答案: 您可以得到如下: 编辑: Beta 5更新- 不再存在(感谢@Sam):