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

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

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

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

OS

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

Q&A

解決済

3回答

524閲覧

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

niko8437926

総合スコア8

アセンブリ言語

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

OS

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

0グッド

1クリップ

投稿2018/05/26 07:28

環境

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

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

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

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

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

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

guest

回答3

0

ポイントは、

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

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

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

asm

1hex16: 2 mov dl,4 3.loop: 4 rol cx,4 ;上位4bitを下位4bitに持ってくる 5 mov bl,cl 6 and bx,0x000f ;下位4bit以外をクリア 7 mov al,[cs:.hextbl+bx] ;テーブルからアスキーコードを拾う 8 9 ;一文字出力 10 11 dec dl 12 jne .loop 13 ret 14 15.hextbl db "0123456789ABCDEF"

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

投稿2018/05/27 16:21

fuzzball

総合スコア16731

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

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

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レジスタの設定は必要ないでしょうか? (この辺、詳しくないので、違ってたらすみません)

投稿2018/05/26 10:33

pepperleaf

総合スコア6383

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

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

0

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

投稿2018/05/26 08:10

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問