ASM空间优化:EAX与EBX

Dan*_*gen 4 x86 assembly nasm compiler-optimization

我正在研究x86汇编代码高尔夫拼图.我正在使用NASM汇编源文件:

nasm -f elf32 -O0 main.s
ld -m elf_i386 -s -O0 -o main main.o
Run Code Online (Sandbox Code Playgroud)

使用时-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
Run Code Online (Sandbox Code Playgroud)

二进制是264字节:

$ wc -c main
264 main
Run Code Online (Sandbox Code Playgroud)

现在,当我只需更换所有出现eaxread_stdinebx,ecxedx,二进制变大:

$ wc -c main
268 main
Run Code Online (Sandbox Code Playgroud)

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

spu*_*one 8

EAX是累加器寄存器.它具有用于所有九种基本操作(ADD,ADC,AND,CMP,OR,SBB,SUB,TEST和XOR)的特殊单字节操作码.此外,MOV指令具有一个单字节操作码,用于将数据从恒定存储器位置移入累加器.

挑选英特尔注册的艺术