MASM で大きな数を処理するためのマクロを作成していますが、一連の数字を数字に変換する必要があることに気付きました。基本的に、MASM のサイズ制限を回避するために、bignum を文字列として渡してきました。したがって、bignum 呼び出しは次のようになります。
MOV_BIG_NUM [eax], <1234567891011121314151617181920212223>
2 のべき乗であるベースで渡された文字列を (私が知る限り) 処理できる実装があります。つまり、次のような呼び出しです。
MOV_BIG_NUM [eax], <1001101111010101101011110101000011101b> ;Base 2
MOV_BIG_NUM [eax], <0123456710121314151617202122232425262o> ;Base 8
MOV_BIG_NUM [eax], <123456789ABCDEF101112131415161718191Ah> ;Base 16
丁寧に扱ってくれます。ただし、私がそれらに使用している方法は、2 の累乗ではない基数にうまく変換されません (または実際にはまったく変換されません)。もちろん、これらの中で最も重要なのは 10 進数ですが、任意のベースで機能するメソッド。私が 2 の累乗に使用してきた方法は、バイトに順番にアクセスし、必要に応じて桁をシフトor
し、既存の桁でビット単位で処理することでした。したがって、16 進数の私の方法は次のようになります (これは非常に簡略化されたバージョンです)。
;foreach digit in list of digits
;eax contains the start of memory for the bignum
IF bit_offset EQ 0 ;Only move a new value in when the offset has just changed
mov ebx, dword ptr [eax + byte_offset] ;Get the current value at the dword's offset
ENDIF
digit = digit SHL bit_offset ;Shift the digit by a certain offset, so that we can store multiple digits in one byte
or ebx, digit
bit_offset = bit_offset + 4
IF bit_offset EQ ( 32 ) ;Number of bits in a dword
mov dword ptr [eax + byte_offset], ebx ;Move the dword back
byte_offset = byte_offset + 4 ;Number of bytes in a dword
bit_offset = 0;
ENDIF
;end foreach
ただし、この種のアプローチは明らかに任意のベースでは機能しません。10 進数の連続したリストを 16 進数に変換するにはどうすればよいですか?