如何解决arm64 程序集将 int 转换为字符串
我想将整数转换为字符串 (org.springframework.boot
) 以便我可以打印它 - 纯 aarch64。
这是我想出的:
char *
值是硬编码的,因为我觉得这是一个舒适的起点。
这是我试图遵循的逻辑:
- 将数字除以 10:余数为最后一位;
- 将余数加 48,所以我得到最后一位作为 ascii 字符;
- 将该字符写入缓冲区(增量);
- 重复直到商变为零。
然而,代码立即发生在这条指令 ; 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]
,似乎一切都是正确的:gdb
有 x18
(53
- 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 举报,一经查实,本站将立刻删除。