在 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
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