2017-06-26 8 views
1

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, msgcall printに対応する行が翻訳されることが見出さ:NASMオフセット値とmov si, msgmsgを置き換えるときに、それは0x0000しかしときにそれをに対して絶対オフセットを使用し

mov si,0x7c0d 
call 0xc 

printをオフセットするには、csのオフセット(0x07C0)を使用します。だから、私が文字を印刷しようとすると、[ds:si]は予想される場所を指していません。問題はなぜですか?私が間違っている場合、これを行う正しい方法は何ですか?

+0

'call'は相対的なimm16オフセット' + 0x0001'をマシンコードに持つので、 'hlt'の直後を指しています。ところで、 'jps 0000:7C00 + 'でブートローダコードを起動して、 'cs:ip'がこれに対して「正規化」されていることを確認するのは良い習慣です。 '07C0:0000'なので、絶対的なオフセットと' cs 'によるアドレス指定はこのようなBIOSでは間違っています。 – Ped7g

答えて

3

これは逆アセンブラのアーチファクトです。相対変位を絶対アドレスに変換します。
0x7c00を起点として渡すと、正しい値が表示されます。

c:\>ndisasm -b 16 -o 7c00h a 
00007C00 B8C007   mov ax,0x7c0 
00007C03 8ED8    mov ds,ax 
00007C05 BE0D7C   mov si,0x7c0d 
00007C08 E80100   call word 0x7c0c 
00007C0B F4    hlt 
00007C0C C3    ret 

ndisasm例

バグがdsから見たあなたは、この値で、あなたのコードの起源をdsため0x7c0を使用していることで、0x7c00でゼロではないのです。

例えば、startは、0x7c00であるNASMの場合、起点にあり、mov si, startは、mov si, 0x7c00としてアセンブルされます。原因dsが初期化された方法に0x7c00 = 0x0f800:ランタイムstart
リニアアドレス 0x07c00しかし0x07c0へのポインタ[ds:si]点です。

あなたはゼロとds[ds:si]が0x0000にポイントします:0x7c00 = 0x07c00)を初期化するか、または(0x07c0を指します[ds:si]:0000 = 0x07c00)ゼロに起源を設定します。

csと他のセグメントの異なる値でうまくいくが、コードを移動したりISRを設定したりするなど、覚えておく必要があります。
ただし、ss:spを含むすべてのセグメントレジスタを初期化する必要があります。
初めてブートローダを試す場合は、csdsと同じにすることをお勧めします。
とにかく、異なる値で実験したい場合は、binの出力形式ではMulti-sectionsをサポートしています。これは、それがサポートするセグメンテーションに最も近いものです。

+1

問題は、 'org'ディレクティブが何をしているのか完全に理解していないことでした。そして、原点とセグメントレジスタの間の不一致... –

+0

@ Kia.celever問題が分かっていることを嬉しく思っています:)好奇心のために、ORG指令の間違った解釈はどうでしたか?私は時にはこれらのことを教え、それが私に共通の落とし穴のいくつかを知ってもらうのに役立ちます。 –

+0

私は、orgディレクティブの値が現在のセグメントに対して実際には "オフセット"であると考えられていることを知らなかった。私はそれがプログラムが常駐している絶対(20ビット幅)の物理的なアドレスだった。 –