【问题标题】:ASM space optimization: EAX vs EBXASM 空间优化:EAX 与 EBX
【发布时间】:2023-03-25 15:51:01
【问题描述】:

我正在研究一个 x86 汇编代码高尔夫拼图。我正在使用 NASM 组装源文件:

nasm -f elf32 -O0 main.s
ld -m elf_i386 -s -O0 -o main main.o

使用-O0,应关闭所有优化。目标是减小 ELF 二进制文件的大小。

在为这个谜题开发“参考实现”时,我偶然发现了一个奇怪的行为。这是一个简化的代码示例:

section .text
    global _start        ; Must be declared for linker

_start:                  ; Entry point for linker

read_stdin:
    add    esp, 8        ; Ignore argc and argv[0] on stack
    pop    eax           ; Store pointer to 'argv[1]' into EAX
    mov    eax, [eax]    ; Dereference pointer
    and    eax, 0xff     ; We only want the least significant byte
    add    eax, -0x30    ; Subtract ascii offset

exit:
    mov    eax, 1        ; Syscall: sys_exit
    mov    ebx, 0        ; Exit code 0
    int    0x80          ; Invoke syscall

二进制是264字节:

$ wc -c main
264 main

现在,当我简单地将 read_stdin 部分中出现的所有 eax 替换为 ebxecxedx 时,二进制文件会变大:

$ wc -c main
268 main

在比较目标文件的大小时,差异更大(480 对 496 字节)。发生这种情况的eax 寄存器有什么特别之处? NASM 是否在进行某种优化,即使已指定 -O0

【问题讨论】:

  • 你看了一下二进制差异吗?
  • 当使用 EAX(有时是 AX 或 AL)作为寄存器时,一些特定的指令组合确实可以编码得更短。
  • 如果要缩小尺寸,请改用-Os
  • @LưuVĩnhPhúc 我是创造这个谜题的人,所以我希望人们自己优化代码,而不是依赖一些自动优化:)
  • 请注意,对于现代 ld,您还希望 -n 不将部分与页面边界对齐。

标签: assembly x86 compiler-optimization instruction-encoding


【解决方案1】:

EAX 是累加器寄存器。它具有用于所有九种基本操作(ADD、ADC、AND、CMP、OR、SBB、SUB、TEST 和 XOR)的特殊一字节操作码。 MOV 指令还有一个单字节操作码,用于将数据从一个固定的内存位置移动到累加器中。

The Art of Picking Intel Registers

【讨论】:

  • 谢谢,这是有道理的。我找到了一些有用的相关链接:swansontec.com/sregisters.htmlswansontec.com/sintel.htmlmathemainzel.info/files/x86asmref.html#add
  • 更新引用,对不起。
  • @DaniloBargen:奇怪的是 NASM -O0add eax, -0x30 选择了 add eax, imm32 编码。这仍然是对add r/m32, imm32 的优化。 (当然,如果你正常组装,即使是 EAX,你也会得到 add r/m32, imm8,因为它仍然更小。)当然,如果你想手动优化,你会 movzx load 和/或 and al, 0x0f 如果你愿意假设输入是 ASCII 0..9 数字。无论如何,除非您希望人们解决此挑战以手动编码指令,否则需要 -O0 会删除对 r/m32, imm8 编码的访问权限。
  • 也相关:Tips for golfing in x86/x64 machine code 了解有关通过选择寄存器、指令及其编码来节省代码大小的许多技巧。
猜你喜欢
  • 2013-01-31
  • 2013-07-23
  • 1970-01-01
  • 2014-07-06
  • 2019-06-26
  • 1970-01-01
  • 2023-03-25
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多