2014-11-12 5 views
0

Я пишу ассемблер для простого RISC-процессора, который имеет очень малый размер для прыжков (7 бит подписан). Все скачки рассчитываются по:Ассемблерные наклейки с ограниченным диапазоном прыжков

PC = PC + IMMEDIATE + 1 

где ПК является программным счетчиком, который указывает на следующую инструкцию.

Если вам нужно прыгать более 64 строк вперед вам необходимо сцепленные прыжки следующим образом:

JMP, 0x3F 

//64 lines ahead 

JMP, 0x5; 

Это будет эффективно прыгать 70 строк перед текущей инструкцией.

Мой вопрос приходит, когда мы имеем метки:

JMP, label 

//more than 64 lines ahead 

label: 

Как ассемблер генерировать код для этого? вам нужны два ярлыка или будет ли ассемблер в два прыжка для вас? Если он вставляет два прыжка, как он знает, если команда не идет на 64 строки вперед?

+0

Вы пишете, что ассемблер, так что до вас. Автоматическая вставка прыжков приводит к неприятностям в странных случаях и все время сложно. Если вы все еще заинтересованы в этом, я могу написать некоторые подробности об этом. – harold

+0

Это сложная проблема, и иногда точный выбор команды перехода (или последовательность инструкций перехода) разрешается только компоновщиком. – EOF

+0

Должен ли я просто сделать так, чтобы перейти на любую метку, это должно быть 64 линии впереди или 63 раньше? В этом случае делать большие прыжки практически невозможно? ISA имеет инструкцию JALR, которая помещает PC + 1 в регистр и загружает новые значения ПК из регистра. То, как это будет работать, это загрузить адрес в регистр (скажем, этот регистр является ассемблером, зарегистрированным только как MIPS) и установить на него ПК. ПК + 1 можно просто отправить в нулевой регистр, который уничтожит нежелательный результат. – Anthony

ответ

1

Условные прыжки не могут двигаться дальше 127 байт вперед или 128 байт назад. Безусловные прыжки могут скачкообразно перескакивать. Думаю, вы пробовали это с условным прыжком. Если вы хотите перейти условно к месту, превышающему 127 байт, напишите безусловный переход к этому месту и вставьте условный переход, прежде чем он перепрыгнет через другую команду перехода, если условие не будет выполнено. Например, этот код:

je label 

//more than 127 bytes ahead 

label: 

Может быть заменить этот код:

jne omit 
jmp label 
omit: 
//more than 127 bytes ahead 
label: 
Смежные вопросы