2017-09-13 6 views
3

메모리 오버라이드 접두사를 사용하지만 모든 피연산자가 레지스터 인 경우 어떻게됩니까?메모리 오버라이드 접두사를 사용하지만 모든 피연산자가 레지스터 인 경우 어떻게됩니까?

코드 예 : mov eax, ebx 또는 add eax, ebx이고 기본값은 32 비트이지만 67h 무시를 사용한다고 가정 해 보겠습니다.

프로세서는 어떻게 처리합니까?

+2

'66'

오퍼랜드 크기 접두어 그래서 그것은 MOV 도끼 bx' '로한다. '67' 주소 크기 접두어를 의미 했습니까? –

+0

예, 원래 질문을 편집했습니다. 아니, 내가 원래의 질문을 의미 할 때까지 기다려. 그것은 메모리 피연산자없이 메모리 접두어를 섞어서 요점이었습니다. – matrix2

+0

'66'은 "메모리"접두사가 아닙니다. '89 d8'은'mov eax, ebx'입니다. '66 89 d8'은'mov ax, bx'입니다 (32 또는 64 비트 모드에서 그렇지 않으면 66 접두사가 기본값 16 대신 32 비트 피연산자 크기가됩니다). 그것이 당신이 물어 보려는 의도입니까, 아니면'mov eax, [ebx]'를'mov eax, [bx]'로 만드는'67' 주소 크기 프리픽스에 대해 알고 싶습니까? (또는 64 비트 모드에서'mov eax, [rbx]'를'mov eax, [ebx]'로 바꾸십시오.) –

답변

5

인텔 소프트웨어 개발자 설명서 *, 볼륨 2, 섹션 2.1에서는 각 명령 접두어의 동작을 자세히 설명합니다. 메모리 피연산자가없는 명령어와 함께 주소 크기 접두어 (67h)를 사용한다고해서 예기치 않은 동작이 발생할 수 있습니다.

16 비트 및 32 비트 피연산자 크기를 전환하거나 특정 SSE2/SSE3/SSSE3/SSE4 명령어와 함께 필수 접두사로 피연산자 크기 접두사 (66h)를 사용할 수 있습니다. 다른 용도는 예약되어 있으며 예측할 수없는 동작이 발생할 수 있습니다.

세그먼트 오버라이드 접두어는 모든 분기 명령어로 예약됩니다. * https://software.intel.com/en-us/articles/intel-sdm

+1

실제 하드웨어에서는 적용되지 않는 접두사가 무시됩니다. 이것이 "원인 #UD"대신 "예약 된"이유입니다. 'lock'을 제외하고는 적용되지 않을 때'# UD'를합니다. –

+0

@peter 그러나 "예약 됨"은 사용자가 사용할 수 있음을 의미하는 인텔 문서에서 무시되며 무시됩니까? 나는 그것이 "그것을 사용하지 말라, 아무것도 일어날 수있다"는 것을 의미한다고 생각할 것이다. 이제는 예약 된 접두어 사용이 종종 무시되는 경우가 종종 있습니다. 이는 인텔에 편리합니다. 이전에 무의미한 접두사를 사용하여 나중에 새로운 동작을 정의 할 수 있고 이전 칩에도 괜찮은 (무시 된) 점을 문서화 할 수 있기 때문입니다. 그래도 다른 예약 된 동작은 매우 잘 UD 수 있습니다. – BeeOnRope

+0

@BeeOnRope : 아니요, 보통 그렇게 생각하지 않습니다. 왜냐하면 그들은 미래의 보증을 보장 할 뿐이며 현재의 CPU가 미래의 보장을 원하지 않는다면 어떤 세부적인 내용을 담고 있지 않기 때문입니다. 말했듯이, 그들은'tzcnt' /'bsf'처럼 사실 이후의 무시 행동을 문서화 할 것입니다. 그러나 방대한 양의 gcc 컴파일 바이너리를 깨지 않고 용도 변경이 불가능한'rep ret'와 같은 몇 가지 사례가 있기 때문에 [주류 CPU가 수십 년 동안 그것을 재사용 할 것으로 기대하지 않습니다.] (https : // stackoverflow.com/questions/20526361/what-does-rep-ret-mean/32347393#32347393). –

관련 문제