2016-10-11 2 views
4

어셈블리에서 변수가 어떻게 구현되는지 혼란 스럽습니다.어셈블리 변수는 어떻게 구현됩니까?

.section .data 
     var: 
       .long 23 

는 그 다음과 같은 변수에 액세스 할 수 있습니다 : 나는 다음과 같은 선언이 프로그램의 data 섹션에서 명명 된 메모리 위치를 생성 것을 알고있다에 내가 명확하지 않다 무엇

movl var, %eax //read from var location 

방법 위의 지침이 실제로 구현됩니다. 메모리 참조, 절대 메모리 참조조차도 레지스터에로드해야만 사용할 수 있다는 인상을 받았습니다.

leal var, %ebx 
movl (%ebx), %eax 

또는 어셈블러 var의 주소를 추적하고 절대 즉시 액세스 할 수있는 것처럼 그 위치에 액세스 않습니다

어셈블러는 다음과 같은 여러 지침으로 위의 명령을 변환해야합니까 , 예를 들면 : - 거의 모든 지시는 직접 또는 간접 메모리 참조를 사용할 수 있습니다

movl ($addr_of_var), %eax 
+0

아니요. 요구 사항에 대한 오해가 있습니다. 주소를 레지스터에로드 할 필요가 없습니다. 'MOV' 명령어 군에 대한 명령어 참조를보십시오. –

답변

8

메모리를 필요로하지 않습니다 x86 명령어 세트는 사용하기 전에 레지스터에로드 할 주소를 지시. 자세한 내용은 Intel architecture manual을 참조하십시오.

레지스터에 주소를로드하기위한 요구 사항은 MIPS와 같이 일부 RISC CPU의 특징입니다.

+0

감사! 위의 두 번째 진술은 정확합니까? (어셈블러는 변수에 대한 절대 참조를 추적합니까?) – David

+2

@David : assmebler는 일반적으로 기호 참조를 기호로 처리하고 모든 것을 최종 위치를 결정하기 위해 링커에 남겨두고 필요에 따라 코드를 수정합니다. –

+0

귀하의 도움에 감사드립니다. – David