手臂印刷线的分段故障

时间:2015-11-05 06:36:52

标签: 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
  

它似乎是读取名称,但是当我尝试打印它时,它会给我一个分段错误。我不知道哪里出了问题。任何提示或帮助表示赞赏。我确实分配空间来保存字符串,所以segv来自哪里?

1 个答案:

答案 0 :(得分:1)

好的,我想我看到了问题。顺便说一句,感谢每个行的优秀评论 - 侧边栏。保持。它是asm专家所做的。对于汇编程序来说,没有太多的评论

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

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

第二个printf需要两个指针参数。首先使用与第一个printf相同的方法进入r0。

看看如何为第二个参数加载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