【问题标题】:How much memory can NASM allocate?NASM 可以分配多少内存?
【发布时间】:2020-03-12 07:58:34
【问题描述】:

NASM 在 64 位系统 (Windows 7) 上可以分配多少内存? fasm 好像只能分配大约 1.5 GB 的内存,所以我正在寻找更强大的汇编器。

【问题讨论】:

  • 你在写什么需要 assembler 需要一个半的演出?
  • NP 完全问题和自然语言处理很容易会吃掉数 TB 的 RAM。
  • 是的,但这是您在运行时需要做的事情,而不是组装时。当然,这仅受您使用的操作系统 API 调用的限制,不是吗?
  • 确实如此。我使用了静态数组,但忽略了这个简单的解决方案。谢谢,这解决了我的问题,所以如果你愿意,可以转评论来回答。
  • 除非您在运行时动态分配内容,否则无论您使用何种汇编程序,都会遇到 Windows 使用的 PECOFF 可执行格式的 2GB 限制。

标签: assembly x86-64 nasm


【解决方案1】:

NASM 对 BSS 中的巨大阵列没有任何问题。 (零初始化,不占用可执行文件本身的空间)。

对于一个小程序来说,动态分配并不比静态好,但请记住,除非你把这个数组放在 BSS 的 end,否则你将无法进行 RIP-最终高于它的其他变量的相对寻址;它们与您的代码的距离将超过 +-2GiB。

我认为 BSS 仍然可以像动态分配 (mmap / VirtualAlloc) 一样在 Linux 上使用透明大页,但这是需要仔细检查的。对于大型数组,您肯定需要它。

将数组的基址放在一个静态已知地址可能会略微提高效率,允许像 [array + rdi] 这样的寻址模式而不是 [rsi + rdi] 占用另一个寄存器,并且索引寻址模式会在Sandybridge 系列的一些案例(包括几乎所有 AVX ALU+load 指令,它们首先可以在 Haswell/Skylake 上对负载进行微融合。)Micro fusion and addressing modes


这似乎是我最近遇到的 FASM 的一个问题(可能是在查看您之前的一个问题时)。根据strace 的输出,x86-64 Linux FASM 似乎坚持使用mmap(MAP_32BIT),是的,当尝试使用超过 1GiB 时它似乎失败了。

并且 FASM 想要将可执行布局映射到包括 BSS 在内的内存(?)中,因此无法使用大于它的汇编时虚拟地址空间的数组。


  lea  rdi, [rel big]
  mov eax, 231 
  syscall                 ; exit_group(low byte of address)

section .bss
big: resb 1024*1024*1024*40      ; 40GiB

NASM + ld 在 GNU/Linux 上毫无怨言地组装它。但是生成的静态可执行文件上的readelf -a 表示 BSS 的“memsiz”只有“0x0000000100000000”(4GiB)而不是 40GiB。

这可能是 NASM 的错:由 NASM 节目制作的 .o 上的 readelf -a

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
    ...
  [ 6] .bss              NOBITS           0000000000000000  00000000
       00000000ffffffff  0000000000000000  WA       0     0     4
    ...

这是 BSS 大小的 UINT32_MAX;远小于 40GiB。

【讨论】:

    【解决方案2】:

    我很难弄清楚在 装配 时需要这么多内存的操作。我只能假设您在代码中分配了大量的初始化数据。

    如果它只是在运行时需要,那么您使用的操作系统应该提供某种形式的动态分配,这不会影响您的代码/数据大小。

    一个例子是 Windows HeapAlloc 函数,你只需要确保在从程序集中调用它时遵循调用约定。

    【讨论】:

      猜你喜欢
      • 2014-03-02
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2012-08-28
      相关资源
      最近更新 更多