Скажем, исключение достигнуто в слоте задержки перехода условной ветви
например,
BEQ a0, zero, _true
BREAK (0000)
sw a0, 0000(t0)
_true:
sw a1, 0000(t0)
Мой обработчик исключений выберет исключение тип 9 из инструкции BREAK и установите бит BD регистра CAUSE равным 1, так как он имеет значение задержки ветвления, а EPC будет адресом ветвления.
В документации сказано, что это потребует сложной обработки, которая не описана.т.е. получение цели перехода / перехода, выполнение любого необходимого сравнения, а затем установка ПК на истинный или ложный адрес.
Мое решение обойти сложную обработку (что немного похоже на взлом)следует:
- Сохранить инструкцию в слоте задержки перехода
- NOP инструкцию в слоте задержки перехода
- Возврат из обработчика исключений, восстанавливающего все регистры
- повторно выполнить * BEQ a0, zero, _true *, и задержка перехода будет nop, поэтому она не будет иметь никакого эффекта
- Поместите точку останова sw в цель (ы) ветви и установитефлаг
- после нажатия на точку останова sw восстановите ячейку задержки ветвления и удалите следы точек останова sw.
Разбор веток и скачков - это хорошо (поэтому я могу получить цели) но в условных ветвях, после того, как я проанализировал, я должен был сделать сравнения, чтобы определить, переходить ли к истинной части перехода к ложному (следующая строка), что, по моему мнению, является более трудоемким.хан, я бы хотел. Разве я не ??
Моя проблема с моим хакерским методом заключается в следующем:
Будет ли процессор уже запомнил, что он достиг условной ветви, и определил, что послеСлот задержки ветвления был выполнен независимо от того, собирается ли он брать ветку или нет, поэтому, как только я указываю Program Counter обратно на ветку, и он выполняется вместо правильного выполнения, он думает, что должен перейти к истине.или ложная часть ветки, которая была предопределена до возникновения исключения?(попробуйте двойной прыжок)