Когда я перепроверена с этим компилятором он дал 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
является псевдо-инструкцией, поэтому вы не сможете получить компилятор для ее создания, даже если вы отключите все оптимизации.
@Lundin: Мое замечание было неверным. Я бы как-то пропустил 'str' в конце. – Michael
@ Майкл Можете ли вы объяснить для третьей инструкции «str w0, [x1]» – BasavarajaMS
@ Michael Ah, так же как и я. Это закончилось тем, что было сделано как комментарий из-за некоторого редактирования goof-up. Теперь вопрос восстановлен. – Lundin