此汇编代码是否按升序对数字进行排序?

Is this assembly code sorting numbers in ascending order?

我想弄清楚这段汇编代码在执行什么。

.equ        SIZE    =128
.equ        TABLE_L =
.equ        TABLE_H =[=10=]

.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:  

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

是的,看起来像一个简单的冒泡排序(没有通过检查是否发生任何交换使代码膨胀的“提前出局”优化;如果您想要更好的几乎排序输入性能,请使用 InsertionSort)。请参阅 Bubble Sort: An Archaeological Algorithmic Analysis 了解不同形式的冒泡排序,包括每次外迭代扫描的元素范围减少 1 的这种形式。

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


A从高地址加载

cp A,B / brlo 如果无符号 lower 元素已经在较高地址,则跳过交换,因此它将最低(无符号)元素排序到大批。这是降序。

商店(如果有的话)与货物来自相同的两个位置,所以这确实是一个交换,而不是一些错误的废话。