编写汇编代码,对堆栈内存中的以下数字进行排序:2、34、3、12、8
Posted
技术标签:
【中文标题】编写汇编代码,对堆栈内存中的以下数字进行排序:2、34、3、12、8【英文标题】:Write an assembly code that sorts the following numbers on the stack memory: 2, 34, 3, 12, 8 【发布时间】:2018-11-07 16:51:54 【问题描述】:编辑:最初,我的印象是我使用的是 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
但之后,一旦我必须访问 RAM 并开始对值进行排序/比较,我就会丢失。
【问题讨论】:
那不是 x86; atmega 不生产任何 x86 芯片。语法也绝对不是 x86。 彼得,你知道那是什么吗?我的一位同行告诉我,我猜他们被误导了。 【参考方案1】:它使用 AVR 汇编指令集。见here 您可以在第 37 章的datasheet 中找到 ATmega328p 的具体说明。(尚不能将此添加为评论..)
你应该做的是将第一个元素压入堆栈,然后减少堆栈指针(似乎是压入操作的一部分,对于弹出也是如此)。继续直到数组中的所有内容都在堆栈上。然后通过从堆栈中提取数据来反转此操作(在此处增加堆栈指针)并继续直到堆栈为空。如果这样做了,则应该反转数组。
【讨论】:
以上是关于编写汇编代码,对堆栈内存中的以下数字进行排序:2、34、3、12、8的主要内容,如果未能解决你的问题,请参考以下文章