Ассемблер
Он дал эти вопросы 13, очевидно, самая большая часть данных в выборке. После того, как 13 было сохранено в D0, каково было состояние CCR, когда с ним сравнивали другое число (просто дайте 5 битов и укажите, какие биты были запущены). б. Каково было состояние CCR после того, как последний фрагмент данных (0) был перемещен в регистр D1.
*
ORG $400
MOVEA.L #DATA,A0
CLR.B D0
NEXT MOVE.B (A0),D1
BEQ EXIT
CMP.B D0,D1
BLE EndTest
MOVE.B D1,D0
EndTest ADDA.L #1,A0
BRA NEXT
EXIT STOP #$2700
*
ORG $1000
Data DC.B 12,13,5,6,4,8,4,10,0
END $400
Я скомпилировал его, но я не вижу 5 бит в easy68k. Я знаю, что ccr сделан из флаговых битов, но я не уверен, что делать.
1 ответ
Этот цикл эквивалентен следующему коду 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, но не учитывает хитрости, описанные выше...