Почему условное ветвление в ASM 6502 имеет ограничение в 128 байт?

Каковы аппаратные причины, по которым подпрограмма должна находиться в пределах 128 или -127 байтов от выданной инструкции ветвления?


person Luken    schedule 03.10.2015    source источник
comment
Просто: смещение кодируется с использованием 8-битного числа со знаком.   -  person Jester    schedule 03.10.2015
comment
Чтобы обойти это ограничение, поменяйте смысл условного перехода на противоположный, чтобы он пропускал инструкцию перехода к местоположению, которое находится на расстоянии более 127 байт. Некоторые ассемблеры имеют макрос условного перехода, который делает это, но я не знаю, есть ли такой макрос в ассемблере 6502.   -  person rcgldr    schedule 03.10.2015


Ответы (2)


Аппаратные причины двоякие:

  • во-первых, 6502 является 8-битным процессором, что означает, что один байт может содержать значения без знака от 0 до 255, или, если бит 7 используется для обозначения знака (дополнение до двух), то от -128 до +127.

  • во-вторых, Чак Педдл разработал инструкцию ветвления как двухбайтовую операцию — первый байт представляет собой условие ветвления (код операции), а второй — значение смещения со знаком (операнд), которое должно быть добавлено к счетчику программ [ПК], если условие истинно. .

Как теперь очевидно, использование байта смещения с одним знаком в качестве операнда перехода означает, что максимальный диапазон «перехода», который может принять инструкция BRx, составляет либо 128 позиций назад от текущего ПК, либо 127 позиций вперед.

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

Архитектура ЦП более чем компенсирует ограничение диапазона за счет того, что BRx является невероятно быстрой инструкцией — всего 2 цикла, если ветвь не выполняется, и еще один цикл, если она выполняется (т. е. 2 цикла для чтения кода операции и операнда и установки маску сравнения во внутреннем регистре, а затем еще одну, чтобы добавить операнд к ПК, если условие истинно).

Для сравнения, инструкция JMP позволяет потоку программы переходить в любое место в диапазоне 16-битных адресов, поскольку она использует операнд с двухбайтовым адресом, но демонстрирует фиксированную стоимость в 3 цикла и является безусловной. Тщательное построение таблицы переходов или самомодифицирующегося кода с использованием JMP и индексированного ветвью позволяет программисту извлечь выгоду из скорости и обусловленности BRx и понести затраты на «дальний переход» только тогда, когда условие истинно.

person Eight-Bit Guru    schedule 03.10.2015
comment
Преодолеть это ограничение можно так же просто, как повернуть, например. BEQ label на BNE 3; JMP label, если label не помещается в 8-битный диапазон со знаком. - person Cactus; 06.10.2015

Это связано с тем, что операторы условного перехода имеют длину всего 2 байта, причем первый байт представляет собой код операции инструкции, а второй байт представляет собой значение со знаком (дополнение до двух), которое отмечает расстояние до адреса для перехода, если условие истинно. (Я считаю, что значение — DestinationAddress — AddressImmediatelyFollowingBranchStatement). С двумя дополнениями и только одним доступным байтом расстояние до адреса назначения ограничено следующим диапазоном: [-128, +127].

Короче говоря, это потому, что разработчики 6502 предоставили только один байт со знаком в дополнении до двух в качестве параметра для операторов условного перехода.

person beneficii    schedule 03.10.2015