(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
Ist das "IDIV" nur durch zwei dividieren? Verwenden Sie eine Rechtsverschiebung. –
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