Каковы аппаратные причины, по которым подпрограмма должна находиться в пределах 128 или -127 байтов от выданной инструкции ветвления?
Почему условное ветвление в ASM 6502 имеет ограничение в 128 байт?
Ответы (2)
Аппаратные причины двоякие:
во-первых, 6502 является 8-битным процессором, что означает, что один байт может содержать значения без знака от 0 до 255, или, если бит 7 используется для обозначения знака (дополнение до двух), то от -128 до +127.
во-вторых, Чак Педдл разработал инструкцию ветвления как двухбайтовую операцию — первый байт представляет собой условие ветвления (код операции), а второй — значение смещения со знаком (операнд), которое должно быть добавлено к счетчику программ [ПК], если условие истинно. .
Как теперь очевидно, использование байта смещения с одним знаком в качестве операнда перехода означает, что максимальный диапазон «перехода», который может принять инструкция BRx
, составляет либо 128 позиций назад от текущего ПК, либо 127 позиций вперед.
Это ограничение может быть обременительным для преодоления в случаях, когда вам нужно ветвиться (в отличие от прыгать, см. ниже) дальше, чем позволяет диапазон; однако практика и опыт в технике программирования на ассемблере 6502, а также глубокое понимание потока и организации вашего кода часто позволяют искусно проектировать, избегая необходимости разветвления на большие расстояния.
Архитектура ЦП более чем компенсирует ограничение диапазона за счет того, что BRx
является невероятно быстрой инструкцией — всего 2 цикла, если ветвь не выполняется, и еще один цикл, если она выполняется (т. е. 2 цикла для чтения кода операции и операнда и установки маску сравнения во внутреннем регистре, а затем еще одну, чтобы добавить операнд к ПК, если условие истинно).
Для сравнения, инструкция JMP
позволяет потоку программы переходить в любое место в диапазоне 16-битных адресов, поскольку она использует операнд с двухбайтовым адресом, но демонстрирует фиксированную стоимость в 3 цикла и является безусловной. Тщательное построение таблицы переходов или самомодифицирующегося кода с использованием JMP
и индексированного ветвью позволяет программисту извлечь выгоду из скорости и обусловленности BRx
и понести затраты на «дальний переход» только тогда, когда условие истинно.
BEQ label
на BNE 3; JMP label
, если label
не помещается в 8-битный диапазон со знаком.
- person Cactus; 06.10.2015
Это связано с тем, что операторы условного перехода имеют длину всего 2 байта, причем первый байт представляет собой код операции инструкции, а второй байт представляет собой значение со знаком (дополнение до двух), которое отмечает расстояние до адреса для перехода, если условие истинно. (Я считаю, что значение — DestinationAddress — AddressImmediatelyFollowingBranchStatement). С двумя дополнениями и только одним доступным байтом расстояние до адреса назначения ограничено следующим диапазоном: [-128, +127].
Короче говоря, это потому, что разработчики 6502 предоставили только один байт со знаком в дополнении до двух в качестве параметра для операторов условного перехода.