Как передать параметры на язык ассемблера ARM? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующая программа на ассемблере для ядра A76. Как вы можете видеть, значение, которое я загружаю в X0, жестко запрограммировано. Как я могу передать параметры и запустить код в цикле для этой программы:

EXPORT tlb_ram_data_register_18_1
tlb_ram_data_register_18 PROC
;   B asm_Switch2NonSecure  
;   B EL1_to_EL3_Switch
LDR X0, =0x000000001800009B
SYS #6, c15, c0, #0, X0
DSB SY
ISB
MRS X0, S3_6_c15_c0_1 ; Move ILData0 register to X1
RET 
ENDP

Значение для X0 (0x000000001800009B) является адресом кодировки регистра, который содержит переменные, такие как путь кэш-памяти и индексы. Я должен изменить способ и индексы в цикле, чтобы прочитать различное содержимое этого регистра из кода C, как показано ниже:

for(way0 = 0x0;way0 <= 0xFF ; way0++)
{
    I0_W0 = tlb_ram_data_register_18_1(way0);
}

Еще один вопрос: если я прочитаю X0, как я делаю в коде сборки, и вернусь из функции, то перейдет ли это значение в I0_W0?

1 Ответ

0 голосов
/ 29 октября 2018

технически это зависит от компилятора, но для ARM некоторые из них соответствуют одному и тому же ABI. Но вы можете просто спросить компилятор, и он даст вам правильный ответ. Написать программу тестирования программы

extern unsigned int tlb_ram_data_register_18_1 ( unsigned int );
unsigned int fun ( void )
{
    unsigned int way0;

    for(way0 = 0x0;way0 <= 0xFF ; way0++)
    {
        tlb_ram_data_register_18_1(way0);
    }
    return(5);
}

На данный момент я создаю компилятор aarch64, но сейчас вот как выглядит рука, вы увидите нечто похожее с любой целью.

Я использую текущую версию GCC

00000000 <fun>:
   0:   e92d4010    push    {r4, lr}
   4:   e3a04000    mov r4, #0
   8:   e1a00004    mov r0, r4
   c:   e2844001    add r4, r4, #1
  10:   ebfffffe    bl  0 <tlb_ram_data_register_18_1>
  14:   e3540c01    cmp r4, #256    ; 0x100
  18:   1afffffa    bne 8 <fun+0x8>
  1c:   e3a00005    mov r0, #5
  20:   e8bd4010    pop {r4, lr}
  24:   e12fff1e    bx  lr

не так очевидно, но в качестве параметра функции используется r0

также обратите внимание, что r0 используется для возвращаемого значения

unsigned int fun ( unsigned int x )
{
    return(x+1);
}


00000000 <fun>:
   0:   e2800001    add r0, r0, #1
   4:   e12fff1e    bx  lr

r0 является первым / единственным параметром и также используется для возврата.

ааа, у меня есть удобный acc64 gcc

0000000000000000 <fun>:
   0:   11000400    add w0, w0, #0x1
   4:   d65f03c0    ret

w0 на пути и на выходе. Вы можете попробовать это снова с 64-битным параметром и посмотреть, изменится ли это.

...