Этот цикл эквивалентен следующему коду C:
char *byte = data;
char cur, max = 0;
while ((cur = *byte++))
if (cur > max) max = cur;
т.е. цикл всегда будет повторяться по всем значениям и завершаться, когда он находит ноль в конце. Это означает, что к тому моменту, когда вы нажмете EXIT
, вы пройдете проверку BEQ EXIT
, которая проверила результат предыдущей загрузки и нашла его равным нулю. CCR будет 0x ?? 04, т. Е. Только Z
, установлен ноль флагов, поскольку именно это BEQ
проверяет.
Что касается теста BLE
, это сложная проверка флагов; Согласно справочнику Motorola 68k , таблица 3.19, он проверяет на Z || (N && !V) || (!N && V)
, то есть на взаимную исключительность N
/ V
или ноль (что было бы равно часть), поэтому несколько комбинаций флагов могут привести к тому, что эта ветвь будет взята. Для ваших конкретных данных я бы предположил, что, учитывая, что предыдущее значение было 12, вы в конечном итоге установили N
, то есть значение CCR 0x??08
(CMP
на большинстве процессоров вычитает со сбросом и 12-13 отрицательно).
Что касается сборки m68k, этот викибук - хорошее введение. Он описывает условные тесты ветвей / флагов CCR, но не учитывает хитрости, указанные выше ...