我正在尝试在 MASM 中编写一些宏来处理大数字(即值大于可以存储在寄存器中的数字)。然而,我遇到了在汇编时从常量创建 bignum 的问题。看来 MASM 对数值常量的大小有限制。我希望能够做的是这样的:
DECLARE_BIGINT example, 19292109310024103209481293008
但我收到此错误:
error A2071: initializer magnitude too large for specified size
Which I assume means that the constant was larger than MASM can handle. I thought I might be able to kludge my way around it by declaring the constant as text:
DECLARE_BIGINT example, <19292109310024103209481293008>
然后解析数字,但我一直无法弄清楚如何(或者即使可能)操作 MASM 中的文本常量。
任何帮助将不胜感激。另外,我这样做是为了好玩,并尝试更好地学习汇编和 MASM,所以我宁愿不只是使用一个为我做这件事的库(剥夺了它的所有乐趣)。
最佳答案
整数常量不适合 64 位,而 64 位是当今任何实用的 x86/64 汇编器可能支持的最大整数。
具体针对MASM,查阅官方文档,阅读this page 。它列出了 MASM 支持的数据声明类型。其中最大的整数类型是:
QWORD
= 8 字节(或 64 位)和
TWORD
= 10 字节(或 80 位)。
您的整数常量需要 log2(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
)。还需要一些循环或递归来将表示十进制整数的字符串转换为具有同一整数的二进制表示形式的字节序列。目前这似乎并不容易,我也不完全确定这是可能的。
关于assembly - 在 MASM 中使用常量初始化大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850607/