Question: I have a C function witch looks like:

```
int foo(int a, long long b);

```

I'm trying to call it from arm assembly, but I don't know how to deal with the second parameter(`long long`).

Answer: 
The [ARM EABI/AAPCS](http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf) specifies that 64bit types should be passed in 2 registers which are next to each other and the first register must be even numbered. In little endian mode the high part resides in the higher numbered register, while the low part is put in the lowered numbered one. In big endian mode it's vice versa.

Both requirements are there to accomodate the strd/ldrd instructions, which can save two registers in a single instructions.

So, to pass 0x0123456789abcdef for your example in little endian mode you have to load the registers in the following way:

```
mov r0, a
// R1 is unused
ldr r2, =0x89abcdef
ldr r3, =0x01234567

```
Just ask the compiler it will tell you everything...

```
int foo ( int a, long long b );

int bar  ( void )
{
    return(foo(0xAABB,0x1122334455667788LL));
}

```

I prefer to compile then disassemble rather than compile to asm, easier to read.

```
arm-none-eabi-gcc -c -O2 fun.c -o fun.o
arm-none-eabi-objdump -D fun.o

fun.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <bar>:
   0:   e92d4008    push    {r3, lr}
   4:   e59f001c    ldr r0, [pc, #28]   ; 28 <bar+0x28>
   8:   e28f3010    add r3, pc, #16
   c:   e893000c    ldm r3, {r2, r3}
  10:   ebfffffe    bl  0 <foo>
  14:   e8bd4008    pop {r3, lr}
  18:   e12fff1e    bx  lr
  1c:   e1a00000    nop         ; (mov r0, r0)
  20:   55667788    strbpl  r7, [r6, #-1928]!   ; 0x788
  24:   11223344    teqne   r2, r4, asr #6
  28:   0000aabb            ; <UNDEFINED> instruction: 0x0000aabb
  2c:   e1a00000    nop         ; (mov r0, r0)

```

and the answer is r0 contains the first parameter, r1 skipped and r2/r3 contain the long long.