【问题标题】:Convert hexadecimal to binary -- asm十六进制转二进制——asm
【发布时间】:2022-06-28 22:50:29
【问题描述】:

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

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

【问题讨论】:

  • 您为哪种架构编程? X86 或 x86_64(或其他?)通常的方法是按顺序检查每个位。您可以使用bt 指令执行此操作。然后,根据位是什么,在字符串中添加 0 或 1。
  • @DavidC.Rankin 但是二进制中的 1234 是 OP 所说的。令人困惑...
  • 噢噢噢噢。谢谢 - 就在我头上。是的0x1234(十进制4660)是我的想法。
  • 我目前使用的编程环境是amd64,不知道怎么取值转二进制
  • @0xbe61a55f 该值是数字本身。它已经是二进制的。您只需从这些位生成一个字符串。

标签: assembly


【解决方案1】:

ax中输入数字,在[rdi]中输出二进制字符串。 rdi 被销毁。如果ax = 0x1234[rdi] = "0001001000110100" 带有终止空字符。

使用面向 x86_64 的 NASM。为获得最佳性能,每次迭代都不依赖于前一次迭代,并且循环完全展开。对于带有微码bt(虽然我不知道是否存在)的机器,将其替换为shl。在这种情况下,每个shl 都依赖于前一个shl,但它们之间的内存存储很可能会隐藏延迟。

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

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

【讨论】:

    猜你喜欢
    • 2014-10-30
    • 2014-01-07
    • 2012-04-08
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多