以下是两个函数,每个函数在地址 0x20200020 存储一位:
.globl arm_func_1
arm_func_1:
ldr r0,=0x20200020
mov r1,#1
lsl r1,#16
str r1,[r0]
bx lr
.globl arm_func_2
arm_func_2
ldr r0,=0x20200020
mov r1,#1
lsl r1,#17
str r1,[r0]
bx lr
致电arm_func_1
后,地址 0x20200020 的内容为:
0x20200020 = 00000000000000010000000000000000
从arm_func_2
返回后致电arm_func_1
时,地址 0x20200020 的内容为:
0x20200020 = 00000000000000100000000000000000
如何避免覆盖地址 0x20200020 的现有位,只修改一位,结果如下:
0x20200020 = 00000000000000110000000000000000
我正在寻找一种可以在多种情况下工作的方法,因此在调用函数之前,我不必跟踪内存地址的值。
答案 0 :(得分:0)
您应首先使用您请求的位读取地址or
处的值,然后将其写回。可能如下:
.globl arm_func
arm_func:
ldr r0,=0x20200020
ldr r2,[r0]
mov r1,#1
lsl r1,#16
orr r2, r1
str r2,[r0]
bx lr
或者对于更通用的方法,您可以从gcc
获得帮助:
$ cat updatebit.c
void f(unsigned int *addr, int bit) {
*addr |= 1 << bit;
}
$ objdump -d updatebit.o
updatebit.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <f>:
0: e5903000 ldr r3, [r0]
4: e3a02001 mov r2, #1
8: e1831112 orr r1, r3, r2, lsl r1
c: e5801000 str r1, [r0]
10: e12fff1e bx lr