これまでにそれなりの種類のアセンブリを見てきたけど、混乱した箇所があったため整理する。
それは、ORG疑似命令についてである。
実はこの命令、アセンブリの種類によって意味が全く違うのである。
例えば、GASではORGは次のような意味になるらしい。
.org [size] [, fill]
そのファイルの先頭から[size]分だけ[fill]で埋める。
[fill]が指定されなかった場合、デフォルトは0である。
例) .org 0x7c00
当然これをアセンブルすると、0x7bffまでぎっしり0で埋まったバイナリファイルが完成する。
次は、NASM・MASMの場合
ORG 0x7c00
JMP 0x100
これをアセンブルすると、おそらく3byteくらいのバイナリファイルが完成する。
ここでのORGの意味はVMAを指定するという意味である。
よってJMP命令は0x7c00を基準として行われる。
この3byteは「opecode 00 7d」みたいな機械語に変換される。
【GASではどうすればいいか?】
今回はgas,nasm,masmを比較したが、GASでほかの2つのアセンブリ言語のORGと同じことをしたいとしたらどうすればよいだろうか。
これに関しての自分の考えはldの際にリンカスクリプトとしてVMAを指定してリンクするしかないように感じる。
参考
assembly - gas .org different from ORG in nasm? - Stack Overflow