어셈블 과정에서 더미코드들이 생겨나는 이유
글쓴이: eternalklaus / 작성시간: 화, 2018/06/05 - 11:45오후
어셈블 과정에서 어셈블러가 더미코드들을 추가하는데 그 이유가 뭘까요?
실험내용은 아래와 같습니다
a.s --assemble--> 바이너리 파일 --disassemble--> b.s
최종 디스어셈블리인 b.s를 보면, ( 제가 a.s에 추가하지 않은) 더미 인스트럭션들이 종종 보이는데 이유를 모르겠습니다.
즉, 어떤 상황이냐면,
.global main main: push %eax pop %eax jmp 80483f1 LABLE1: mov %eax,%ebx
a.s
위의 파일을 어셈블한 뒤에, Objdump 명령어로 디스어셈블리를 뽑아내면 아래처럼 됩니다.
080483ed <main>: 80483ed: 50 push %eax 80483ee: 58 pop %eax 80483ef: e9 fd ff ff ff jmp 80483f1 <main+0x4> 080483f4 <LABLE1>: 80483f4: 89 c3 mov %eax,%ebx 80483f6: 66 90 xchg %ax,%ax 80483f8: 66 90 xchg %ax,%ax 80483fa: 66 90 xchg %ax,%ax 80483fc: 66 90 xchg %ax,%ax 80483fe: 66 90 xchg %ax,%ax 8048400: 66 90 xchg %ax,%ax 8048402: 90 nop
쓸모없는 더미코드들 xchg %ax,%ax 이 추가되어 있는걸 확인할 수 있는데요.
어셈블러가 이런 쓸데없는(?)짓을 하는 이유가 뭘까요?
(퍼포먼스 측면에서나, 사이즈 측면에서나 좋을것 없을 텐데요...)
Forums:
여유가 있다면 http://www.agner.org
여유가 있다면 http://www.agner.org/optimize/optimizing_assembly.pdf 를 읽어보기 바랍니다. (Section 11.5)
좀 더 여유가 있다며, "Intel 64 and IA-32 Architectures Optimization Reference Manual"도 좋습니다. (https://software.intel.com/en-us/articles/intel-sdm 에 있음), Section 3.4.1.5, 3.5.1.10
위 질문에 대한 답변은 일반적인게 아니라 x86 CPU에 한정된 것이며,
간단히 말해, branch target (jump할 대상 label)은 16 byte 단위로 align되어 있어야, CPU가 효과적으로 instruction들을 fetch할 수 있습니다. 그래서 일부러 16 byte align을 위해 쓸모없는? padding을 집어 넣은 것이고, 이 padding은 주로 nop이나, 기타 nop에 해당하는 instruction들로 채워집니다. Intel 64 and IA-32 Architectures Optimization Reference Manual, Section 3.5.1.10을 보면 nop에 해당하는 instruction들의 목록을 볼 수 있습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
아하~
아하~ 최적화를 위한 것이였군요. 유용한 답변 정말 감사합니다.^^
댓글 달기