Программирование на Ассемблере
;вызов подпрограммы сортировки
illegal ;конец программы sort: move.l A1,A0 ;указатель - во временный регистр
move D2,D0 ;установка счетчика
subq #2,D0 ;корректировка
moveq #0,D1 ;очищаем флаг завершения
loop:
move 2(A0),D3 ;следующий элемент - в D3
cmp (A0),D3 ;сравниваем с текущим
bcc.s noswap ;ветвление, если больше или равно doswap: move (A0),D1 ;сохраняем текущий элемент
move 2(A0),(A0) ;копируем следующий на место текушего
move D1,2(A0) ;записываем текущий элемент на место
;следущщего
moveq #1,D1 ;установка флага noswap: addq.l #2,A0 ;перемещаем указатель
dbra D0,loop ;цикл, пока не обработаем все элементы
tst D1 ;были перестановки?
bne.s sort ;да, повторить
rts ;иначе возврат table: dc.w 10,8,6,4,2 end Оттранслируйте эту программу, запишите на диск и загрузите в отладчик.
Запустите программу с адреса \"run:\" и выберите пункт
\"Parameter-Display-Disassembled\". Если Вы правильно ввели программу, то
элементы таблицы table теперь будут следовать в порядке возрастания (2, 4,
6, 8, 10). Написанная нами подпрограмма \"портит\" некоторые регистры, что обычно весьма
нежелательно (ведь вызывающая программа может использовать эти регистры для
своих целей). Поэтому в начале любой подпрограммы целесообразно сохранять
регистры (например, в стеке), а перед возвратом - восстанавливать. Для
этого удобно использовать команду MOVEM (см. п.2.4): sort: movem.l D0-D7/A0-A6,-(SP) ;сохраняем регистры
loop1:
... ;наша программа сортировки
... tst D1 ;...
|