2016-11-29 19 views
2

コードやオペレーティングシステムの実際の動作を知るためにアセンブリを教え始めました。私がこれを理解しているように、は、プロセッサに、ラベルfooを含む行に行くように指示します。しかし、(それは本当にそれを呼び出すことができるならば!)最も基本的なOSは、私はこのコードを理解するように、プロセッサは、1行目を見て、それがfooであることを覚えてアセンブリでjmpsはどのように動作しますか? (OS開発)

foo:       ; label foo 
    jmp foo     ; Go to foo 
    times 512-($-$$) db 0  ; Fill remaining bytes with 0's 

...このようになります。その後、2行目に進み、fooに行くように指示します。繰り返し、3行目に到達して空のスペースを埋めるようにしてはいけません。

なぜこれは無限ループではありませんか?これは、コンパイル時にVirtualBox上でかなりうまく動作します(ここで適切な単語を使用していますか?).isoファイルに格納されます。

+0

「jmp」は単に「ここからフェッチ命令Xバイトをフェッチする」です。それは、あなたが言ったことのようなものですが、もちろん行ではないということになります。行の点では "ここからX行にジャンプ"し、 "jmp foo"は "ここからジャンプする"となります。もちろんこれはちょうど類推です。 –

+0

@MargaretBloom右ですが、3行目はどのように実行されましたか? – seadoggie01

+6

** **は無限ループであり、3行目は命令ではありません。セクタの残りの部分をゼロで埋めるためのアセンブラ命令です。アセンブリ時にアセンブラによって「実行」されます。 – Jester

答えて

3

最初のもの;これはアセンブリコードなので、これはプロセッサが直接実行するものではありません。アセンブラはここで役割を果たします。アセンブリコードをスキャンしてマシンコードを作成します。これはInstructionsの配列である(データも)。

はのは、あなたのコードにあなたのプログラムで

foo:       ; label foo 
jmp foo      ; Go to foo 
times 512-($-$$) db 0   ; Fill remaining bytes with 0's 

アセンブラを見て来てみましょう。 0x00000000(ゼロ)のアドレスを保存する ファースト命令は、0x00000000のアドレスにジャンプする(ラベルにはサイズはない)。これはプロセッサにfooにジャンプする、つまり0x00000000にジャンプするように指示する。アセンブラはバイナリファイルを作成し、 "jmp"命令マシンコードを入れ、アドレスフィールドに0x00000000を入れます。

次の "times"これはマシン実行可能コードではなく、むしろアセンブルされたコマンドをn回実行するようにアセンブラに指示します。余分なスペースはアドレス512まで "0"バイトで埋めてください。

だから出力バイナリは次のようになります。

enter image description here

だから、実際には無限ループです!

関連する問題