Я пишу ассемблер для простого RISC-процессора, который имеет очень малый размер для прыжков (7 бит подписан). Все скачки рассчитываются по:Ассемблерные наклейки с ограниченным диапазоном прыжков
PC = PC + IMMEDIATE + 1
где ПК является программным счетчиком, который указывает на следующую инструкцию.
Если вам нужно прыгать более 64 строк вперед вам необходимо сцепленные прыжки следующим образом:
JMP, 0x3F
//64 lines ahead
JMP, 0x5;
Это будет эффективно прыгать 70 строк перед текущей инструкцией.
Мой вопрос приходит, когда мы имеем метки:
JMP, label
//more than 64 lines ahead
label:
Как ассемблер генерировать код для этого? вам нужны два ярлыка или будет ли ассемблер в два прыжка для вас? Если он вставляет два прыжка, как он знает, если команда не идет на 64 строки вперед?
Вы пишете, что ассемблер, так что до вас. Автоматическая вставка прыжков приводит к неприятностям в странных случаях и все время сложно. Если вы все еще заинтересованы в этом, я могу написать некоторые подробности об этом. – harold
Это сложная проблема, и иногда точный выбор команды перехода (или последовательность инструкций перехода) разрешается только компоновщиком. – EOF
Должен ли я просто сделать так, чтобы перейти на любую метку, это должно быть 64 линии впереди или 63 раньше? В этом случае делать большие прыжки практически невозможно? ISA имеет инструкцию JALR, которая помещает PC + 1 в регистр и загружает новые значения ПК из регистра. То, как это будет работать, это загрузить адрес в регистр (скажем, этот регистр является ассемблером, зарегистрированным только как MIPS) и установить на него ПК. ПК + 1 можно просто отправить в нулевой регистр, который уничтожит нежелательный результат. – Anthony