AArch64汇编中STR存储寄存器低字节失效问题求助
问题分析与修复
你的核心问题是错误使用了AArch64的字节操作指令语法,导致数据没有正确写入缓冲区。具体来说:
- AArch64中没有
str b3或ldr b0这类指令,字节加载/存储的正确指令是ldrb(字节加载)和strb(字节存储),操作数应为32位宽寄存器(如w3、w0),而非虚构的b3/b0寄存器。 - 另外,write系统调用的标准输出文件描述符是
1,而非代码中的0(0是标准输入),这会导致最终无法在终端打印内容。
修正后的代码
.section .data BCDBuffer: .space 5 // Buffer of size 5 BCDBufferLen = . - BCDBuffer .section .text .global _start _start: ldr x1, =BCDBuffer mov w0, #65535 // 使用w0而非x0,保持32位操作一致性 // 计算BCD编码 mov w4, #10000 // 改用w4(32位),与后续32位操作匹配 udiv w3, w0, w4 strb w3, [x1] // 修正:用strb + w3执行字节存储 umull x3, w3, w4 sub w0, w0, w3 add x1, x1, #1 mov w4, #1000 udiv w3, w0, w4 strb w3, [x1] umull x3, w3, w4 sub w0, w0, w3 add x1, x1, #1 mov w4, #100 udiv w3, w0, w4 strb w3, [x1] umull x3, w3, w4 sub w0, w0, w3 add x1, x1, #1 mov w4, #10 udiv w3, w0, w4 strb w3, [x1] umull x3, w3, w4 sub w0, w0, w3 add x1, x1, #1 strb w0, [x1] // 修正:用strb w0存储最后一位 sub x1, x1, #4 // 转换为ASCII asciistuff: ldrb w0, [x1] // 修正:用ldrb加载字节到w0 add w0, w0, #48 strb w0, [x1], #1 ldrb w0, [x1] add w0, w0, #48 strb w0, [x1], #1 ldrb w0, [x1] add w0, w0, #48 strb w0, [x1], #1 ldrb w0, [x1] add w0, w0, #48 strb w0, [x1], #1 ldrb w0, [x1] add w0, w0, #48 strb w0, [x1] sub x1, x1, #3 // 打印到终端 mov x0, #1 // 修正:STDOUT的文件描述符是1 mov x2, #5 mov w8, #64 // write系统调用编号 svc #0 // 退出程序 mov x0, #0 mov w8, #93 // exit系统调用编号 svc #0
关键修正点说明
- 字节操作指令修正:
- 所有
str bX改为strb wX,ldr bX改为ldrb wX,这是AArch64中正确的字节加载/存储指令格式,确保数据正确写入缓冲区。
- 所有
- 寄存器宽度一致性:
- 对32位数值操作时,统一使用
w系列寄存器(如w0、w4),避免混用x系列64位寄存器造成不必要的扩展。
- 对32位数值操作时,统一使用
- 标准输出文件描述符修正:
- 将
mov x0, #0改为mov x0, #1,让write系统调用输出到标准终端。
- 将
现在重新编译调试,缓冲区会正确存储BCD编码,最终能在终端打印出65535。
内容的提问来源于stack exchange,提问作者Das heilige Dönerhuhn
相关产品推荐
相关产品推荐

