Я нашел компилятор Greenhills для power p c, имеет несколько операторов выражения перемещения, например:
%lo(value): Least significant 16 bits of symbol value.
%hiadj(value) :Most significant 16 bits of symbol value plus most significant
bit of %lo(value).
Я проверил руководство GAS для цели V850, я нашел ниже:
lo() :Computes the lower 16 bits of the given expression and stores it into the immediate
operand field of the given instruction.
hi() :Computes the higher 16 bits of the given expression and then adds the value
of the most significant bit of the lower 16 bits of the expression and stores the
result into the immediate operand field of the given instruction.
Однако я не нахожу ничего подобного для powerp c target в руководстве GAS. Кто-нибудь знает, какие эквиваленты для powerp c target для G CC? если нет эквивалентного кода операции или оператора, какова эквивалентная сборка? Спасибо!
Обновление:
Получил лицензию на зеленые холмы и попробовал: Исходный код проекта Greenhills в одном C файле:
__asm__(e_lis sp, %hiadj(stack_address); )
__asm__(e_add16i sp,sp,%lo(stack_address);/* stack_address is one variable from link command file*/)
Дамп объекта из файла O и временного файла S из компиляции такой же, как показано ниже:
e_lis sp, %hiadj(stack_address);
e_add16i sp,sp,%lo(stack_address);
Когда я проверяю файл двоичной карты и дамп объекта двоичного файла, я получил следующую информацию :
stack_address = 400b6400
90001a4: 70 28 e0 0b e_lis r1,16395
90001a8: 1c 21 64 00 e_add16i r1,r1,25600
Вы можете ясно видеть, что на самом деле 16395 = 0x400b, 25600 = 0x6400, так что в основном% lo и% hiadj выполняются Greenhills, поэтому в G CC их нет . Я предполагаю, что в G CC есть тот же Марко или оператор, который делает то же самое, но я их не нахожу.
ОБНОВЛЕНИЕ: Согласно комментариям @ PeterCordes, @ha и @l должны быть правильными в G CC. @ha Часть «a» в @ha отвечает за расширение знака. @ h не имеет расширения знака.