微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

arm64 程序集将 int 转换为字符串

如何解决arm64 程序集将 int 转换为字符串

我想将整数转换为字符串 (org.springframework.boot) 以便我可以打印它 - 纯 aarch64。 这是我想出的:

char *

值是硬编码的,因为我觉得这是一个舒适的起点。

这是我试图遵循的逻辑:

  1. 将数字除以 10:余数为最后一位;
  2. 将余数加 48,所以我得到最后一位作为 ascii 字符;
  3. 将该字符写入缓冲区(增量);
  4. 重复直到商变为零。

然而,代码立即发生在这条指令 ; adr x20,->result // x20 = char * ; mov x14,0 // x14 = digit counter ; mov x15,12345 // x15 = number to convert ; mov x16,10 // x16 = divisor ; ->divide: ; udiv x17,x15,x16 // x17 = quotient ; msub x18,x17,x16,x15 // x18 = remainder ; add x18,x18,48 // x18 = remainder as char ; strb w18,[x20,x14] // put char in char * ; add x14,x14,1 // x14 = digit counter ; mov x15,x17 // x16 = remaining number to convert ; cbnz x17,->divide // repeat until quotient is zero ; ->result: ; .byte 0,0 上的分段错误。 使用 strb w18,x14],似乎一切都是正确的:gdbx1853 - 5 的最后一位 - + 12345)。

但是,我想我仍然不明白 48 是如何工作的。

首先,str(b) 将在 adr x20,->result 处加载指向 result 的指针(指向 [0,0] 的指针,缓冲区),假设为 x20。 然后,0x7fb697d40c 应该取strb w18,x14](第一轮中的w18)的最小字节并将其放在53 + 0x7fb697d40c内容({{ 1}} 在第一轮)。 所以我希望 x14 指向 0

但是,0x7fb697d40c 出现了,我不知道为什么。 我错过了什么?

编辑 这是使用通常语法的源代码

[53,0]

解决办法: 正如 Nate 在评论中指出的那样,代码所在的内存范围是不可写的。 由于我不想让 SIGSEGV 改变权限,所以我最终使用了堆栈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。