2017-03-27 1 views
1

mov rcx,rdx (https://defuse.ca/online-x86-assembler.htm 사용)을 인코딩하는 x86_64 인코딩은 48 89 D1입니다.x86_64 - mov 명령어 인코딩

this reference으로 연산 코드를 검사하면 바이트 시퀀스가 ​​명령을 인코딩하는 방법을 알 수 있습니다.

그러나이 테이블의 두 행 아래 (op-code 8B)는 매우 비슷한 mov 명령어이지만 피연산자 순서는 바뀌 었습니다.
사실 디코 더링을 통해 확인 된 48 8b ca을 사용하여 동일한 명령어를 인코딩 할 수 있습니다.

왜 두 연산 코드가 모두 존재합니까? 그들이 운동 할 수있는 것보다 더 많이 다른가요? 언제 다른 하나를 골라야합니까?

+1

메모리 피연산자가 소스 또는 대상이 될 수 있도록하기 위해 존재합니다. 둘 다 레지스터이면 두 개의 인코딩을 얻습니다. 어떤 어셈블러가 어셈블러에 의존하는지에 따라 선택되며, 일부는 지정할 수 있습니다 (예 : '.s'접미어). – Jester

답변

2

modr/m 바이트는 하나의 메모리 피연산자까지만 인코딩 할 수 있습니다. 따라서 소스 또는 목적지에서 메모리 피연산자를 지원하는 모든 명령어는 소스가 메모리 피연산자이고 목적지가 메모리 피연산자 인 경우 한 번 두 번 인코딩됩니다. 물론 이것은 두 피연산자가 두 번 레지스터 인 니모닉을 인코딩 할 수 있음을 의미합니다.

+0

감사합니다. 어셈블러가 간단한 mov 명령 (메모리 액세스 없음)을 어셈블 할 때 두 번째 코드보다 첫 번째 인코딩을 선호하는 이유가 있습니까? 우연의 일치일까요? – user1000039

+1

@ user1000039는 어셈블러에 따라 다릅니다. IIRC Solaris 'as'는 후자를 선호합니다. – fuz

+0

은 어셈블러에 따라 다릅니다. 매크로를 사용하면 무작위로 선택하여 출력에서 ​​일부 다형성을 얻을 수 있습니다. 그러나 나는 그렇게 할 어떤 이유가 있다고 생각하지 않는다. btw. 이것은 add, adc, sbb 및 sub, xor, cmp, test, xchg에도 적용됩니다. (마지막 두 가지는 약간 다릅니다.) – sivizius