手臂汇编器:bx跳转到任何地方

时间:2018-12-12 14:08:26

标签: c function assembly microcontroller

我尝试在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

1 个答案:

答案 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)

自我修改代码是您可能不得不使用障碍和/或处理缓存等的另一故事...