我试图在MASM中编写一些宏来处理大数字(即值大于的数字可以存储在寄存器中)。但是,我遇到了在组装时从常量创建bignums的问题。似乎MASM对数值常数的大小有限制。我希望能做的是这样的事情:
DECLARE_BIGINT example, 19292109310024103209481293008
但是我收到了这个错误:
error A2071: initializer magnitude too large for specified size
我认为这意味着常量大于MASM可以处理的。我以为我可以通过将常量声明为文本来克服它:
DECLARE_BIGINT example, <19292109310024103209481293008>
然后解析数字,但我无法弄清楚如何(或者甚至可能)在MASM中操作文本常量。
非常感谢任何帮助。另外,我这样做很有趣,并且尝试更好地学习汇编和MASM,所以我宁愿不只是使用一个为我做这个的库(从中获取所有的乐趣)。
答案 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和字符串操作宏(CATSTR
,INSTR
,SUBSTR
)执行有用的操作。还需要一些循环或递归来转换字符串,将十进制整数表示为具有相同整数的二进制表示的字节序列。目前这似乎并不容易,我不完全确定它是可能的。