2016-10-30 3 views
1

Ich muss einen binären Suchalgorithmus in Assembly (69HC11) mit Schleifen machen. Dies ist, was ich getan habe:Binary Search Assembly 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 

Das Problem ist, dass die Schleife ich die Mittelposition berechnet werden soll und dann Speicherung in D den Wert, der in dieser Position ist. Ich habe versucht, etwas wie $ MID zu schreiben, ist aber nicht möglich.

+1

Ist das "IDIV" nur durch zwei dividieren? Verwenden Sie eine Rechtsverschiebung. –

+0

Mehrere Probleme mit Ihrem Code. BLO BHI BEQ in der Reihenfolge kümmert sich um alle Möglichkeiten. Was folgt, ist daher unerreichbarer Code. Außerdem müssen Sie den Index X verwenden, um auf das Datenarray zu zeigen. – tonypdmtr

Antwort

0

(erstes habe ich diesen Assembler verwendet haben:.. http://www.aspisys.com/asm11.htm Es kann einige kleinere Syntax Anpassungen müssen es andere Assembler kompatibel machen zum Beispiel die @@ zeigt lokale Symbole innerhalb des aktuellen PROC)

Es ist besser, mit einfachen Indizes (0..N-1) als tatsächliche Speicheradressen zu arbeiten, die es je nach Wortgröße schwierig machen können, den Mittelpunkt zu berechnen.

Zur Vereinfachung könnten Sie Single-Byte-Head- und Tail-Variablen verwenden, aber Ihr maximales Array wäre dann auf 256 Einträge beschränkt. Ich habe es als Wort, geben Sie maximal 64K Einträge.

Ich verwendete ein statisches Array (im ROM) für die Initialisierung Einfachheit. Wenn Sie möchten, dass das Array im RAM ist, müssen Sie es zuerst mit einige Daten initialisieren, und anstatt DW-Anweisungen zu verwenden, sollten Sie stattdessen RMB WORD_SIZE * ARRAY_SIZE verwenden, um den Speicherbereich zuzuweisen.

Es müssen keine globalen Variablen verwendet werden. Sie könnten die BinarySearch-Routine schreiben, so dass es mit verschiedenen Tabellen verwendet werden kann. Für Beispiel könnte der Zielwert in Register D übergeben werden, die Startadresse des Arrays in Register X und die Anzahl der Arrayelemente in Register Y. Dann Ihre Arbeitsvariablen (mid_point, target, head und tail) können alle dynamisch auf dem Stapel nach dem Eintritt in die Suche zugewiesen werden, und vor dem Beenden aufgehoben werden, während das Ergebnis (mid_point) in das Register X geladen wird (zum Beispiel).

Alle Register werden innerhalb von BinarySearch zerstört. Verwenden Sie PUSH bei der Eingabe und PULL beim Beenden, wenn Sie sie geschützt möchten.

BinarySearch wird mit Carry Clear beendet, wenn das Ziel gefunden wurde und die Mid_point Variable mit dem zugehörigen Zeiger aktualisiert wurde. Carry ist gesetzt, wenn target nicht gefunden wird, und mid_point ist 'Müll'.

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