[英]Segmentation fault with ARM assembly code called by C program
我正在尝试编写一个基本的C程序,该程序在Beaglebone白色上调用外部汇编函数。 的
据我了解,分段错误是程序尝试访问内存的非法部分时出现的,但是由于执行了使用相同方法的示例,因此我不知道该怎么办。
这是主要的C程序,它调用汇编函数将输入的数字乘以5:
/*-- C_mult_by_5.c*/
#include <stdio.h>
extern int mult_by_5(int number);
int main()
{
int number_read;
int number_read_by_5;
printf("Hey, type a number");
scanf("%d", &number_read);
number_read_by_5 = mult_by_5(number_read);
printf("%d times 5 is %d\n\r", number_read, number_read_by_5);
return(0);
}
这是用于执行该操作的汇编代码:
/*-- mult_by_5.s*/
.data
.balign 4
return: .word 0
.balign 4
message : .asciz "Result: %d\n"
.text
.balign 4
.global printf
.global mult_by_5
mult_by_5:
ldr r1, address_of_return /*r1 < address_of_return*/
str lr, [r1] /* *r1 < lr*/
ldr r0, [r0] /*r0 < *r0*/
add r0, r0, r0, LSL #2 /*r0 < r0 + 4*r0*/
mov r1, r0 /* r1 < r0 */
ldr r0, address_of_message /*r0 < &message*/
bl printf /*call to printf*/
ldr lr, address_of_return /*lr < &address_of_return*/
ldr lr, [lr] /*lr < *lr*/
bx lr /*return from main using lr*/
address_of_return : .word return
address_of_message : .word message
.end
在运行代码期间,链接寄存器是否发生了某些事情,使其尝试返回非法地址?
尝试,
/*-- mult_by_5.s*/
.text
.balign 4
.global printf
.global mult_by_5
mult_by_5:
add r1, r0, r0, LSL #2 /*r1 = r0 + 4*r0*/
ldr r0, =message /*r0 < &message*/
b printf /*tail call printf */
message : .asciz "Result: %d\n"
.balign 4
.end
同样,有关ARM链接和帧指针的问题可能会有所帮助。 通常,您只需将lr
推入/弹出堆栈,而不使用.data
或静态内存。 堆栈数据结构非常适合函数调用,因此它内置于许多机器语言中。
另外,您可以检查编译器的功能 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.