在 arm 中打印字符串时出现分段错误

Segmentation fault in printing string in arm

  1 .data
  2
  3 .balign 4
  4 message1: .asciz "Enter name: "
  5
  6 .balign 4
  7 message2: .asciz "name is %s\n"
  8
  9 .balign 4
 10 scan_pattern: .asciz "%s"
 11
 12 .balign 4
 13 string_read: .space 100
 14
 15 .balign 4
 16 return: .word 0
 17
 18 .text
 19
 20 .global main
 21 main:
 22         ldr r1, address_return //load return address in r1
 23         str lr, [r1]  //store value of lr in r1
 24
 25         ldr r0, address_message1 //load message1 address in r0
 26         bl printf //call printf on r0
 27
 28         ldr r0, address_scan_pattern //load scanpattern address in r0
 29         ldr r1, address_string_read //load number_read address in r1
 30         bl scanf //call scanf
 31
 32         ldr r0, address_message2 //load message2 address in r0
 33         ldr r1, address_string_read //load address_number_read in r1
 34         ldr r1, [r1] //load value of r1 into r1
 35         bl printf //call printf
 36
 37         ldr r0, address_string_read //load address_number_read in r0
 38         ldr r0, [r0] //value of r0 in r0
 39
 40         ldr lr, address_return //load address of return in lr
 41         ldr lr, [lr] //load value of lr in lr
 42         bx lr //go to lr
 43
 44 address_message1: .word message1
 45 address_message2: .word message2
 46 address_scan_pattern: .word scan_pattern
 47 address_string_read:  .word string_read
 48 address_return: .word return
 49
 50 .global printf
 51 .global scanf

It seems to read the name, but when I try to print it, it give me a segmentation fault. I don't know where it went wrong. Any hint or help is appreciated. I did allocate space to hold the string so where is the segv coming from?

好的,我想我明白问题所在了。顺便说一句,感谢 every 行的精彩评论——侧边栏。保持。这就是 asm 专家所做的。汇编程序没有太多评论

我认为第 26 行的 printf 有效。是第 35 行的 printf 失败了。

第一个 printf 只需要一个指针参数 [in r0]。注意完全你是如何加载 r0 的。

第二个 printf 需要两个指针参数。先把arg改成r0,用的方法和第一个printf一样。

看看你是如何为第二个参数加载 r1 的。它应该与您对 r0 所做的类似。

但是……不是。对于 r1,你在第 34 行有一个额外的间接负载。我想如果你删除它,一切都会起作用。

相当于:

char *str = "Hello World";

printf("My str: %s\n",*str);  // what you did
printf("My str: %s\n",str);  // what you intended