保留现有位?

时间:2014-04-09 08:03:41

标签: assembly arm

以下是两个函数,每个函数在地址 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

我正在寻找一种可以在多种情况下工作的方法,因此在调用函数之前,我不必跟踪内存地址的值。

1 个答案:

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