x86用の簡単なブートローダを作成しようとしていますが、プログラムを組み立てるときにNASMがどのようにラベルをオフセットに変換するのかがわかりません。nasmのラベルオフセット
(これが唯一のデモプログラムである)
bits 16
org 0x7C00
start:
mov ax, 0x07C0
mov ds, ax
mov si, msg
call print
hlt
print:
; print char array stored in [ds:si]
ret
msg db 'hello!'
Iはnasm -f bin
コマンドを使用してコードを組み立てました。しかし、期待どおりに動作しません。私は、バイナリ出力にobjdump -b binary -m i8086 -M intel -D
を使用し、mov si, msg
とcall print
に対応する行が翻訳されることが見出さ:NASMオフセット値とmov si, msg
でmsg
を置き換えるときに、それは0x0000
しかしときにそれをに対して絶対オフセットを使用し
mov si,0x7c0d
call 0xc
のprint
をオフセットするには、cs
のオフセット(0x07C0
)を使用します。だから、私が文字を印刷しようとすると、[ds:si]
は予想される場所を指していません。問題はなぜですか?私が間違っている場合、これを行う正しい方法は何ですか?
'call'は相対的なimm16オフセット' + 0x0001'をマシンコードに持つので、 'hlt'の直後を指しています。ところで、 'jps 0000:7C00 +'でブートローダコードを起動して、 'cs:ip'がこれに対して「正規化」されていることを確認するのは良い習慣です。 '07C0:0000'なので、絶対的なオフセットと' cs 'によるアドレス指定はこのようなBIOSでは間違っています。 –
Ped7g