assembly - ASM 空间优化 : EAX vs EBX

标签 assembly x86 compiler-optimization instruction-encoding

我正在研究 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

现在,当我简单地替换所有出现的 eax 时在 read_stdin部分与 ebx , ecxedx ,二进制变大:
$ wc -c main
268 main

比较目标文件的大小时,差异甚至更大(480 与 496 字节)。 eax有什么特别之处注册发生这种情况?尽管-O0 NASM 是否在进行某种优化?已指定?

最佳答案

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

The Art of Picking Intel Registers

关于assembly - ASM 空间优化 : EAX vs EBX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23413138/

相关文章:

c - 如何在具有唯一元素的微型数组中尽快找到匹配元素?

c - ARM 程序集 - 监视堆栈指针

c++ - 硬件断点可以写内存吗?

multithreading - 相当于LWARX和STWCX的x86

windows - 是否可以在 .text 段中使用 NASM 中的 DB 指令创建可写变量?

java - 如何演示 Java 指令重新排序问题?

c++ - 数据对齐以实现矢量化/高效缓存访问

assembly - 数据处理指令有延迟吗? - 解读ARM Cortex A9时序手册

c - PIC12 TRIS 寄存器未设置

c++ - 使用 GCC 程序集向左/向右旋转移动次数