2017-01-04 12 views
-1

コンテキスト:アセンブラを記述する。ツールチェーンをサポートせずに、ゼロからコードを書くとします。あなたはあなたの前にコンピュータがあるだけで、あなたはCPUのドキュメントを手に入れます。過去に戻って。アセンブラ - 10進数のアセンブリでバイナリを書き込む

バイナリで書く必要がある場合、どのように最下位レベルでビットを整形するかをどのように知っていますか?

たとえば、バイナリ・イミディエートに変換する#253(2^32までの任意の値で、16進数でもかまいません)。毎回右から左へバイトごとにパーズする必要がありますか?毎回10(または16進数で16)を掛けて)毎回累積レジスタに結果を格納する必要がありますか?

アセンブラはビットストリームを形成するために最低レベルで何をしますか? (追加とシフト)?

+0

アセンブラは、ソースコードを出力フォーマットに変換するだけです(「ちょっと」はここでは単純化されています)ので、あなたの本当の質問は何ですか?文字列を数値に変換するには?それは基本的な作業です。はい、基本的には加算して乗算することで達成されます。オーバフロー、文字セット、および文字コードのエンコードのような注意を払う –

+0

@MargaretBloom私はアセンブラを書いています。私の主な関心事は、効率的なビットストリームを書くことです。私はジャンプテーブルについても考えていましたし、それをスピードアップするための16進変換も考えました。最適化のために小数は非常に貧弱です。 – Kroma

+0

私はあなたに "コンパイルビルドのチュートリアル"のためのGoogleを提案したい、あなたに必要なものを教える非常に良いチュートリアルがたくさんあります。値をデコードするステートマシンアセンブラは何らかのコンパイラであり、アセンブリコードをマシンコード – Tommylee2k

答えて

0

はい、文字2、5、3を1つずつ読み込みます(または、ハードウェアが何をしているのかを一度に多く読んでから、順番に調べます)。

次に、ASCII文字を10進数に変換し(10進数の48文字のASCIIコードを減算して)、数字に10の適切な桁数(または基数は何でも)を掛けます。

((0 + 2)* 10 + 5)* 10 + 3は、簡単で便利です。

10倍は実際の乗算を必要とせず、遅い演算(またはCPUは乗算のための命令さえないかもしれない)でもよいが、シフトと加算の組み合わせとして実行することができる。 2 * 10 = 2 * 8 + 2 * 2 =(2シフト3ポジション左)+(2シフト1ポジション左)。

誰もあなたのためにこれを行うコードを書いていない場合、あなたはそれを書かなければなりません。従来のCPUには、テキストから数値への解析や変換のためのロジックが含まれていません。彼らは単純なビルディングブロック(比較的シンプルな命令)を提供するだけで、すべてを構築することができます。

+0

Alexey、その日の終わりに、私は必要な適切な値を含むジャンプテーブルを作成する必要があります(ループを256回、レジスタを1つインクリメントし、バイナリ表現をそのテーブルに適切なオフセットで格納します)。変換が必要な場合は、レジスタにロードし、その表現で必要なものを実行します(レジスタを作成し、格納するなど)。問題は解決しましたか? – Kroma

+0

バイナリ表現の代わりに、私はバイナリ値 – Kroma

+0

を意味していました。申し訳ありませんが、私は思考の列車を失った。しかし、アセンブラを実装する際に解決すべき他の興味深い問題があります。例えば。 [this one](http://stackoverflow.com/q/41418521/968261)。また、数値パーサから最大限のパフォーマンスを引き出すことよりも速い解決策を得ることが重要です。 –

関連する問題