首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序调用ARM汇编代码分割故障

C程序调用ARM汇编代码分割故障
EN

Stack Overflow用户
提问于 2016-03-12 23:39:24
回答 1查看 711关注 0票数 0

我正在尝试写一个基本的C程序,它调用Beaglebone白色的外部汇编函数。这个

据我所知,分段错误是当程序试图访问内存的非法部分时,但我不明白为什么会发生这种情况,因为我遵循了一个使用相同方法的示例。

下面是主C程序,它调用汇编函数将输入的数字乘以5:

代码语言:javascript
复制
/*-- 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);
    }

以下是用于执行该操作的汇编代码:

代码语言:javascript
复制
/*-- 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

在代码运行期间,链接寄存器是否发生了使其试图返回到非法地址的情况?

EN

回答 1

Stack Overflow用户

发布于 2016-03-13 11:35:03

试一下,

代码语言:javascript
复制
/*-- 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 link and frame pointer的问题可能会有所帮助。通常,您可以只在堆栈上推送/弹出lr,而不使用.data或静态内存。堆栈数据结构非常适合函数调用,因此它内置于许多机器语言中。

此外,您还可以查看what a compiler does

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35959662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档