2016-11-16 4 views
0

Вот мой код сборки для A9,Преобразование ARM кода в C

ldr  x1, = 0x400020    // Const value may be address also 
ldr  w0, = 0x200018  // Const value may be address also 
str  w0, [x1] 

Ниже один ожидается выход?

*((u32 *)0x400020) = 0x200018;  

Когда я перекрестился с ним с помощью компилятора, он дал результат differnet как mov и movs insted ldr. Как создать ldr в c?

+0

@Lundin: Мое замечание было неверным. Я бы как-то пропустил 'str' в конце. – Michael

+0

@ Майкл Можете ли вы объяснить для третьей инструкции «str w0, [x1]» – BasavarajaMS

+0

@ Michael Ah, так же как и я. Это закончилось тем, что было сделано как комментарий из-за некоторого редактирования goof-up. Теперь вопрос восстановлен. – Lundin

ответ

2

Когда я перепроверена с этим компилятором он дал Differnet результата, как мы и варисторы

Это звучит для меня, как вы собрали код C с компилятором ориентируется AArch32, но код сборки вы» показанное выглядит так, как будто оно было написано для AArch64. Вот что я получаю, когда я компилирую с ARM64 GCC 5.4 и уровень оптимизации O3 (добавлены комментарии мной):

mov  x0, 32   @ x0 = 0x20 
    mov  w1, 24   @ w1 = 0x18 
    movk x0, 0x40, lsl 16 @ x0[31:16] = 0x40 
    movk w1, 0x20, lsl 16 @ w1[31:16] = 0x20 
    str  w1, [x0] 

Как создать LDR в C?

Я не вижу никакой веской причины, по которой вы хотите, чтобы компилятор генерировал LDR в этом случае.
LDR reg,=value - это псевдо-инструкция, которая позволяет загружать непосредственные объекты, которые не могут быть закодированы непосредственно в слове инструкции. Ассемблер достигает этого, поместив значение (например, 0x200018) в literal pool, а затем заменив ldr w0, =0x200018 на относительную нагрузку на ПК из этого литерального пула (например, что-то вроде ldr w0,[pc,#offset_to_value]). Доступ к памяти медленный, поэтому компилятор сгенерировал для вас еще одну последовательность инструкций, которая обеспечивает более эффективную работу с одним и тем же.

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

TL; DR: Компилятор будет генерировать то, что, по его мнению, является лучшим (в соответствии с текущим уровнем уровня оптимизации) инструкцией. Кроме того, эта форма LDR является псевдо-инструкцией, поэтому вы не сможете получить компилятор для ее создания, даже если вы отключите все оптимизации.