2011-04-01 5 views
1

여기가 처음입니다.어셈블리에서 산술을 등록하십시오.

PC 어셈블리 언어를 읽었으며 Assembly에서 RC4 암호화 구현을 연구하고있었습니다.

mov eax, [edx+ecx] 

작동하지만

mov eax, [edx-ecx] 

하지 않는 이유는 내가 이해할 수없는 것은. 인라인 어셈블러는 나에게

그게 무슨 뜻 이죠이 오류 메시지, '두 번째 피연산자'에서

상수가 아닌 표현을 준다? 미리 감사드립니다.

답변

3

다음은 x86 주소 지정 모드를 요약 한 것입니다. "register minus register"양식은 없습니다 (Wikipedia).

해결 방법으로 ecx의 내용을 무효화 한 다음 [edx+ecx]을 사용할 수 있습니다. 나중에 원래 값이 필요할 경우 다시 적용해야 할 수 있습니다.

+0

또는 mov eax, edx; 하위 eax, ecx, mov eax, [eax]. 이것은 당신에게 여분의 부정을 저장합니다. –

0

그런 오프셋을 뺄 수는 없습니다. 의도는 메모리 버퍼의 기본을 가리킨 다음 에 오프셋을으로 추가하는 것입니다. 빼기위한 연산 코드가

4

... 지정된 메모리 버퍼의 당신을 당겨 초래 :

mov eax, [edx+ecx] 

가와에서 조립 될 수있는 연산 코드가있다 :

mov eax, [edx-CONSTANT] 

은 어셈블러는 일반 연산 코드를 사용하지만 어셈블리 중에 상수를 무효화하기 때문에 다음과 같이 계산할 수 있습니다.

mov eax, [edx+(-CONSTANT)] 

그러나에 대한 opcode가 없습니다 :

그래서 기본적으로 존재하지 않는 명령을 실행하려고합니다.

관련 문제