2012-05-10 3 views
0

내 수업 중 하나에 대한 실습을 통해 읽고있었습니다. 질문에 대한 아키텍처는 x86입니다. 질문 :이 x86 어셈블리 예제에서 발생할 수있는 오류

Which of the following lines of pseudo C code performs the same operation as the 
assembly statement 
    lea 0xffffffff(%esi), %eax ? 

옵션 : 대답은해야처럼

a) *(esi-1) = eax 
b) esi = eax + 0xffffffff 
c) eax = esi - 1 
d) eax = *(esi -1) 

그것은 "레아"작업이기 때문에, 나는의 (c) 느낌,하지만 분명히 대답 키는 말한다 (A). 이것은 오타입니까? 또는 나는 다만 나쁜 이해가있다. 고맙습니다.

+0

'lea' 명령은 결과를 레지스터가 아닌 메모리 덩어리로 이동시키기 때문에 C에서는이를 수행 할 수 없습니다. – Hawken

+0

나는 이것이 C에서 물리적으로 가능하지 않다는 것을 이해하지만, 기본적으로 sudo C 코드를 묻는다. 위의 설명을 수정했습니다. – de1337ed

+0

아, 미안 해요, 나는 조립에 상당히 새로운데, 내 마음을 날카롭게 유지하려고 노력하고 있습니다. :) – Hawken

답변

1

가장 정확한 해석은 다음과 같습니다

c) eax = esi - 1; 

이 (& T AT 뒷면에 의사 C 변환) 반대를하는 :

를이 단순화 될 수있다 물론

eax = (esi + 0xFFFFFFFF) & 0xFFFFFFFF; 

a) movl %eax,0xffffffff(%esi) 
b) lea 0xffffffff(%eax),%esi 
c) lea 0xffffffff(%esi), %eax 
d) movl 0xffffffff(%esi), %eax 
2

답변 c이 맞습니다.

이러한 종류의 코드는 lea이 최대 3 개의 입력 피연산자를 허용하고 플래그를 변경하지 않고 그대로 두는 add의 비파괴 버전이라는 사실을 악용하기 위해 컴파일러 (일부 사람 :-))에 의해 생성됩니다.

관련 문제