当你编译一个c++或其他编译语言时,会有一个优化器以一种更有效的方式运行和重写一些代码。既然你不编译汇编或arm汇编,那么你编译的是一个编译语言,有没有一个优化器在运行,或者计算机运行的正是你输入的代码?
6vl6ewon1#
考虑使用nasm -f elf64 -O0组装的此代码段,不进行优化
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个字节。
nasm -f elf64
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个字节。
xor eax, eax
xor rax, rax
1条答案
按热度按时间6vl6ewon1#
考虑使用
nasm -f elf64 -O0
组装的此代码段,不进行优化字符串
生成的目标代码如下;
型
使用默认优化
nasm -f elf64
进行汇编,唯一发生的事情是汇编程序发现跳转在128字节内,因此将其更改为short,从而节省了3个字节。型
修改源代码以在不设置汇编程序选项的情况下强制优化
型
结果是,
型
这对于不同的汇编器是不同的,但我的论点是,正如@Ped7g已经指出的那样,最好知道指令集,这样你写的东西和目标代码之间就有了直接的关联。
如果你不知道很多指令的符号扩展到64位,这就是为什么
xor eax, eax
产生与xor rax, rax
相同的结果,但节省了1个字节。