ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
15 июля
1530383 Топик полностью
=AlexD= (Вчера, 16:58, просмотров: 64) ответил Kpoк на Я на асемблере пишу. Где я и где эй ай?
DeepSeek Вот пример реализации сортировки пузырьком на ассемблере для микроконтроллеров dsPIC: 

```assembly

; Процедура сортировки пузырьком для dsPIC

; Входные параметры:

; W0 - адрес начала массива

; W1 - количество элементов в массиве (беззнаковое)

; Используемые регистры:

; W2, W3, W4, W5, W6

BUBBLE_SORT:

; Проверка на пустой массив или массив из одного элемента

CP.B W1, #1

BRA LEU, SORT_END ; Если W1 <= 1, завершить

; Инициализация внешнего цикла (i)

SUB W1, #1, W2 ; W2 = i (внешний цикл) = n-1

; (т.к. индексы с 0)

OUTER_LOOP:

; Инициализация внутреннего цикла (j)

MOV #0, W3 ; W3 = j (внутренний цикл) = 0

; Инициализация флага обмена

MOV #0, W6 ; W6 = флаг обмена = 0

INNER_LOOP:

; Загрузка текущего элемента (arr[j])

ADD W0, W3, W4 ; W4 = адрес arr[j]

ADD W4, W3, W4 ; Для 16-битных элементов (каждый занимает 2 байта)

MOV [W4], W5 ; W5 = arr[j]

; Загрузка следующего элемента (arr[j+1])

ADD W4, #2, W4 ; W4 = адрес arr[j+1]

MOV [W4], W7 ; W7 = arr[j+1]

; Сравнение элементов

CP W5, W7

BRA LEU, NO_SWAP ; Если arr[j] <= arr[j+1], не менять

; Обмен элементов (swap)

MOV W5, [W4] ; arr[j+1] = старый arr[j]

SUB W4, #2, W4 ; W4 снова указывает на arr[j]

MOV W7, [W4] ; arr[j] = старый arr[j+1]

; Установка флага обмена

MOV #1, W6 ; Установить флаг обмена = 1

NO_SWAP:

; Увеличение индекса внутреннего цикла

INC W3, W3 ; j++

; Проверка условия внутреннего цикла (j < n-i-1)

SUB W2, W3, W4 ; W4 = (n-1) - j

BRA GTU, INNER_LOOP ; Пока j < (n-1)-i

; Проверка флага обмена

CP0 W6

BRA Z, SORT_END ; Если обменов не было, массив отсортирован

; Уменьшение индекса внешнего цикла

DEC W2, W2 ; i--

; Проверка условия внешнего цикла (i > 0)

CP0 W2

BRA GTU, OUTER_LOOP ; Пока i > 0

SORT_END:

RETURN

```

Примечания:

1. Этот код предполагает, что массив состоит из 16-битных элементов (каждый занимает 2 байта).

2. Для массивов с 8-битными элементами нужно убрать вторую инструкцию `ADD W4, W3, W4` и изменить смещение на 1 байт вместо 2.

3. Для массивов с 32-битными элементами нужно соответственно изменить смещения и обработку.

4. Сортировка выполняется по возрастанию (для сортировки по убыванию измените условие `BRA LEU` на `BRA GEU`).

5. Код оптимизирован для dsPIC, где доступны 16-битные регистры W0-W15.

Пример вызова процедуры:

```assembly

MOV #array, W0 ; Адрес массива

MOV #array_size, W1 ; Количество элементов

RCALL BUBBLE_SORT ; Вызов сортировки

```

Это моё личное предвзятое мнение. Любое совпадение с реальностью является случайным и непреднамеренным.