编写一个汇编代码,对堆栈存储器上的以下数字进行排序:2、34、3、12、8

时间:2018-11-07 16:51:54

标签: sorting assembly atmega atmel

编辑:最初,我的印象是使用x86,但我没有。我不知道我使用的是什么版本的程序集(如果实际上就是它的名称)。只是当我打开atmel我的教授让我们选择ATMega328p时。

这是我目前正在尝试解决的问题。我是非CS专业的学生,​​在汇编语言编程方面毫无希望,我只想完成本学期的其余部分。我正在使用ATMega328p。我已经在Internet(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

但是之后,一旦我必须访问RAM并开始对值进行排序/比较,我就迷路了。

1 个答案:

答案 0 :(得分:0)

它使用AVR组件指令集。参见here 您可以在第datasheet的第37章中找到有关ATmega328p的特定说明。(尚不能添加为注释。。)

您应该执行的操作是将堆栈中的第一个元素压入堆栈,然后减小堆栈指针(似乎属于压入操作的一部分,与pop相同)。然后继续,直到数组中的所有内容都在堆栈上为止。然后通过从堆栈中拉出数据(此处增加堆栈指针)来逆转此操作,直到堆栈为空。如果这样做,则阵列应该颠倒。

相关问题