编写汇编代码,对堆栈内存中的以下数字进行排序: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的主要内容,如果未能解决你的问题,请参考以下文章

编写程序以升序对堆栈进行排序

如何在汇编中使用堆栈对数组进行排序

汇编语言 怎样向内存中写入数字

ARM汇编指令-STM32单片机启动

汇编实现排序——冒泡排序

汇编语言内存单元地址的算法