実験目的
ORGは自分の書いたプログラムがメモリ上のどこに読み込まれるかを指定する命令です。
ブートローダーであれば7c00、MSDOSのCOMファイルなら100等、余り意識せずに書いてきましたが実際どんな機械語が生成されるのか気になったため、検証してみました。
検証コード
org1000.asm
org 0x1000
start:
mov ax, [label]
jmp $
label:
dw 0x1234
org2000.asm
org 0x2000
start:
mov ax, [label]
jmp $
label:
dw 0x1234
逆アセンブリ結果
ORG 1000、2000それぞれをコンパイル後、逆アセンブリした結果が以下になります。
ORGに対応する機械語は存在しないようです。
ソースmov ax, [label]
のlabel
が絶対アドレスに変換されています。
ORGで指定した基準アドレスに、mov ax,[0x1005]
の機械語A10510
が3バイト、jmp short 0x3
の機械語EBFE
を合わせたアドレスがlabel
の絶対アドレスとなっていることが確認できます。
ubuntu@ubuntu:~/kaihatsu/org$ nasm -f bin org1000.asm -o org1000.bin
ubuntu@ubuntu:~/kaihatsu/org$ ndisasm -b 16 org1000.bin
00000000 A10510 mov ax,[0x1005]
00000003 EBFE jmp short 0x3
00000005 3412 xor al,0x12
ubuntu@ubuntu:~/kaihatsu/org$ nasm -f bin org2000.asm -o org2000.bin
ubuntu@ubuntu:~/kaihatsu/org$ ndisasm -b 16 org2000.bin
00000000 A10520 mov ax,[0x2005]
00000003 EBFE jmp short 0x3
00000005 3412 xor al,0x12
ubuntu@ubuntu:~/kaihatsu/org$