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