10 進整数 (ユーザーが入力) をメモリ内の 2 の補数表現に変換するコードはどうなるのだろうと思っていました。
例: ユーザーは 10 進数として 1234 を入力します。04D2 (バイナリ 2 の補数表現) を AX に格納したい (語長の文字列しか使用できないため)
80x86 アーキテクチャを使用しています。
数字の文字列を整数に変換するのは、ほとんどの場合非常に簡単です。一度に 1 桁ずつ読み取り、それを 10 進数に変換します (通常は、そこから '0' を減算します)。既存の値に 10 を掛け、現在の桁の値を加算します。
負の数を扱うことは、それをさらに難しくします。ほとんどの人は、「-」で始まる数値が負であることを示すフラグを保持することでこれを行います。次に、数値を変換すると、そのフラグが設定されているかどうかを否定します。
ただし、これには 1 つの問題があります。最も負の数を変換するには、余分な作業が必要です。これは、(2 の補数で) 最も負の数は、(より多くのビットを使用せずに) 正の数として表現できる大きさよりも大きいためです。たとえば、16 ビットの 2 の補数の範囲は -32768 から +32767 ですが、+32768 を表すには (少なくとも) 17 ビットまたは符号なし 16 ビットの数値が必要です。
編集: 10 進数を整数に変換したら、整数を 16 進数に変換して 16 進数で表示する必要があります。その変換は少し簡単です。繰り返し 16 で割ると、余りが次の 16 進数になります。通常、「0123456789abcdef」のようなテーブルを使用し、その残りを使用してテーブルにインデックスを付け、表示する数字を取得します。除算を繰り返して、被除数がゼロになるまで剰余を使用します。1 つのトリックは、これが逆の順序で数字を生成することです (最下位から最上位へ)。そのため、通常はバッファーの末尾から開始して先頭に向かって順にバッファーに入れます。