MOD + R/M 필드의 변위가 최대로 부호있는 32 비트 정수라는 것을 알고 있습니다. 그러나 32 비트 서명에 비해 너무 큰 값을 전달할 때 일관성없는 동작을 보았습니다 (그러나 부호없는 32 비트에 대해서는 충분히 작음). 포인트왜 AS가 때때로 대형 변위를 수용하고 때로는 그렇지 않습니까?
케이스 :
.intel_syntax noprefix
mov [eax + eax + 0xdeadbeef], al
mov [r10d + r10d + 0xdeadbeef], al
mov [rax + rax + 0xdeadbeef], al
mov [r10 + r10 + 0xdeadbeef], al
내가 조립 (및 dissasamble) 때, 나는 다음과 같은 결과를 얻을 : 32 비트 레지스터는 볼 수 있듯이
0: 67 88 84 00 ef be ad mov BYTE PTR [eax+eax*1-0x21524111],al
7: de
8: 67 43 88 84 12 ef be mov BYTE PTR [r10d+r10d*1-0x21524111],al
f: ad de
11: 88 04 00 mov BYTE PTR [rax+rax*1],al
14: 43 88 04 12 mov BYTE PTR [r10+r10*1],al
(eax
을, r10d
) 32 비트 변위는 문자 그대로 (부호가있는 32 비트 정수로 해석되는) 취해지고 64 비트 레지스터 (rax
, r10
)의 경우 무시됩니다.
입력에 대한 합리적인 출력이라고 생각하지만이 일관성없는 처리의 이유는 즉시 알 수 없습니다. 이것이 어딘가에 기록되어 있습니까?