(I이 어셈블러 사용했다 첫째 :.. http://www.aspisys.com/asm11.htm 그것은 다른 어셈블러에 호환되도록 약간의 구문을 조정해야 할 수도 있습니다 예를 들어, @@ 현재 PROC 내 지역 심볼을 표시)를
단어 크기에 따라 메모리 주소가 아닌 중간 색인을 계산하기가 더 어려울 수도있는 간단한 색인 (0..N-1)을 사용하는 것이 좋습니다.
더 단순하게하기 위해 머리말과 뒷모습을 하나의 변수로 사용할 수 있지만 최대 배열은 256 개로 제한됩니다. 나는 그것을 단어로 남겨서 최대 64K 개의 항목을 주었다.
초기화 단순성을 위해 정적 배열 (ROM에 있음)을 사용했습니다. 배열을 RAM에 저장하려면 먼저 일부 데이터로 초기화해야하며 DW 지시문을 사용하는 대신 RMB WORD_SIZE * ARRAY_SIZE를 사용하여 메모리 영역을 할당해야합니다.
전역 변수를 사용할 필요가 전혀 없습니다. 다른 테이블과 함께 사용할 수 있도록 BinarySearch 루틴을 작성할 수 있습니다. 예제의 경우 대상 값을 레지스터 D에 전달하고 레지스터의 배열 주소 및 레지스터 Y의 배열 요소 수를 전달할 수 있습니다. 그런 다음 작업 변수 (mid_point, target, head 및 tail) 은 모두 Search에 들어갈 때 스택에 동적으로 할당 될 수 있으며 은 종료 전에 할당 해제되며 결과 (mid_point)는 레지스터 X (예 :)로로드됩니다.
모든 레지스터는 BinarySearch 내에서 파괴됩니다. 출입시 PUSH를 사용하고 보호하려면 출구에서 PULL 을 사용하십시오.
BinarySearch는 대상이 있으면 캐리 지우기로 끝나고 mid_point 변수는 관련 포인터로 업데이트됩니다. 목표가 이 아니고 mid_point가 '쓰레기'이면 캐리가 설정됩니다.
;*******************************************************************************
; Constants
;*******************************************************************************
STACKTOP equ $0DFF
Vreset equ $FFFE
VARS_ORG equ $0300
ARRAY_ORG equ $C400
CODE_ORG equ $C500
;*******************************************************************************
; Variables
;*******************************************************************************
#RAM
org VARS_ORG
mid_point rmb 2 ; eventually holds the answer
target rmb 2 ; the number to search for
head rmb 2 ; head work pointer
tail rmb 2 ; tail work pointer
;*******************************************************************************
; Code
;*******************************************************************************
#ROM
org ARRAY_ORG ;wherever you want your array to be
array dw 1000
WORD_SIZE equ *-array ;bytes per entry in array
dw 2000
dw 3000
dw 4000
dw 5000
dw 6000
dw 7000
dw 8000
dw 9000
ARRAY_SIZE equ *-array/WORD_SIZE
;*******************************************************************************
;org CODE_ORG ;wherever you want your code to be
BinarySearch proc
clra ;D = 0
clrb
std head ;initialize head pointer to zero
ldd #ARRAY_SIZE-1 ;initialize tail pointer to N-1
std tail
[email protected]@ ldd head
addd tail
rora ;LSRD will not work if previous
rorb ; ADDD produced a carry
std mid_point ;update mid_point
lsld ;multiply by WORD_SIZE (x2 -- a shift left will do)
addd #array ;offset into array
xgdx ;X = pointer
ldd target ;target number to search for
cpd ,x ;compare against array value
beq [email protected]@ ;if equal, we're done
bhi [email protected]@ ;if greater than, use upper half
; blo [email protected]@ ;if less than, use lower half
[email protected]@ ldx mid_point ;tail = mid_point - 1
dex
stx tail
bra [email protected]@
[email protected]@ ldx mid_point ;head = mid_point + 1
inx
stx head
[email protected]@ ldx head
cpx tail
bls [email protected]@
[email protected]@ sec ;indicates 'not found'
bra [email protected]@
[email protected]@ ldd mid_point
lsld
addd #array
std mid_point
clc ;indicates 'found'
[email protected]@ rts
;*******************************************************************************
Start proc
lds #STACKTOP
ldd #12345
std target
bsr BinarySearch
ldd #5000
std target
bsr BinarySearch
ldd #3000
std target
bsr BinarySearch
bra *
;*******************************************************************************
#VECTORS
org Vreset
dw Start
두 개로 나누는 'IDIV'입니까? 오른쪽 교대를 사용하십시오. –
코드에 몇 가지 문제가 있습니다. BLO BHI BEQ는 순서대로 모든 가능성을 처리합니다. 따라서 다음은 도달 할 수없는 코드입니다. 또한 인덱스 X를 사용하여 데이터 배열을 가리켜 야합니다. – tonypdmtr