Assembly 尝试在Motorola 68k汇编中的有序数组上进行二进制搜索
我试图找出如何使用m68k在有序数组上生成二进制搜索子例程。对于Java,我会这样做Assembly 尝试在Motorola 68k汇编中的有序数组上进行二进制搜索,assembly,motorola,68000,easy68k,Assembly,Motorola,68000,Easy68k,我试图找出如何使用m68k在有序数组上生成二进制搜索子例程。对于Java,我会这样做 int binSearch(int key, int &lo, int &hi) { if (hi < lo) return NOT_FOUND; //RETURN with V = 1 int mid = (lo+hi) / 2; if (key == array[mid]) return m
int binSearch(int key, int &lo, int &hi)
{
if (hi < lo)
return NOT_FOUND; //RETURN with V = 1
int mid = (lo+hi) / 2;
if (key == array[mid])
return mid;
else if (key < array[mid]) // go left
return binSearch(key, lo, mid-1); // left
else
return binSearch(key, mid+1, hi); // right
}
基本上,在这一点上我该怎么做?我是否将D1与我搜索的数字进行比较,然后根据它是否越来越低,再次调用子程序?D1是否像我希望的那样将数字保持在中间点,还是我错了?提前谢谢你 循环方法:
ORG $1000
START
LEA ARRAY,A0 ; start of array
MOVE.L #KEY,D0 ; key to find
MOVE.W #ELEMENTS,D1 ; length of array
BSR.S BINSEARCH
; D0 contains mid or -1 if fail
SIMHALT
BINSEARCH
MOVE.W D1,D2 ; high
MOVEQ #0,D1 ; low
BINLOOP
CMP.W D2,D1 ; hi = low?
BMI.S NOT_FOUND
MOVE.W D2,D3
ADD.W D1,D3
LSR.W #1,D3 ;mid
; there are no scaled index methods on a basic 68k
; check also that word index register addressing works on CPU
; if not some operations will have to be changed to long word
MOVE.W D3,D4
LSL.W #2,D4 ; *4 for long word
CMP.L (A0, D4.W),D0 ; compare mid element to key
BEQ.S BIN_FOUND
BMI.S SETLO
SETHI SUBQ.W #1,D2
MOVE.W D3,D2 ; hi = mid-1
BRA.S BINLOOP
SETLO ADDQ.W #1,D3
MOVE.W D3,D1 ; lo = mid+1
BRA.S BINLOOP
NOT_FOUND MOVEQ #-1,D3
BIN_FOUND MOVE.W D3,D0 ; return index or -1
RTS
ORG $1400
ARRAY DC.L 1,2,3,4,5,6,7,8,9,10,11
ARRAYEND
ELEMENTS EQU (ARRAYEND-ARRAY)/4
KEY EQU 3
提示:您可以在这里简单地取消递归,而使用一个简单的循环。500-内部服务器错误为了了解递归在汇编中的工作原理,我真的在尝试递归。我该怎么做呢?对不起,我不知道M68的装配。不过,如果给我这个任务,我会看看我最喜欢的编译器为您提供了什么。m68k没有缩放索引寻址模式,您可以使用它来代替复制D3和使用
lsl.w#2,D4
?还是他们行动缓慢?表明m68k具有标度指数。如果没有缩放索引,您可能会使用字节偏移量而不是索引,但我认为您需要在lsr
之后取整到最接近的4字节偏移量。或者在末尾使用指针而不是索引和sub,使用不同的中点计算以避免溢出。在现代CPU上,通常最好使用无分支条件mov或类似工具来更新hi/lo。我猜m68k通常具有较低的分支未命中惩罚和较高的每条指令成本,所以这可能是可以的。基本68000没有缩放索引。以后的版本会这样做。如果你愿意的话,你可以写一个替代版本:)
ORG $1000
START
LEA ARRAY,A0 ; start of array
MOVE.L #KEY,D0 ; key to find
MOVE.W #ELEMENTS,D1 ; length of array
BSR.S BINSEARCH
; D0 contains mid or -1 if fail
SIMHALT
BINSEARCH
MOVE.W D1,D2 ; high
MOVEQ #0,D1 ; low
BINLOOP
CMP.W D2,D1 ; hi = low?
BMI.S NOT_FOUND
MOVE.W D2,D3
ADD.W D1,D3
LSR.W #1,D3 ;mid
; there are no scaled index methods on a basic 68k
; check also that word index register addressing works on CPU
; if not some operations will have to be changed to long word
MOVE.W D3,D4
LSL.W #2,D4 ; *4 for long word
CMP.L (A0, D4.W),D0 ; compare mid element to key
BEQ.S BIN_FOUND
BMI.S SETLO
SETHI SUBQ.W #1,D2
MOVE.W D3,D2 ; hi = mid-1
BRA.S BINLOOP
SETLO ADDQ.W #1,D3
MOVE.W D3,D1 ; lo = mid+1
BRA.S BINLOOP
NOT_FOUND MOVEQ #-1,D3
BIN_FOUND MOVE.W D3,D0 ; return index or -1
RTS
ORG $1400
ARRAY DC.L 1,2,3,4,5,6,7,8,9,10,11
ARRAYEND
ELEMENTS EQU (ARRAYEND-ARRAY)/4
KEY EQU 3