assembly 汇编语言优化器

ffscu2ro  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(152)

当你编译一个c++或其他编译语言时,会有一个优化器以一种更有效的方式运行和重写一些代码。既然你不编译汇编或arm汇编,那么你编译的是一个编译语言,有没有一个优化器在运行,或者计算机运行的正是你输入的代码?

6vl6ewon

6vl6ewon1#

考虑使用nasm -f elf64 -O0组装的此代码段,不进行优化

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个字节。

相关问题