Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
arm中打印字符串的分段错误_Arm - Fatal编程技术网

arm中打印字符串的分段错误

arm中打印字符串的分段错误,arm,Arm,它似乎读的是名字,但当我试图打印它时,它给了我一个分段错误。我不知道哪里出了问题。任何提示或帮助都将不胜感激。我确实分配了空间来容纳字符串,所以segv从哪里来 好吧,我想我看到问题了。顺便说一句,谢谢你的精彩评论——每行的边栏。坚持下去。asm专家就是这么做的。对于汇编程序来说,并没有太多的注释 我想第26行的printf是有效的。第35行的printf失败了 第一个printf只需要一个指针参数[在r0中]。请注意您是如何加载r0的 第二个printf需要两个指针参数。使用与第一个print

它似乎读的是名字,但当我试图打印它时,它给了我一个分段错误。我不知道哪里出了问题。任何提示或帮助都将不胜感激。我确实分配了空间来容纳字符串,所以segv从哪里来


好吧,我想我看到问题了。顺便说一句,谢谢你的精彩评论——每行的边栏。坚持下去。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