用MASM中的常量初始化大数

时间:2012-10-12 00:29:15

标签: assembly x86 masm

我试图在MASM中编写一些宏来处理大数字(即值大于的数字可以存储在寄存器中)。但是,我遇到了在组装时从常量创建bignums的问题。似乎MASM对数值常数的大小有限制。我希望能做的是这样的事情:

DECLARE_BIGINT example, 19292109310024103209481293008

但是我收到了这个错误:

error A2071: initializer magnitude too large for specified size

我认为这意味着常量大于MASM可以处理的。我以为我可以通过将常量声明为文本来克服它:

DECLARE_BIGINT example, <19292109310024103209481293008>

然后解析数字,但我无法弄清楚如何(或者甚至可能)在MASM中操作文本常量。

非常感谢任何帮助。另外,我这样做很有趣,并且尝试更好地学习汇编和MASM,所以我宁愿不只是使用一个为我做这个的库(从中获取所有的乐趣)。

1 个答案:

答案 0 :(得分:2)

整数常量不适合64位,这是目前x86 / 64汇编程序可能支持的最大整数。

专门针对MASM,查看官方文档,阅读this page。它列出了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'

但仅此一点并没有多大帮助。

您可以使用macro functions和字符串操作宏(CATSTRINSTRSUBSTR)执行有用的操作。还需要一些循环或递归来转换字符串,将十进制整数表示为具有相同整数的二进制表示的字节序列。目前这似乎并不容易,我不完全确定它是可能的。