assembly - 在 MASM 中使用常量初始化大数

标签 assembly x86 masm

我正在尝试在 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 做一些有用的事情和字符串操作宏(CATSTRINSTRSUBSTR)。还需要一些循环或递归来将表示十进制整数的字符串转换为具有同一整数的二进制表示形式的字节序列。目前这似乎并不容易,我也不完全确定这是可能的。

关于assembly - 在 MASM 中使用常量初始化大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850607/

相关文章:

汇编语言——用 XOR 组合字符

linux - 如何打印已读取的字节数以使用 Assembly 进行控制台?

java - JVM JIT方法重新计算纯方法

c - shellcode:将参数传递给 x86_64 程序集中的 execve

x86 - 指令顺序可以发生跨函数调用吗?

assembly - 函数参数未正确传入 MASM

使用 LEA 优化 gcc

c - 如何将汇编代码转换为 C 语言?

c - 在汇编中使用 fgets 时出现段错误

c++ - 如何在汇编程序中增加指针字母?