0

(bhd) 番号付けシステム間の数値コンバーターを作成しています。プログラムは 16 ビットの 2 進数または 4 桁の 16 進数を受け入れます。または 5 小数。

私が書いた読み取り手順は、16ビットレジスタを扱っており、より大きな値を含めることができないため、10進数値が65535(FFFFh)を超えると問題があるようです

助けていただければ幸いです。

ここに私の読み取り手順があります:

Proc R  
       mov ah,01;read first digit
   int 21h
   mov saveal,al

   cmp al,0dh; if it is a new line break then dont read
   jz toret

   mov al,radex ; the radex value already entered by user
   mov ah,0
   mul dx
   mov dx,ax; multiplies the radex by the number entered so far to shift it 1 dig.                     

   mov al,saveal
   cmp al,65
   jge big2
   sub al,30h; taking decimal value of the character

   cont2:
   call checkerror
   mov ah,0
   add dx,ax; adding the digit to the number read so far

 loop R

 toret:
 ret 
 endp

ありがとうナタリー

4

1 に答える 1

2

65536 (0xFFFF) を超えるにはさらにビットが必要なので、より大きなレジスタ、32 ビット、または別の 16 ビット レジスタが必要です。他の 16 ビット レジスタをゼロに設定し、これまでの数字を追加するための加算の後、キャリーを使用して加算を行い、この次のレジスタにキャリー ビットを追加します。

たとえば、0xFFFF + 5 はキャリー ビットが設定された 0x10004 または 0x0004 であり、この他のレジスタにキャリー ビットを追加して他のビットを取得すると、上位レジスタに 0x0001 があり、下位レジスタに 0x0004 があります。

鉛筆と紙で足し算をした場合とまったく違いはありません。99+5 = 04 百の位まで「キャリー・ザ・ワン」。そして、百の位がオーバーフローしたら、次の位に繰り越します。バイナリは同じで、はるかに簡単です。各ビット列は、紙の上では 10 進数の列のように見えます。ビット 0 からビット 15 までは見えませんが、ビット 15 からのキャリーは表示されるので、加算器を連鎖させて任意の幅にすることができます。

于 2010-10-27T16:59:48.107 に答える