2

MASM で大きな数値 (つまり、レジスタに格納できるよりも大きな値を持つ数値) を処理するマクロを作成しようとしています。ただし、アセンブル時に定数から bignum を作成する際に問題が発生しました。MASM では、数値定数のサイズに制限があるようです。私ができるようにしたいのは、次のようなものです。

DECLARE_BIGINT example, 19292109310024103209481293008

しかし、私はこのエラーが発生します:

エラー A2071: 指定されたサイズに対してイニシャライザの大きさが大きすぎます

これは、定数がMASMが処理できるよりも大きかったことを意味すると思います。定数をテキストとして宣言することで、それを回避できるかもしれないと思いました:

DECLARE_BIGINT example, <19292109310024103209481293008>

その後、数字を解析しましたが、MASM でテキスト定数を操作する方法 (または可能であったとしても) を理解できませんでした。

どんな助けでも大歓迎です。また、私は楽しみのためにこれを行っており、アセンブリと MASM をよりよく学ぼうとしているので、これを行うライブラリだけを使用したくありません (すべての楽しみを奪います)。

4

1 に答える 1

2

整数定数は 64 ビットに収まりません。これは、実用的な x86/64 アセンブラーが最近サポートできる最大の整数です。

特に MASM については、公式ドキュメントを参照し、このページを読んでください。MASM でサポートされているデータ宣言の種類を一覧表示します。その中で最大の整数型は次のとおりです。

QWORD= 8 バイト (または 64 ビット) および
TWORD= 10 バイト (または 80 ビット)。

整数定数には log 2 (19292109310024103209481293008) ≈ 94 ビットまたは 12 バイトが必要です。それは単にに収まりませんTWORD

これで、マクロのパラメーターとして渡される文字列の個々の文字にアクセスできるようになりました。FORCそのために/IRPCを使用します。

これは、文字列パラメーターをバイトの宣言に変換し、それぞれがそれぞれの文字の ASCII コードを表します。

FORC value, <012345>
DB   '0' + value
ENDM

これはと同等です

DB '0'
DB '1'
DB '2'
DB '3'
DB '4'
DB '5'

しかし、それだけではあまり役に立ちません。

マクロ関数と文字列操作マクロ ( CATSTRINSTR、 ) を使用すると、何か便利なことができる場合がありますSUBSTR。10 進数の整数を、同じ整数の 2 進表現を使用してバイトのシーケンスに表す文字列を変換するには、いくつかのループまたは再帰も必要です。現時点では、これは簡単ではないようで、完全に可能かどうかはわかりません。

于 2012-10-12T04:24:25.543 に答える