FromNandの日記

自分的備忘録

【アセンブラ】アセンブラによってORG疑似命令の意味が違う!?

これまでにそれなりの種類のアセンブリを見てきたけど、混乱した箇所があったため整理する。

それは、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