生成コードの配置
生成コードの配置には ORG疑似命令を使用します。
yas80 ではORGから次のORGまでを "セグメント" としてまとめ、
出力ファイル中での配置を決定します。
ORGの第 1 引数で指定されたアドレスがセグメント内の最初の命令のベースアドレスになります。ORGの第 2 引数を指定しない場合、もしくはABSを指定した場合は "絶対セグメント" となり、ORGで指定されたアドレスがセグメントのアドレスになります。ORGの第 2 引数にRELを指定した場合は "相対セグメント" となり、先行する絶対セグメントの一部として配置されます。- 相対セグメントに先行する絶対セグメントがない場合、
ORG 0の絶対セグメントが指定されたものとして処理します。 - 絶対セグメントのアドレス範囲は重複できません。エラーになります。
- 相対セグメントは配置上はデータとして扱うため、他のセグメントとアドレス範囲は重複してもエラーになりません
| ORG 指定 | セグメント種別 | 配置先 |
|---|---|---|
ORG addr | 絶対 | addr |
ORG addr, ABS | ||
ORG addr, REL | 相対 | 先行する絶対・相対セグメントの最終アドレス + 1 |
ORG なし
ORGを指定していない場合、
addrとして0が指定された(ORG 0)として扱います。
ORG addr
addrを命令のベースアドレスとしてアセンブルし、
出力ファイルの配置(ロード)アドレスとして出力します(MZT, T88 の場合)。
複数 ORG(RELなし)
複数の ORG を指定した場合、
- それぞれ指定されたアドレスをベースアドレスとしてアセンブル
- セグメントのアドレスを
ORGで指定されたアドレスとする - セグメントをアドレス順でソート
- セグメントのアドレスを元に出力ファイル内での位置を決定し、
出力ファイルを生成します。
出力ファイルのロードアドレスはソート後の先頭セグメントのアドレスです。
セグメントのアドレ範囲が重複する場合はエラーととします。
また、セグメント間にギャップがある場合、--fillオプションで指定した値で埋めます。
org $20
jp $ ; アドレス $20 から配置なので jp $0020
org $00
jp $ ; アドレス $00 から配置なので jp $0000
org $10
jp $ ; アドレス $10 から配置なので jp $0010
0000: c3 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ; jp $0000 0003-000f はギャップ
0010: c3 10 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ; jp $0010 0013-001f はギャップ
0020: c3 20 00 ; jp $0020
複数 ORG(RELあり)
相対セグメントを使用する場合の例を示します。
org $20
jp $ ; jp $0020
org $100, REL ; 相対セグメント
top1:
jp top1 ; jp $0100
org $100, REL ; 相対セグメントは他のセグメントとアドレス重複可能
top2:
jp top2 ; jp $0100
org $10 ; ロードアドレス $10 から配置
jp $ ; jp $0010
; 絶対セグメント $0010 + gap
0010: c3 10 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ; jp $0010 0003-000f はギャップ
; 絶対セグメント $0020 + 相対セグメント $0100 x 2
0020: c3 20 00 c3 00 01 c3 00 01 ; jp $0020
; jp $0100
; jp $0100
この場合、シンボルファイルは同じアドレスに対し複数のシンボルが出力されます。
0100 TOP1
0100 TOP2
次の例は2000 - 20ffの 256 バイトの領域に、
sub1もしくはsub2の どちらかをロードし、
mainからはcall 2000とすることで異なる処理を実行することを想定したものです。
org $1200
main:
ld a, 0
call select_bank ; 2000 からの領域に sub1 or sub 2 をロード
call $2000 ; sub1, sub2 でも同じ
halt
select_bank proc
ret
endp
;
org $2000
; bank 0
org $2000, rel
sub1 proc
; do something
ret
endp
align 256
; bank 1
org $2000, rel
sub2 proc
; do something
ret
endp
align 256