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来自哪里?
答案 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