2016-10-30 8 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」はちょうど2で割っていますか?右シフトを使用します。 –

+0

コードにいくつかの問題があります。 BLO BHI BEQはすべての可能性を順番に処理します。したがって、以下に続くのは到達不能なコードです。また、インデックスXを使用してデータ配列をポイントする必要があります。 – tonypdmtr

答えて

0

(私はこのアセンブラを使用しているまず第一に:。。http://www.aspisys.com/asm11.htm それは 別のアセンブラにそれが互換性を持たせるためにいくつかのマイナーな構文の調整が必要になる場合がありますたとえば、@@ 現在PROC内のローカルシンボルを示す)

実際の のメモリアドレスではなく、単純なインデックス(0..N-1)で処理する方が良いです。これは、ワードサイズによっては、中点の計算が難しくなる可能性があります。

簡素化のために、1バイトの頭と尾の 変数を使用できますが、最大配列は256エントリに制限されます。 私はそれを単語として残し、最大64Kのエントリを与えました。

初期化の簡略化のために、スタティックアレイ(ROMに常駐)を使用しました。 アレイをRAMに格納する場合は、最初に データで初期化し、DWディレクティブを使用するのではなく、 RMB WORD_SIZE * ARRAY_SIZEを使用してメモリ領域を割り当てる必要があります。

グローバル変数をまったく使用する必要はありません。 BinarySearchルーチンを記述して、異なるテーブルで使用できるようにすることができます。 の例では、目標値をレジスタDに渡し、開始アドレスの をレジスタXに、 レジスタYに配列要素の数を渡します。次に、作業変数(mid_point、target、head、およびtail ) は、検索にエントリするとスタックにすべて動的に割り当てられ、終了する前に割り当て解除された は、結果(mid_point)をレジスタ X(たとえば)にロードします。

すべてのレジスタはBinarySearch内で破棄されます。エントリにPUSHを使用し、保護する場合は終了時にPULL をプルします。

BinarySearchは、ターゲットが見つかるとキャリークリアで終了し、mid_point 変数は関連するポインタで更新されます。ターゲットが ではなく、mid_pointが 'garbage'である場合にキャリーが設定されます。

;******************************************************************************* 
; 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