2

我正在尝试在 MASM 中编写一些宏来处理大数字(即值大于可以存储在寄存器中的数字)。但是,我遇到了在汇编时从常量创建 bignums 的问题。似乎 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'

但仅此一项并没有太大帮助。

您也许可以使用宏函数和字符串操作宏 ( CATSTR, INSTR, SUBSTR) 做一些有用的事情。还需要一些循环或递归来将表示十进制整数的字符串转换为具有相同整数的二进制表示的字节序列。目前这似乎并不容易,我也不完全确定这是否可能。

于 2012-10-12T04:24:25.543 回答