Напишите код сборки, который сортирует следующие числа в памяти стека: 2, 34, 3, 12, 8 - PullRequest
0 голосов
/ 07 ноября 2018

РЕДАКТИРОВАТЬ: Первоначально у меня было впечатление, что я использую x86, но я не. Я не знаю, какую версию сборки (если это действительно так называется) я использую. Просто когда я открываю atmel, мой профессор заставляет нас выбрать ATMega328p.

Это вопрос, который я сейчас пытаюсь решить. Я не специалист по CS, который безнадежен, когда дело доходит до программирования на ассемблере, и я просто хочу пройти оставшуюся часть семестра. Я использую ATMega328p. Я нашел несколько алгоритмов сортировки в Интернете (http://www.miguelcasillas.com/?p=340) и (https://github.com/oc-cs360/s2014/blob/master/lc3/bubblesort.asm), но я не уверен, как их использовать для достижения этой цели. Будем благодарны за любые советы о том, что изменить / если они применимы к моей ситуации.

Для справки, первая часть задания попросила меня перевернуть массив из 100 элементов, хранящийся в памяти, используя стек. Код, который я создал для этого, был:

ldi r16, low(RAMEND)
out spl, r16
ldi r16, high(RAMEND)
out sph, r16

ldi r17, 0
ldi zl, low(0x0100)
ldi zh, high(0x0100)
lpm

ldi r17, 100
ldi xl, low(0x0150)
ldi xh, high(0x0150)
lpm

loop:
cpi r17, 100
brge reverse
push r17
st z+, r17
inc r17
jmp loop

reverse:
cpi r17, 1
brlt done
pop r18
st z+, r18
dec r17
jmp reverse

done:
ret

В этом случае нам не были даны какие-либо конкретные значения, поэтому был использован цикл. Я предполагаю, что для этого вопроса решения начинаются примерно так:

ldi r16, low(RAMEND)
out spl, r16
ldi r16, high(RAMEND)
out sph, r16

ldi r16, 2
sts 0x0100, r16
ldi r16, 32
sts 0x0101, r16
ldi r16, 3
sts 0x0102, r16
ldi r16, 12
sts 0x0103, r16
ldi r16, 8
sts 0x0104, r16

Но после этого, когда мне нужно получить доступ к ОЗУ и начать сортировку / сравнение значений, я теряюсь.

1 Ответ

0 голосов
/ 08 ноября 2018

Используется набор инструкций AVR Assembly. Смотри здесь и вы можете найти конкретные инструкции для ATmega328p в таблице в главе 37. (Пока нельзя добавить это как комментарий ..)

Что вам нужно сделать, это нажать первый элемент в стеке, а затем уменьшить указатель стека (кажется, является частью операции push, то же самое для pop). И продолжайте, пока все из массива не будет в стеке. Затем отмените эту операцию, вытянув данные из стека (здесь увеличьте указатель стека) и продолжайте, пока стек не опустеет. Если это сделано, массив должен быть полностью изменен.

...