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?
最佳答案
好的,我想我明白问题所在了。顺便说一句,感谢您的精彩评论 - 每一行 的侧边栏。继续努力吧。这就是 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
关于arm - Arm打印字符串时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33538098/