生成コードの配置

生成コードの配置には 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

results matching ""

    No results matching ""

    results matching ""

      No results matching ""