arm中打印字符串的分段错误
它似乎读的是名字,但当我试图打印它时,它给了我一个分段错误。我不知道哪里出了问题。任何提示或帮助都将不胜感激。我确实分配了空间来容纳字符串,所以segv从哪里来arm中打印字符串的分段错误,arm,Arm,它似乎读的是名字,但当我试图打印它时,它给了我一个分段错误。我不知道哪里出了问题。任何提示或帮助都将不胜感激。我确实分配了空间来容纳字符串,所以segv从哪里来 好吧,我想我看到问题了。顺便说一句,谢谢你的精彩评论——每行的边栏。坚持下去。asm专家就是这么做的。对于汇编程序来说,并没有太多的注释 我想第26行的printf是有效的。第35行的printf失败了 第一个printf只需要一个指针参数[在r0中]。请注意您是如何加载r0的 第二个printf需要两个指针参数。使用与第一个print
好吧,我想我看到问题了。顺便说一句,谢谢你的精彩评论——每行的边栏。坚持下去。asm专家就是这么做的。对于汇编程序来说,并没有太多的注释 我想第26行的printf是有效的。第35行的printf失败了 第一个printf只需要一个指针参数[在r0中]。请注意您是如何加载r0的 第二个printf需要两个指针参数。使用与第一个printf相同的方法将第一个arg转换为r0 看看您是如何为第二个参数加载r1的。它应该与您为r0所做的类似 但是。。。不是。对于r1,第34行有一个额外的间接负载。我想如果你把它去掉,事情会好起来的 这相当于:
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
我看到并理解这个错误。谢谢你的帮助。在删除该行后,它现在正在工作。@AvinashPrabhakar不客气。提出问题的人可以“接受”他们问题的答案(例如,这是所有给出的答案中最好的)。这让提供答案的人对他们的“声誉”有了分数,最终他们可以在网站内做更多的事情。哈哈,我只想给你你想要的分数。然而,我的声望太低了,以至于我无法投票支持你的答案。@AvinashPrabhakar我刚刚投票支持了你的问题。也许这会有帮助。请注意,我这样做是为了我提到的注释和行号。在我回答的所有asm问题中,你的措辞最好,最完整,所以你真的应该得到最好的回答upvote@AvinashPrabhakar谢谢你。我最近在这里回答了一个关于arm asm的问题:这个家伙没有你想象的那么好,所以我给了他“C语言中的arm伪代码”的概念。你可以在里面编译一个程序。它不是一个真正的指令集模拟器。但是,它更类似于“功能模拟器”。请参见此处了解sparc arch的一个示例。
char *str = "Hello World";
printf("My str: %s\n",*str); // what you did
printf("My str: %s\n",str); // what you intended