簡體   English   中英

C程序調用的ARM匯編代碼存在分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM