x86의 정의되지 않은 명령어는 왜 ud2일까? 숫자 2의 비밀
Why is the x86 undefined instruction called ud2? Why 2?
x86 컴파일러 출력에서 종종 보이는 ud2 명령어는 의도적으로 invalid opcode 예외를 발생시킨다. 원래는 0F FF와 0F B9 두 바이트 시퀀스가 각각 사용되었으나, Intel이 새 프로세서에서 이들이 더 이상 예외를 일으키지 않도록 바꾸면서 문제가 생겼다. 이에 Intel은 두 방식을 각각 ud0, ud1로 소급 명명하고, 파라미터가 없는 2바이트 명령어 ud2를 공식 정의되지 않은 명령어로 채택했다.
충분히 많은 사용자가 있다면, 모든 관찰 가능한 동작은 누군가에 의해 의존된다.
HN 토론
62- hacker_homie
그리하여 마침내 0F FF 신봉자들은 보상을 받았으니, UD0라는 오피코드를 부여받아 유일무이한 진정한 원조 무효 오피코드가 되었고, 0F B9 신봉자들은 UD1이라는 수치를 영구히 뒤집어쓰게 되었다.
- 349ru3h4f03
요즘은 UD0, UD1, UD2가 SDM과 APM에 들어 있다.
우리는 또한 UDB(D6)도 얻었는데, 이는 64비트 모드를 위해 x86-64와 함께 등장한 1바이트 변형이다.
그리고 우리에게는 항상 UDW(FF FF)가 있었으니, 일명 그룹 #5(첫 번째 FF)로 modrm 바이트가 mod=11b r/m=111b (/7) reg=111b(두 번째 FF)인 것인데, 이는 모든 비트가 1로 설정된 메모리, 또는 어떤 장치도 접근을 주장하지 않을 때 모든 1로 종단된 버스에 중요하다.
- gtirloni
나는 최근에 무작위로 실패하는 빌드를 디버깅해야 했는데, V8에서 나온 ud2가 나를 기다리고 있었다.
- Neywiny
나는 x86 사람은 별로 아니지만, 다른 아키텍처에서는 소프트웨어 인터럽트/예외를 발생시킬 수 있다. x86에는 이것이 없는 건가, 아니면 그런 기능이 충분한 사용 사례를 커버하지 못했던 건가?
- ordu
> 0F FF 변형이 소급해서 ud0로 명명되고, 0F B9 변형이 소급해서 ud1로 명명되었기 때문에 ud2라고 불리며, ud2가 권장되는 정의되지 않은 오피코드로 남게 되었다.
독자로서 나에게는 놀라움이었다. 이 문장에 이르렀을 때 나는 0f ff가 #1이 되고 0fb9가 #2가 될 거라고 생각했다. 하지만 아니다, Intel은 0부터 세기 때문에 세 번째 ud가 있는 것이다.