我尝试在C内编写一些汇编代码,然后调用C函数。我的代码如下:
C:
void my_fun(uint32_t *arg) {
//sth
}
汇编器:
ldr r2, my_fun_label
bx r2
my_fun_label: .word my_fun
使用调试器,我发现r2寄存器包含一些随机值,而不是my_fun地址。因此程序分支到无处,并保持冻结状态。有人可以帮我吗?
我正在使用nRF52 ARM Cortex M4微控制器。
编辑: 结果
0003ea0a: my_fun:
asm_test:
0003ea26: ldr r2, [pc, #0] ;(0x3ea28 <asm_test+2>)
0003ea28: bx r2
0003ea2a: and.w r0, sp, r3
但是my_fun_label
似乎指向0x0dea0300
答案 0 :(得分:0)
soc.c
void my_fun ( void )
{
}
sos.s
.thumb
ldr r2, my_fun_label
bx r2
my_fun_label: .word my_fun
构建和拆卸
arm-none-eabi-gcc -mthumb -O2 -c soc.c -o soc.o
arm-none-eabi-as sos.s -o sos.o
arm-none-eabi-ld -Ttext=0x1000 sos.o soc.o -o so.elf
arm-none-eabi-objdump -D so.elf
Disassembly of section .text:
00001000 <my_fun_label-0x4>:
1000: 4a00 ldr r2, [pc, #0] ; (1004 <my_fun_label>)
1002: 4710 bx r2
00001004 <my_fun_label>:
1004: 00001009 andeq r1, r0, r9
00001008 <my_fun>:
1008: 4770 bx lr
100a: 46c0 nop ; (mov r8, r8)
工作完美
可能希望对齐地址,以免您有50/50的机会赌博。
.thumb
ldr r2, my_fun_label
bx r2
nop
my_fun_label: .word my_fun
谢谢你gnu
arm-none-eabi-as sos.s -o sos.o
sos.s: Assembler messages:
sos.s:5: Error: invalid offset, target not word aligned (0x00000002)
sos.s:5: Error: invalid offset, value too big (0x00000002)
力对准
.thumb
ldr r2, my_fun_label
bx r2
nop
.align
my_fun_label: .word my_fun
那更好
Disassembly of section .text:
00001000 <my_fun_label-0x8>:
1000: 4a01 ldr r2, [pc, #4] ; (1008 <my_fun_label>)
1002: 4710 bx r2
1004: 46c0 nop ; (mov r8, r8)
1006: 46c0 nop ; (mov r8, r8)
00001008 <my_fun_label>:
1008: 0000100d andeq r1, r0, sp
0000100c <my_fun>:
100c: 4770 bx lr
100e: 46c0 nop ; (mov r8, r8)
自我修改代码是您可能不得不使用障碍和/或处理缓存等的另一故事...