2011-10-18 3 views
2

을 계산하는 방법을 알고 있나요 당신은 당신이 유효 주소가 위가^위치입니다 계산 어떻게 사람이 유효 주소

MOV EAX, [label1] ; label1 is at location 0x00D5A360 

NASM

어셈블리에서이 명령이 있다고 가정합니다.

주소 지정 모드가 직접이라는 사실을 알고 있습니다.

+0

저는 Nasm에 익숙하지 않습니다. MIPS 어셈블러에서 레이블에 대한 점프 명령은 상대 값, 즉 현재 행과 레이블이있는 행 사이의 행 수를 사용합니다. NASM은 비록 단순한 MIPS와는 상당히 다른 것처럼 보입니다. 그리고이 MOV 명령이 레이블로 무엇을하는지조차 알지 못합니다. – melak47

+0

아무런 변화가 없습니다! ** 명령어의 두 번째 부분으로 32 비트 숫자 (0x00D5A360) ** MOV EAX **는 직접 메모리 위치를 가리 킵니다. –

답변

5

nasm에서 label은 레이블의 주소를 나타내고 [label]은 거기에 저장된 값을 검색합니다.

mov eax, label1  ; eax <- 0x00D5A360 

또는 사용하는 다양한 lea (부하 효과적인 주소) : : 그래서 당신은 할 수

lea eax, [label1] ; eax <- 0x00D5A360 

을 또는 어셈블러가 유효 주소를 결정하는 방법을 물어? 이는 어셈블러, 선택적으로 링커 및 로더에 의해 조합되어 처리되기 때문입니다. 일반적으로 코드는 relocations으로 중간 객체 형식으로 컴파일되며 링커 또는 로더는 label1의 유효 주소 계산을 처리합니다. 은 ": 2 권 인텔 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서"에서

+0

글쎄, 무엇을 묻는 방법은 어셈블러에서 실제 주소를 계산하는 것입니다. 예를 들어 게시 된 라인 예 MOV EAX, [label1]; label1은 0x00D5A360 위치에 있습니다. 이제 유효한 주소는 다음과 같습니다. 0x00d5a360 –

+0

@Shawnricshawnawic : 그럼 내 대답 중 두 번째는 적합합니다. nasm의 환경/출력 형식에 따라 정적으로 결정됩니다 (ORG 지시어로 영향을 미칠 수 있음) 또는 링크 타임 (extern 기호 사용) 또는 런타임 (다시 extern 기호 사용)에 영향을 미칩니다. – user786653

+0

완벽하게 고마워. 나는 또한 새로운 기술 "lea"를 배웠다. LOL이 너에게 대단히 감사한다고 생각했을 것이다. 나는 여기에서 그것을 처리 할 수 ​​있다고 생각한다. :) –

0

 
LEA r16, m ; Store effective address for m in register r16. 
LEA r32, m ; Store effective address for m in register r32. 
LEA r64, m ; Store effective address for m in register r64. 

는 첫 번째 피연산자의 효과가 두 번째 피연산자의 주소 (소스 피연산자)과 저장한다 (계산 대상 피연산자). 소스 피연산자는 프로세서의 주소 지정 모드 중 하나로 지정된 메모리 주소 (오프셋 부분)입니다. 대상 피연산자는 범용 레지스터입니다.

예 :

; indirect addressing mode 
MOV EBX, label1 ; copy the address of label1 to EBX 
MOV [EBX], 100 ; store 100 at the location pointed to by EBX 

; using LEA 
LEA EBX, [label1] ; stores the effective address of label1 in EBX 
MOV [EBX], 100 ; store 100 at the location pointed to by EBX 

둘 사이의 차이가 MOV 버전 조립시의 유효 어드레스를 해결하는 반면 LEA은, 실행시에 실효 어드레스를 계산한다는 것이다.

+0

그래서 기본적으로 LEA를 타이핑하고 프린트한다. 화면의 유효 주소? 거기에 컴퓨터를 사용하여 이것을 수행하는 방법이 있습니다. –