2010-05-15 5 views
3

나는 2 가지 간단하지만 어쩌면 까다로운 질문이 있습니다. 내가 어셈블러 명령어를 가지고 있다고 가정 해 봅시다 : MOV EAX, [ebx + 6 * 7] - 내가 궁금한 점은이 명령어가 실제로 opcode로 변환되어 괄호 안의 코드 계산이 opcode로 인코딩된다는 것입니다. 아니면 컴파일러에 대한 그냥 의사 intruction, 그래서 컴파일러 전에 괄호에있는 값을 계산하여 추가 곱슬을 사용하여 일부 reg에 결과를 저장하고 MOV EAX, 계산 값을 사용 reg보다? 그냥 분명히하기 위해 출력이 동일 할 것입니다. 나는 사형 집행에 관심이있다.x86 어셈블러 질문

두 번째는 LEA 명령어에 관한 것입니다. 나는 그것이 무엇을하는지 알지만, 실제 명령을 더 많이 신경 써야합니다. 그래서 컴파일은 더 이상 그것을 변경하지 않고 단지 opcode로 만듭니다. 아니면 컴파일러를위한 의사 코드로 다시 컴파일하고 다시 컴파일합니다. .

답변

5

어셈블러 (42)로 6*7 비트를 작동 (매우 유사하지만, 컴파일러 생략)하고 상기 명령은 :

MOV EAX,[ebx+42] 

이 상기 프로세서는 상기의 내용을 추가하여 실행할 수있는 것입니다 ebx 레지스터와 상수 42를 입력 한 다음 해당 주소를 사용하여 eax을로드합니다. 6과 7을 다른 엔티티로 인코딩하여 나중에 곱셈하는 지시가 없습니다.

LEA은 다른 어떤 지시 사항과 동일합니다. 다시, 어셈블러는 상수 폴딩 (고정 값 작업)을 처리하여 어셈블러 문을 프로세서에 사용할 수있는 형식으로 가져올 수 있습니다.

당신은 단지 명령에 대해 생각해야 :

mov ax,1+1+1+1+1+1+1 

이것은 바이트 eb 01 01 01 01 01 01 01의 일부 (마법) 시퀀스로 인코딩되지 않습니다, 그것은 다음 중 하나와 같은 정확히 인코딩됩니다

mov ax,7 
mov ax,49-42 
mov ax,42/6 
+0

내 책에 47-2 = 47 –

3

1) 예
2) 예

즉. 둘 다 정확히 opcode 인코딩으로 변환됩니다.

그러나 현대 X86 CPU의 기반이 부족한 아키텍처는 어셈블러가 기대하는 것과 매우 다르다는 점에 유의하십시오. 따라서 단일 명령이되는 것이 프로세서에서 단일 명령으로 처리된다는 것을 의미하지는 않습니다.