首页 > 解决方案 > 这个汇编代码是否按升序排序数字?

问题描述

我试图弄清楚这个汇编代码正在执行什么。

.equ        SIZE    =128
.equ        TABLE_L =$60
.equ        TABLE_H =$00

.def    A   =r13
.def    B   =r14
.def    cnt2    =r15
.def    cnt1    =r16
.def    endL    =r17
.def    endH    =r18

Outer:
    mov ZL, endL
    mov ZH, endH
    mov cnt2, cnt1
inner_loop: ld  A, Z
    ld  B, -Z
    cp  A, B
    brlo    L1
    st  Z, A
    std Z+1, B
L1: dec cnt2
    brne    inner_loop
    dec cnt1
    brne    Outer
    ret

table:  

我相信它可能是按升序对数字进行排序,但我不确定。该表留空,因为我不确定那里存储了哪些值。我试图仅根据代码弄清楚代码的作用。

标签: sortingassemblyavrbubble-sort

解决方案


是的,看起来像一个简单的冒泡排序(没有通过检查是否发生任何交换来使代码膨胀的“早期”优化;如果您想要更好的几乎排序的输入性能,请使用 InsertionSort)。请参阅冒泡排序:考古算法分析,了解不同形式的冒泡排序,包括每次外部迭代扫描的元素范围减少 1 的情况。

与其他简单排序相比,它在 AVR 上的代码大小方面具有一个有趣的优势,即访问都是本地的,因此它们都可以使用 Z 寄存器,并且不必为地址计算执行 add-with-carry。(虽然插入排序应该是相似的。)


A从较高的地址加载。

cp A,B/brlo如果无符号 wer 元素已经位于较高地址,则跳过交换lo,因此它将最低(无符号)元素排序到数组的末尾。那是降序。

商店(如果它们发生的话)与加载的两个位置相同,所以这确实是一个交换,而不是一些错误的废话。


推荐阅读