此汇编代码是否按升序对数字进行排序?
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
如果无符号 lo
wer 元素已经在较高地址,则跳过交换,因此它将最低(无符号)元素排序到大批。这是降序。
商店(如果有的话)与货物来自相同的两个位置,所以这确实是一个交换,而不是一些错误的废话。
我想弄清楚这段汇编代码在执行什么。
.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
如果无符号 lo
wer 元素已经在较高地址,则跳过交换,因此它将最低(无符号)元素排序到大批。这是降序。
商店(如果有的话)与货物来自相同的两个位置,所以这确实是一个交换,而不是一些错误的废话。