【问题标题】:Convertion of 128-bit integer to string in Assembly在汇编中将 128 位整数转换为字符串
【发布时间】:2016-03-21 12:35:15
【问题描述】:

我正在尝试将整数转换为字符串以便输出; 但我在两个寄存器中使用 x86_64 和 NASM 程序集,而整数是 128 位。 所以我不知道如何输出它; 谢谢!

【问题讨论】:

  • 我不能使用 C 函数,也不知道如何在汇编中分割这个 long int
  • 这个问题已经讨论过了,点击here。不是你的解决方案吗?

标签: assembly nasm system-calls


【解决方案1】:

这是一个可用于无符号整数的(汇编风格)算法。以号码n开头:

start:
    if n is non-zero then goto nonZeroNum.
    output '0'.
    return.

nonZeroNum:
    set digitCount to zero.
numLoop:
    get n modulo 10 and push it onto the stack.
    increment digitCount.
    divide n by 10 (integer division).
    if n is non-zero then goto numLoop.

digitLoop:
    pop digit.
    convert number to character (eg, adding 48 for ASCII).
    output that character.
    decrement digitCount.
    if digitCount is non-zero then goto digitLoop.

这应该是一个好的开始,我建议您手动通过湿件运行它,以便您了解它是如何工作的。

然后,您只需要制定汇编指令即可完成伪代码的工作。这不应该太繁琐,因为它可能是一对一的映射。

【讨论】:

  • 我知道方法,但我不知道如何除....因为n在两个寄存器中,但指令只处理64b/64b(我不确定)跨度>
  • 您可以使用重复减法代替除法。这对于任何位宽都很容易。它还以正确的顺序为您提供结果,而不必弄乱堆栈;)
  • 根据您的 128 位整数是无符号还是有符号,使用 DIV(无符号)或 IDIV(有符号)指令。在指令之前将高 64 位放入 RDX 寄存器,将低 64 位放入 RAX 寄存器。然后,如果您将 10 存储到 RBX 中,那么指令 DIV RBX 将除以 10 并将商放入 RAX 并将余数放入 RDX(覆盖它们的原始内容)。
  • @pcarter,问题是如果商不能适合 RAX,那么你会得到一个除法错误。尝试将 2^120(适合 128 位整数 RDX:RAX 的大值)除以 10。商不能用 64 位表示,并且会产生除法错误。
  • 谢谢你们,我可以这样处理:n除以10^k,让10^k
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2014-04-20
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多