2013-02-18 2 views
1

$$은 NASM의 현재 세그먼트 주소로 정의됩니다. 그러나 그것의 진정한 의미는 무엇입니까? 나는 그것을 테스트하는 두 asm 파일 작성 :

a.asm

extern another 

[section .text] 
global _start 
_start: 
    mov ebx, $$ 
    call another 

b.asm

[section .text] 
global another 
another: 
    mov eax, $$ 
    ret 

컴파일을

nasm -f elf a.asm -g 
nasm -f elf b.asm -g 
ld -o test a.o b.o 

은 최종 파일 test을 디버깅 GDB를 사용하여, 나는 같은 이름을 가진 두 개의 섹션을 정의 불구하고, $$ 두 파일에서 다른 것으로 나타났습니다. 내가 파일에 섹션을 정의하면

  1. $$의 값이 해당 섹션의 시작 주소 : 그래서 추측. $$은 세그먼트 레지스터 (cs, ss, fs, gs, .etc)라고하는 과 아무런 관련이 없습니다.
  2. 다른 파일에서 같은 이름의 다른 섹션을 정의한 경우 다른 섹션으로 해석됩니다. 그러나 같은 이름의 두 섹션이 같은 파일에 정의되어있는 경우 두 섹션 사이에 다른 섹션 정의가 있는지 여부에 관계없이 항상 동일한 섹션으로 해석되며 동일한 $$ 값으로 해석됩니다. 다음과 같이 두 개의 .text 섹션은 동일합니다.

    [section .text] 
    global _start 
    _start: 
        mov ebx, $$ 
    
    [section .d] 
    d: 
        mov ecx, $$ 
    
    [section .text] 
    another: 
        mov eax, $$ 
        ret 
    
  3. 나는 컴파일 할 때 NASM 인식하고 적절한 장소에 넣어 수있는 몇 가지 섹션 이름이있는 것 같아요. .data과 같이 NASM이 인식 할 수있는 섹션 이름은 무엇입니까? 고마워요!

답변

2

$$은 현재 섹션의 시작 주소입니다. 이것은 재배치 가능한 값입니다 ("스칼라"가 아닙니다 - 오류 메시지에서 찾을 수있는 단어이지만 매뉴얼에는 없습니다). 이것은 오프셋이므로 세그먼트 레지스터에 무엇이 있는지 상관하지 않습니다.

유용한 정보는 $ - $$, 지금까지 섹션 길이입니다. $ - $$은 "스칼라"(레이블 사이의 차이점과 동일 함)이며, 그렇지 않으면 Nasm이 "스칼라 값이 아님"에 대해 소리 치게하는 표현식에 사용될 수 있습니다.

Nasm에 "알려진"섹션 이름은 출력 형식에 따라 다릅니다. "-f obj"는 전혀 알지 못합니다. .text, .data.bss은 꽤 보편적입니다. 일부 출력 형식은 다른 형식을 알고 있습니다. '매뉴얼'의 '출력 형식'장에서 찾으실 수 있습니다. http://www.nasm.us 다운로드를 통해 설명서를받지 못한 경우. 이 이름들은 대소 문자를 구별하며, '.' 필요합니다.

여기에 "질문"이 있다는 느낌이 들었습니다. 당신은 실제로 무엇을하려고합니까?