sorting - 这个汇编代码是否按升序排序数字?
问题描述
我试图弄清楚这个汇编代码正在执行什么。
.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:
我相信它可能是按升序对数字进行排序,但我不确定。该表留空,因为我不确定那里存储了哪些值。我试图仅根据代码弄清楚代码的作用。
解决方案
是的,看起来像一个简单的冒泡排序(没有通过检查是否发生任何交换来使代码膨胀的“早期”优化;如果您想要更好的几乎排序的输入性能,请使用 InsertionSort)。请参阅冒泡排序:考古算法分析,了解不同形式的冒泡排序,包括每次外部迭代扫描的元素范围减少 1 的情况。
与其他简单排序相比,它在 AVR 上的代码大小方面具有一个有趣的优势,即访问都是本地的,因此它们都可以使用 Z 寄存器,并且不必为地址计算执行 add-with-carry。(虽然插入排序应该是相似的。)
A
从较高的地址加载。
cp A,B
/brlo
如果无符号 wer 元素已经位于较高地址,则跳过交换lo
,因此它将最低(无符号)元素排序到数组的末尾。那是降序。
商店(如果它们发生的话)与加载的两个位置相同,所以这确实是一个交换,而不是一些错误的废话。
推荐阅读
- javascript - 下载“pdf”按钮在 ipad/iphone 上不起作用
- c# - 如何使用 HTML 编辑器清除 WebBrowser 控件的内容?
- c# - 如何让 AdGroupAuthProvider 与 OrmLiteCacheClient 一起工作?
- php - PHP - 如何从 WS 读取对象内部的 xml
- python - ROS2 动作执行回调永远不会退出
- android - 我如何生成图像,像进度条一样滑动?
- sql - 如何解决当我尝试创建此过程时出现的错误“ERROR 102 sql state 420000”
- powershell - 重新启动后无法映射网络驱动器错误
- javascript - 当我尝试导入“Highway”包时收到“Unexpected identifier”错误
- ant - ng build 在使用 ANT build 构建 Angular5 项目时不起作用