, 나는 nopw
명령의 기계 코드 인코딩 작동 방식을 이해하기 위해 노력하고있어 : http://john.freml.in/amd64-nopl에서 "nopw"에 대한 몇 가지 논의가있다AMD64 - nopw 조립 지침? 이 컴파일러 출력에서
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
. 아무도 4004d2-4004e0의 의미를 설명 할 수 있습니까? opcode 목록을 보면, 66 ..
코드가 멀티 바이트 확장임을 알 수 있습니다. 나는 몇 시간 동안 opcode리스트를 알아 내려하지 않으면 내가 여기있는 것보다 더 나은 대답을 얻을 수 있다고 생각한다.
는 ASM 출력 간단한 무한 루프까지 최적화 C의 다음 (미친) 코드 있음 :
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
gcc -O2
컴파일 컴파일러는 무한 재귀 교대 인식 그것은 무한 루프로; 실제로는 실제로이 작업을 수행하므로 recurse()
함수를 호출하지 않고 main()
에서 실제로 반복됩니다.
편집자 주 : NOP가있는 패딩 기능은 무한 루프에만 해당되지 않습니다. 여기에 NOP 길이의 범위가있는 함수 세트가 있습니다. on the Godbolt compiler explorer.
여기서 우리는 단지 임의의 정크 패딩을보고 있습니까? –
어쩌면! 나는 정말로 모른다! 그것은 그것의 모든 아름다움입니다! WHEEE. 정말로, 비록 링크드로부터 프로세서가 속도 최적화를위한 하나의 명령으로 블록을 로딩 할 것이지만, 'jmp'덕분에 그렇지 않습니다. 나는 단지 그것의 의미를 얻는다. 0x90이 무엇인지는 알고 있지만,'66 .. ..'로 무슨 일이 일어나고 있는지, 왜 72 비트인지 알지 못합니다. –
그것은 여기에있는 이유는 아니지만, [내, 당신이 가지고있는 이상한 NOP들! - The Old New Thing] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/12/10114521.aspx) 흥미로운 읽기. – ephemient