当前位置: 首页 > 知识库问答 >
问题:

在x86汇编语言中将字节转换为字符串

上官树
2023-03-14

在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

共有2个答案

戴正阳
2023-03-14

使用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);

代码执行以下步骤:

  • 将2字节的输入复制到XMM寄存器的所有字节中,\u mm\u set1\u epi。。。()

这不需要移位和测试序列,但代价是扩展成每个SSE指令的序列。它仍然比位测试循环的128次迭代快。

杨和蔼
2023-03-14

有那么难吗?:

.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):