【发布时间】:2026-02-20 14:30:02
【问题描述】:
我在树莓派上用 arm 程序集编写链表时遇到了一个奇怪的问题。我的链表适用于除长度为 12 的字符串之外的所有字符串。它在所有长度为 12 的字符串的末尾显示一个垃圾字符,我不知道为什么
感谢任何帮助
这是我正在使用的输入函数,它将地址输出到 R0 中的 malloc'd 字符串,并且似乎对于长度不为 12 的所有字符串都可以正常工作:
.equ BUFSIZE2,256
.data
inputbuf2: .ds BUFSIZE2
prompt: .asciz "Enter: "
p1: .word 0
input:
push {R1,R2,R5,R14}
mov R0,#0
bl v_ascz @ prints string in R1
ldr R1,=inputbuf2
mov R2,#BUFSIZE2
bl c_ascz @ does service call for input, returns in R1
bl v_ascz
bl v_nl
bl strlen @ returns string length of R1 into R0
sub R0,#1
mov R5,R0
bl alloc
bl store
ldr R0,=p1
ldr R0,[R0]
pop {R1,R2,R5,R14}
bx LR
alloc:
push {R0-R4,R14}
bl malloc
ldr R1,=p1
str R0,[R1]
pop {R0-R4,R14}
bx LR
store:
push {R1-R4,R14}
mov R2,#0 @ index
ldr R4,=p1
ldr R4,[R4]
loop: ldrb R3,[R1],#1
strb R3,[R4],#1
add R2,#1
cmp R2,R5
blt loop
mov R3,#0
strb R3,[R4] @ store null at end of string
pop {R1-R4,R14}
bx LR
.end
这是我正在使用的链表添加节点功能。它分配 8 个字节,并将地址存储到前 4 个数据中,并将地址存储到后 4 个中的下一个节点:
.global list_add
@ R1 = addr of head
@ R2 = addr of tail
@ R3 = data
.data
node: .word 0
list_add:
push {R1-R4,R14}
bl alloc
push {R2}
ldr R2,[R2]
cmp R2,#0
pop {R2}
beq first_node
@ normal add
ldr R4,=node
ldr R4,[R4]
push {R2}
ldr R2,[R2] @ R2 = tail node
str R4,[R2,#4] @ R2 next ptr = node
pop {R2}
str R4,[R2] @ tail = node
str R3,[R4] @ node data = first addr of data
mov R3,#0
str R3,[R4,#4]
pop {R1-R4,R14}
bx LR
first_node:
push {R1-R4}
ldr R4,=node
ldr R4,[R4]
str R4,[R1] @ head = node
str R4,[R2] @ tail = node
str R3,[R4] @ node data = data
mov R3,#0
str R3,[R4,#4]
pop {R1-R4}
pop {R1-R4,R14}
bx LR
alloc:
push {R1-R3,R14}
mov R0,#8
bl malloc
ldr R1,=node
str R0,[R1]
ldr R1,[R1]
mov R3,#0
str R3,[R1]
str R3,[R1,#4]
pop {R1-R3,R14}
bx LR
添加一堆以我女朋友的狗为中心的随机字符串,这是output。忽略数字,它们是 malloc 内存的十进制地址
【问题讨论】:
-
使用调试器,检查内存内容与您假设的不匹配的位置,从那里找出假设和代码拆分的位置 - 这可能是您的错误。仅从输出来看,您的字符串似乎没有正确终止。
-
谢谢,我会继续努力的!字符串是空终止的,它实际上只发生在长度为 12 的字符串上,我已经测试了很多不同的大小,所以这真的让我感到难过!不过我会继续挖掘
标签: assembly raspberry-pi arm