2016-10-30 5 views
1

루프 (69HC11) 어셈블리에서 이진 검색 알고리즘을 만들어야합니다. 이것은 내가 무엇을했는지 있습니다 :바이너리 검색 어셈블리 68HC11

ORG $C400 
;n1-n5 will have numbers 
N1 RMB 2 
N2 RMB 2 
N3 RMB 2 
N4 RMB 2 
N5 RMB 2 
IZQ RMB 2 
DER RMB 2 
;Here is where is going to be the answer 
MID RMB 2 
;The number im searching 
T RMB 2 
    ORG $C500 
LDD #$400 
STD IZQ 
LDD #$408 
STD DER 
LOOP: LDD IZQ 
     ADDD DER 
     LDX #2 
     IDIV 
     STX MID 
     LDD MID 
     CPD #T 
     BLO LAZO1 
     BHI LAZO2 
     BEQ LAZO3 
     LDD IZQ 
     CPD DER 
     BLS LOOP 
LAZO1: 
;izq = mid + 1 
    INX 
    STX IZQ 
    BRA LOOP 

LAZO2: 
;der = mid - 1 
    DEX 
    STX DER 
    BRA LOOP 

LAZO3: 
Fin: BRA Fin 

문제는 루프가 나는 D에 그 위치에있는 값을 중간 위치와 다음 저장을 계산 할 것입니다. 나는 $ MID와 같은 것을 쓰려고했지만 분명하지 않다.

+1

두 개로 나누는 'IDIV'입니까? 오른쪽 교대를 사용하십시오. –

+0

코드에 몇 가지 문제가 있습니다. BLO BHI BEQ는 순서대로 모든 가능성을 처리합니다. 따라서 다음은 도달 할 수없는 코드입니다. 또한 인덱스 X를 사용하여 데이터 배열을 가리켜 야합니다. – tonypdmtr

답변

0

(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