Ассемблер

Он дал эти вопросы 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, но не учитывает хитрости, описанные выше...

Другие вопросы по тегам