(私はこのアセンブラを使用しているまず第一に:。。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
「IDIV」はちょうど2で割っていますか?右シフトを使用します。 –
コードにいくつかの問題があります。 BLO BHI BEQはすべての可能性を順番に処理します。したがって、以下に続くのは到達不能なコードです。また、インデックスXを使用してデータ配列をポイントする必要があります。 – tonypdmtr