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

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

ただいまの
回答率

90.84%

  • OS

    190questions

    OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

  • アセンブリ言語

    101questions

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

INT命令等でレジスタの値を表示する方法にはどうしたらいいですか?(ブートローダ)

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 148

niko8437926

score 1

 環境

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

 質問

現在、ブートローダを作っています。
そこで、足し算の結果を表示したいと思い、cxレジスタの値を画面に出力したいと思いました。
INT 0x10で一文字表示できそうだったのですが、アスキーコードで指定するらしいので、この方法ではレジスタの値は表示できないと思いました。

どうしたらいいでしょうか。
書きかけのソースを下に示します。

ソース

; boot.asm
; 2018 5 26
; TAB = 4

    mov ax, 0x07c0
    mov ds, ax

    mov ah, 0x0
    mov al, 0x3
    int 0x10

compere:
    mov cx, 2
    add cx, 3

loop:

    jmp loop

    times 510 - ($ - $$) db 0

    db 0x55
    db 0xaa
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

ポイントは、

  1. 4bitで一桁(一文字)
  2. 上位桁から表示していく
  3. 4bit値(0x0~0xf)をアスキーコード("0"~"F")に変換する

こんなところでしょうか。

2に関しては、ローテート命令で上位4bitを下位4bitに持ってきます。
3に関しては、今回はテーブルを使ってみます。

hex16:
    mov     dl,4
.loop:
    rol     cx,4                ;上位4bitを下位4bitに持ってくる
    mov     bl,cl
    and     bx,0x000f            ;下位4bit以外をクリア
    mov     al,[cs:.hextbl+bx]  ;テーブルからアスキーコードを拾う

    ;一文字出力

    dec     dl
    jne     .loop
    ret

.hextbl    db  "0123456789ABCDEF"

int 0x10の仕様がよく分からないので、必要に応じて使うレジスタを変更したり、push/popを追加して下さい。
なお、アセンブルは通してみましたが、動作確認は行っていません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

レジスタの値をアスキーコードで文字列に変換して、一文字づつ出力すればいいです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

CXレジスタは、16bitですね。アスキーコードと言うと、8bit ... 半角英数字になるでしょうか。 文字として使える範囲は、 0-9, A-Z, a-z と幾つかの記号。
良く使われる方法としては、CXレジスタの値を 4bitづつ分解し、4文字のアスキーコードにして出力する事でしょう。
4bit のデータは、0-9, A-F の文字に対応させるだけです。(0-9,A-F の配列アクセスが容易ですが、、、) 簡単には、 0x41 を加算すれば、A-P の文字になると思うので、それを出力すれば、良いと思います。
4bitに分割するには、 CX レジスタのシフトとマスクで簡単にできると思います。

ところで、INT 0x10 で文字出力を行う方法ですが、AHレジスタとか、BXレジスタの設定は必要ないでしょうか? (この辺、詳しくないので、違ってたらすみません)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • OS

    190questions

    OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

  • アセンブリ言語

    101questions

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