我正在尝试创建一个程序来计算我必须扫描的字符串的字符串长度。这就是我所拥有的,但它在ldrb r1, [r1]
处出现了错误。我正在尝试增加地址以达到字符串中的下一个字符。
.section .data
.balign 4
scan_pattern: .asciz "%s"
.balign 4
string: .word 50
.balign 4
null_char: .byte '\0'
.balign 4
result: .asciz "%d"
.section .text
.global main
main:
ldr r0, =scan_pattern
ldr r1, =string
bl scanf
mov r0, #0
ldrb r1, [r1]
ldr r2, =null_char
ldrb r2, [r2]
bl count
count:
cmp r1, r2
bne incr
bl end_pro
incr:
add r1, r1, #1
add r0, r0, #1
bl count
end_pro:
ldr r1, [r0]
ldr r0, =result
ldr r1, [r1]
bl printf
mov r0, $0
bl fflush
nop @no operation
mov r7, $1 @exit syscall
svc $0 @wake kernel
.end
答案 0 :(得分:2)
r1
可以/将被sscanf
打击;你需要在通话后恢复它。 E.g。
ldr r4, =string
mov r1, r4
bl sscanf
...
ldr r1, [r4] ; formerly: ldr r1, [r1]
但是乍一看,程序中似乎存在更多问题(第二次ldr r1, [r1]
崩溃可能也是如此,bl
并没有直接错误,但是简单的b
跳跃会是更常见的是,你不会迭代字符串,...)。
我建议用C语言编写你的算法,编译它并在二进制文件中使用'objdump -d'来查看如何解决它......
编辑:
简单且未经测试的strlen()
实现可能看起来像
@ size_t xstrlen(char const *s)
xstrlen:
mov r3, r0 @ char const *orig = s
1:
ldrb r1, [r0], #1 @ char c = *s++;
cmp r1, #0 @ if (c != 0)
bne 1b @ goto 1;
sub r0, r0, r3 @ return s - orig - 1
sub r0, #1
bx lr
称之为
main:
ldr r0, =scan_pattern
ldr r1, =string
bl scanf
ldr r0, =string
bl xstrlen
mov r1, r0
ldr r0, =result
bl printf