Программирование на Ассемблере
Теперь поясним смысл команды subq. Как мы уже
говорили (см. п. 2.4), счетчик для DBRA должен быть на единицу меньше, чем
число итераций цикла. А так как нам нужно N-1 итераций для N чисел
(последний элемент не с чем сравнивать), то корректируем счетчик так, чтобы
перед началом цикла его содержимое было N-2. Теперь напишем собственно цикл сравнений. Сравнение двух слов в памяти
выглядит примерно так: loop: move 2(A0),D3 ;следующее слово - в D3
cmp (A0),D3 ;сравниваем с текущим Здесь мы вынуждены использовать дополнительный регистр (D3), так как CMP не
допускает адресации обоих операндов в памяти.
Если второй операнд больше или равен первому, то обмен не нужен: bcc.s noswap ;ветвление, если больше или равно Иначе нужно поменять местами текущий элемент со следующим (к сожалению,
нельзя использовать EXG, так как эта команда работает только с регистрами): doswap: move (A0),D1 ;сохраняем первый элемент
move 2(A0),(А0) ;копируем второй элемент на место
;первого
move D1,2(A0) ;копируем первый элемент на место
;второго
moveq #1,D1 ;устанавливаем флаг
noswap: Теперь инкрементируем указатель и повторяем тело цикла, пока счетчик не
станет равным нулю: addq.l #2,A0 ;счетчик + 2
dbra D0,loop ;цикл И наконец, проверяем флаг завершения и повторяем цикл сортировки, если он
установлен: tst D1 ;флаг = 0?
bne.s sort ;нет - повторить
rts ;да - конец Вот и все. Приведем полный листинг программы сортировки: ;(4.2B)
run: move.l #table,A1 ;указатель на таблицу
moveq #5,D2 ;число элементов
bsr.s sort
|