汇编语言优化器

时间:2016-09-27 22:59:27

标签: assembly compilation arm

编译c ++或任何其他编译语言时,有一个优化器可以更有效的方式运行并重写某些代码。既然你没有编译汇编或手臂组件,你就是在编译语言,运行优化器,或者计算机运行的是你输入的内容吗?

1 个答案:

答案 0 :(得分:2)

考虑使用nasm -f elf64 -Oo无优化

组合的此代码段
    section .rodata
  Prompt:   db  'Prompting Text', 0

        section .text
        global  _start    

  _start:   xor     rax, rax
            mov     rsi, Prompt
            jmp     Done
            nop
            nop
            nop
            nop
    Done:   xor     rdi, rdi
            mov     eax, 60
            syscall

结果对象代码是这个;

000  4831C0            xor rax,rax
003  48BE000000000000  mov rsi,0x0
         -0000
00D  E904000000        jmp qword 0x16
012  90                nop
013  90                nop
014  90                nop
015  90                nop
016  4831FF            xor rdi,rdi
019  B83C0             mov eax,0x3c
01E  0F05              syscall
020

使用默认优化nasm -f elf64进行汇编,唯一发生的事情是汇编程序发现跳转在128个字节以内,因此将其更改为short,从而节省了3个字节。

00  4831C0            xor rax,rax
03  48BE000000000000  mov rsi,0x0
         -0000
0D  EB04              jmp short 0x13
0F  90                nop
10  90                nop
11  90                nop
12  90                nop
13  4831FF            xor rdi,rdi
16  B83C000000        mov eax,0x3c
1B  0F05              syscall
1D 

修改源以强制优化而不设置汇编器选项

        section .rodata
  Prompt:   db  'Prompting Text', 0

        section .text
        global  _start     

  _start:   xor     eax, eax
            mov     esi, Prompt
            jmp     short Done
            nop
            nop
            nop
            nop
    Done:   xor     edi, edi
            mov     eax, 60
            syscall

,结果是;

00  31C0              xor eax,eax
02  BE00000000        mov esi,0x0
07  EB04              jmp short 0xd
09  90                nop
0A  90                nop
0B  90                nop
0C  90                nop
0D  31FF              xor edi,edi
0F  B83C000000        mov eax,0x3c
14  0F05              syscall
16  

这对于不同的汇编程序是不同的,但我的论点是@ Ped7g已经指出,最好知道指令集,因此你所写的内容与目标代码之间存在直接关联。

如果你不知道很多指令符号扩展到64位,那么xor eax, eax产生与xor rax, rax相同的结果但保存1个字节的原因。