我正在用M68K汇编语言编写一个程序来查找数组中的最小值。
这是我的代码:
ORG $8000
; DATA
array DC.B 2,3,1,4,5 ; The minimum is 1
len EQU 5
min DC.L 0 ; Stores the found minimum
START:
lea.l array,a0
move.b (a0)+,d0 ; d0 = 2 (current minimum), a0 now points to 3
moveq.l #len-1,d1 ; One element already used
LOOP:
cmpi.l #0,d1 ; If d1 = 0, no more elements to check
beq.s END ; Jump to the end if finished
move.b (a0)+,d2 ; Load next element into d2
; d2 = 3, a0 -> 1
; d2 = 1, a0 -> 4
; d2 = 4, a0 -> 5
; d2 = 5, a0 -> ??? (What happens here?)
cmp.b d0,d2
blt.s UPDATE ; If d2 < d0, update minimum
bra.s DECREMENT
UPDATE:
move.b d2,d0 ; Update the minimum
DECREMENT:
subq.l #1,d1 ; Decrease counter
bra.s LOOP
END:
move.b d0,min ; Store the minimum
SIMHALT
END START
我的问题:
- 在我标记的位置,处理完最后一个元素5
???
后会发生什么?它是否指向无效地址?a0
- 我的初始化方法是否是
d0
一个move.b (a0)+,d0
好的开始方式,或者是否有更好的方法? - 我的代码还可以进一步优化吗?
任何建议都将不胜感激!谢谢!
您的最小变量直接跟随数组,因此 A0 将指向最小长字变量的第一个字节。
没关系。
当然!
无需在循环顶部测试零计数器。不过,您可以在循环之前测试它以防万一。关于进行更多迭代的决定应如下进行:
尽量避免必须这样做
BRA
。如果 D2 < D0,则不分支到UPDATE,而是基于相反的条件绕过bge
:由于您一直在处理字节,因此您可以定义最小值一个字节。
[编辑]
Erik Eidt 注意到了写入长字变量错误部分的问题。
.EVEN
指令(如果可用)来解决此问题。move.b d0, min
您将把值存储在权重最大的字节中。不可避免地,这会产生错误的结果。解决方案是存储一个完整的长字,并且由于您的数组应该包含有符号字节,因此使用ext
指令可以解决这个问题:ext.w d0
首先从字节符号扩展到字,然后ext.l d0
从字符号扩展到长字。当然,如果最小变量是字节大小的话,这些额外的复杂性就不会存在。
修改后的方案: