arm - Arm打印字符串时出现段错误

标签 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?

最佳答案

好的,我想我明白问题所在了。顺便说一句,感谢您的精彩评论 - 每一行 的侧边栏。继续努力吧。这就是 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/

相关文章:

c++ - arm-none-eabi-g++ 无法使用 -flto 正确处理弱别名

linux - 为 ARM 交叉编译时共享对象导入错误

iOS 6 vs 7 外观build设置

c - 告诉编译器以不同的方式翻译某条指令?

c - Atmel SAM v71 XPlained - 无法与端口 C 配合使用

c++ - 为 arm : c++: error: unrecognized command line option ‘-mthumb’ ; did you mean ‘-mtbm’ ? 交叉编译 opencv

c++ - 是否有与 Sse2 _mm_unpackhi/lo_epi32/64 和 _mm_shuffle_epi8/32 等效的 Neon?

c - 按下两个开关时打开 LED

android - 有人在嵌入式 Linux 上运行(android)adb 进行网络共享吗?

assembly - Q(饱和标志)在 ARM 中的重要性