2012-05-20 2 views
2

다음 Intel x86 명령어는 opcode 0x31 : xor <r/m32>,<r32>입니다. 명령의 실제 기계 코드에서 0x31 다음에 사용되는 레지스터 또는 메모리 주소를 나타내는 또 다른 16 진수 값이옵니다. 내 질문은 다음과 같습니다 :Intel x86 XOR opcode 0x31

  1. XOR 할 수있는 가능한 레지스터를 나타내는 16 진수 코드 란 무엇입니까?
  2. 사용할 수있는 레지스터와 메모리 인수의 조합 수를 고려할 때이 명령어가 생성 할 수있는 기계 코드의 제약 조건은 무엇입니까?

답변

1

두 번째 부분에 응답.

스택 포인터를 자유롭게 수정하고 싶지 않은 경우 ESP. 코드를 손상 시키면 코드가 다운되거나 중단됩니다.

마찬가지로 명령어가 사용할 주소는 모두 할당되고 쓰기 가능한 메모리에 해당해야합니다. 실제 메모리로 매핑되지 않았거나 읽기 전용이지만 메모리에 쓰려는 메모리 위치에 액세스하려고하면 코드가 충돌합니다.

그래서 기본 및 인덱스 레지스터, 변위 및 인덱스 레지스터 배율을 관찰해야합니다. 읽거나 쓰려는 메모리 주소를 함께 결합하면 액세스 가능한 메모리가있는 곳을 가리켜 야합니다.

일반적으로 스택에 원하는 메모리를 할당하려면 무언가를 누르거나 ESP을 줄이십시오.

프로그램의 코드 메모리에 액세스해야하는 경우 읽기 전용인지 확인하십시오. 코드 메모리는 일반적으로 읽기 전용입니다.

뭔가를 실행해야하는 경우 실행 가능 메모리에있는 기존 프로그램의 코드 또는 코드 여야합니다. 기본적으로 프로그램 코드가 아닌 모든 메모리는 실행 가능하지 않을 것으로 예상됩니다. Windows 및 Linux에는 메모리 영역의 메모리 보호 기능을 변경하여 실행 가능 또는 쓰기 가능으로 만드는 특별한 기능이 있습니다.

관련 문제