LINUX.ORG.RU

GCC inline assembler


0

0

Как записать в регистр адрес локальной метки (которая цифрами)

ldr r0, ???

123:
....

(ассемблер ARM, но думаю синтаксис общий)

★★★★★

Ответ на: комментарий от mv

таж фигня. я уже много чего перепробовал.

как временное решение - посчитал смещение вручную и сделал

r0 = pc + <ofs>

sergej ★★★★★
() автор топика
Ответ на: комментарий от sergej

Не так, много не надо!

Достаточно первой, но внимательно.

GCC, the GNU C Compiler for Linux, uses AT&T;UNIX assembly syntax

А в AT&T синтаксисе сначала записывают источник, а потом уж приемник.

наименование регистра начинается с - %

переменные начинаются с - $

Я не силен в АРМах, но на х86 код будет примрно таков:

some_label: ;сама метка

nop ;разные команды

movl $label, %eax ; загрузка адреса метки в еах

AF ★★★
()
Ответ на: комментарий от mv

Fixed:)

константы и адреса. Для значения переменных юзать круглые скобки.

AF ★★★
()
Ответ на: комментарий от io

Я такую форму записи не очень люблю, потому что нужно указывать направление смещения. Для адресации метки ДО кода нужно b юзать.

mv ★★★★★
()
Ответ на: комментарий от mv

А по другому с числовыми метками не работают. Да и использовать обычные в inline вставках, если нужно вставлять одно и тоже несколько раз, затруднительно. Т.ч. люби - не люби ...

io ★★
()

емнип по i8080 асму, там метка в квадратные скобки заключается

Lee_Noox ★★★
()

Хм, так в том-то и дело что у тебя ARM...

ARM не умеет грузить большое immediate значение, это свойство системы команд и организации ядра. Можно сделать две вещи:

1) сделать ladd r0, pc, label - . Т.е. вычислить через pc, прибавив смещение. Сразу напомню что pc у ARM больше адреса текущей команды на длину предвыборки в конвеер (сколько не помню, несколько вариантов, зависит от текущей команды);

2) недалеко записать константу в .text через .word и загрузить относительно pc со смещением;

Короче, только всё относительно pc. Глянь код генерируемый компилятором (-savetemps) сразу станет ясно.

ly
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.