質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

4回答

2387閲覧

ブートローダーのことで質問があります。

niko8437926

総合スコア8

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2018/05/26 07:00

###OSもどきを作るにあたり、ブートローダのことで質問です。

現在OSもどきを作っているのですが、その際にブートローダのはじめに0x7c00と指示しますが、「ORG 0x7c00」「mov ax, 0x07c0 mov ds, ax」は全く異なりますか?
素人なので意味不明な質問していたらごめんなさい。

環境

OS : Ubuntu 18.04 LTS
アセンブラ : nasm 2.13.02

###ソース1

; boot.asm ; 2018 5 26 ; TAB = 4 ORG 0x7c00 mov ah, 0x0 mov al, 0x3 int 0x10 mov si, msg mov ah, 0x0e print: lodsb or al, al jz loop1 int 0x10 jmp print msg: db "Kindows", 13, 10, 0 loop1: jmp loop1 times 510 - ($ - $$) db 0 db 0x55 db 0xaa

###ソース2

; boot.asm ; 2018 5 26 ; TAB = 4 mov ax, 0x07c0 mov ds, ax mov ah, 0x0 mov al, 0x3 int 0x10 mov si, msg mov ah, 0x0e print: lodsb or al, al jz loop1 int 0x10 jmp print msg: db "Kindows", 13, 10, 0 loop1: jmp loop1 times 510 - ($ - $$) db 0 db 0x55 db 0xaa

###両方共試した結果
両方共、「Kindows」と画面に出力されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

ブートローダーと言うことですので、MBR用のコードで、PCのBIOSによってディスクのMBRが0x7c00番地にロードされることを前提としたものなのでしょう。

ソース1はORG 0x7c00擬似命令で始まっているので、その後のmov ah, 0x0から始まる命令は0x7c00番地から始まるアドレスでアセンブルされるかたちになります。

ソース2もfuzzballさんのご指摘のように、実行されるときにDS:SIも0x7c00番地を指すようになるので、結果的にソース1もソース2も"Kindows"と表示されます。

「ORG 0x7c00」「mov ax, 0x07c0 mov ds, ax」は全く異なりますか?

本来、目的としていることは異なります。実行結果は見た目、同じになっていますが、先に述べたようにORG 0x7c00は擬似命令で、その後に続くアセンブリコードのアドレスが変わります。

BIOSからディスクのMBRを0x7c00番地に読み込んだ後、CS:IPは 0:0x7c00でこのブートローダーを実行します。ですので、ソース1でのORG 0x7c00は実行開始時の CS:IPが 0:0x7c00であることを前提とするもので正しく動作します。

ソース2でORG 0x7c00が指定されていなくても動作するのは、使われているjzjmpらのジャンプ命令が相対ジャンプで済んでいるからです。もし、ソース2のコードがもっと大きく、jmp命令の飛び先がもっと離れていた場合は絶対アドレスになるので、その場合は正しく動作せず、暴走すると思います。

投稿2018/05/28 13:12

編集2018/05/28 13:39
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この質問の本質は、

ds=0x0000 のとき、ds:7c00 = 0x7c00
ds=0x07c0 のとき、ds:0000 = 0x7c00

ではないかと。

投稿2018/05/28 06:18

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/05/28 12:00

セグメントの件、気が付きませんでした。 でもそうすると、その後のアドレス(オフセット)の意味が違ってきますね。
guest

0

ORG命令は、開始アドレスを設定。
アセンブルする際のオプション設定でも設定可能なので、そちらで設定していませんか? どちらが優先かは、忘れました。(マニュアルとかにある筈)

ここで不適切な設定をすると全く動かないと思います。
まあ、デバッガ等で開始アドレス指定で実行すれば、別ですが。

投稿2018/05/26 08:44

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ORG命令で何をさせたいんでしょうか。
双方、デバッガで実行させれば何が違うかわかると思いますが

投稿2018/05/26 08:06

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問