當我試圖運行調用非常簡單的ARM彙編函數的C程序時,我目前有一個奇怪的問題。這裏是我的C代碼:ARM Assembly - 爲什麼我的應用在調零r7時崩潰?
#include <stdio.h>
#include <stdlib.h>
extern void getNumber(int* pointer);
int main()
{
int* pointer = malloc(sizeof(int));
getNumber(pointer);
printf("%d\n", *pointer);
return 0;
}
這是我的彙編代碼:
.section .text
.align 4
.arm
.global getNumber
.type getNumber STT_FUNC
getNumber:
mov r1, #0
str r1, [r0]
bx lr
到目前爲止好。但是,如果我在getNumber
的頂部添加了一行mov r7, #0
,則在嘗試訪問pointer
時程序會發生段錯誤。用gdb檢查它之後,我發現指針本身存儲在一個非常低的地址,如0xa。
現在,我做了一些研究,顯然r7是THUMB代碼的幀指針(根據this)。但是,我明確指出我不想在我的彙編代碼中的.arm
行中使用THUMB指令。爲什麼它失敗了?
我使用arm-linux-gnueabihf-gcc編譯.c和.s文件,並且在基於Cortex-A8的運行Arch Linux的主板上運行該程序。
編輯:如果我使用-fomit-frame-pointer標誌編譯,程序運行良好。但是,我仍然想知道爲什麼它使用r7作爲幀指針。
編輯2:即使我使用.code 32
而不是.arm
,它仍然失敗。
所以你的問題應該是「如何禁用GCC中的Thumb ISA擴展?」不知道你在這裏試圖做什麼,你正在用GCC創建彙編代碼,然後向它添加一行彙編? –
我不知道它默認啓用了Thumb,它會忽略我的'.arm'指令。請再讀一遍我的問題。 – Martin
幾乎每個ARM芯片都默認啓用Thumb。如果在不瞭解ISA的情況下向寄存器寫入值就會遇到麻煩,這就是您遇到的情況。另外,.arm指令默認使用Thumb,因爲它是一個幾乎普遍接受的擴展。 –