문제

당신은 저를 변명해야합니다. 저는 X86 어셈블리에 익숙하고 일반적으로 어셈블리에 익숙합니다.

그래서 내 질문은 다음과 같은 것이 있습니다.

addl %edx,(%eax)

%EAX는 정수에 대한 포인터를 보유하는 레지스터입니다. XP라고합시다

이것은 다음과 같이 말하는 것을 의미합니까? *xp = *xp + %edx? (%edx 정수입니다)

Addl이 결과를 저장하는 곳은 혼란 스러워요. 만약에 %eax 그렇다면 int에 대한 포인터입니다 (%eax) 그 int의 실제 값이어야합니다. 그렇습니다 addl 결과를 저장하십시오 %edx+(%eax) 안에 *xp? 나는 누군가가 이것을 나에게 설명하기를 정말로 좋아합니다!

도움이 정말 감사합니다!

도움이 되었습니까?

해결책

예,이 교육은 당신이 생각하는 일을 정확하게하고 있습니다.

대부분의 x86 산술 지침은 소스와 목적지의 2 개의 피연산자를 사용합니다. AT & T Syntax (여기에서 사용)에서 대상은 항상 올바른 피연산자입니다. 그래서 다음과 같은 지시로 :

addl %edx, %eax

edx 그리고 eax 함께 추가되고 결과가 저장됩니다 eax. 그러나 당신의 예에서 (%eax) 메모리 피연산자입니다. 이것이 AT & T 구문 (NASM 구문의 정사각형 브래킷과 같은)에서 괄호가 의미하는 바입니다.

이것은 그것을 의미합니다 eax 포인터로 취급되므로 오른쪽 피연산자는 eax, 결과는 동일한 주소로 저장됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top