Pregunta

I have a C-file f1.c with several functions inside. I need to write one of those functions in assembly code for armv4 and then put it back inside f1.c. So I extracted the function I wanted in assembly code into another file (called test1.c) and compiled it with:

arm-linux-gnueabi-gcc -S -march=armv4 test1.c 

In test1.c I have:

extern long int li1, li2, li3;
int main()
{
    iowrite32(li1, li2);
    iowrite32(li3, li1);
    return 0;
}

After that I get the following code test1.s:

.arch armv4
.eabi_attribute 27, 3
.fpu vfpv3-d16
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file   "test1.c"
.text
.align  2
.global main
.type   main, %function
main:
    @ Function supports interworking.
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    stmfd   sp!, {fp, lr}
    add fp, sp, #4
    ldr r3, .L2
    ldr r2, [r3, #0]
    ldr r3, .L2+4
    ldr r3, [r3, #0]
    mov r0, r2
    mov r1, r3
    bl  iowrite32
    ldr r3, .L2+8
    ldr r2, [r3, #0]
    ldr r3, .L2
    ldr r3, [r3, #0]
    mov r0, r2
    mov r1, r3
    bl  iowrite32
    mov r3, #0
    mov r0, r3
    sub sp, fp, #4
    ldmfd   sp!, {fp, lr}
    bx  lr
.L3:
    .align  2
.L2:
    .word   li1
    .word   li2
    .word   li3
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",%progbits

The problem is that I need to put that assembly code (t1.s) back to file f1.C, so I use:

asm volatile( "stmfd    sp!, {fp, lr}\n\t"
              "add  fp, sp, #4\n\t"
              [...]);

BUT I don't know how I can put back instructions such as: ldr r3, .L2

Because they refer to the extern variables, which are under the label L2 and f1.c won't compile if I try

    "ldr r3, .L2\n\t"

Could anyone tell me how I can do it? Thank you.

¿Fue útil?

Solución

In the end, I'm doing it this way: Instead of:

    "ldr    r3, .L2+4\n\t"

I'm saving the direction of the variable in another register:

    "ldr    r4, =li2\n\t"

And then I load it in the first one:

    "ldr    r3, [r4]\n\t"

I don't know if it is the correct answer, but it compiles and works as expected

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top