조립-메모리 세그먼트

우리는 이미 조립 프로그램의 세 부분에 대해 논의했습니다. 이 섹션은 다양한 메모리 세그먼트도 나타냅니다.

흥미롭게도 섹션 키워드를 세그먼트로 바꾸면 동일한 결과를 얻을 수 있습니다. 다음 코드를 시도하십시오-

segment .text	   ;code segment
   global _start    ;must be declared for linker 
	
_start:	           ;tell linker entry point
   mov edx,len	   ;message length
   mov ecx,msg     ;message to write
   mov ebx,1	   ;file descriptor (stdout)
   mov eax,4	   ;system call number (sys_write)
   int 0x80	   ;call kernel

   mov eax,1       ;system call number (sys_exit)
   int 0x80	   ;call kernel

segment .data      ;data segment
msg	db 'Hello, world!',0xa   ;our dear string
len	equ	$ - msg          ;length of our dear string

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Hello, world!

메모리 세그먼트

세그먼트 메모리 모델은 시스템 메모리를 세그먼트 레지스터에있는 포인터가 참조하는 독립 세그먼트 그룹으로 나눕니다. 각 세그먼트는 특정 유형의 데이터를 포함하는 데 사용됩니다. 한 세그먼트는 명령어 코드를 포함하는 데 사용되고 다른 세그먼트는 데이터 요소를 저장하며 세 번째 세그먼트는 프로그램 스택을 유지합니다.

위의 논의에 비추어 다양한 메모리 세그먼트를 다음과 같이 지정할 수 있습니다.

  • Data segment − 다음과 같이 표현됩니다. .data 섹션 및 .bss. .data 섹션은 프로그램에 대한 데이터 요소가 저장되는 메모리 영역을 선언하는 데 사용됩니다. 이 섹션은 데이터 요소가 선언 된 후에는 확장 할 수 없으며 프로그램 전체에서 정적으로 유지됩니다.

    .bss 섹션은 또한 나중에 프로그램에서 선언 할 데이터에 대한 버퍼를 포함하는 정적 메모리 섹션입니다. 이 버퍼 메모리는 0으로 채워져 있습니다.

  • Code segment − 다음과 같이 표현됩니다. .text부분. 이것은 명령어 코드를 저장하는 메모리 영역을 정의합니다. 이것은 또한 고정 된 영역입니다.

  • Stack −이 세그먼트에는 프로그램 내의 기능 및 절차에 전달 된 데이터 값이 포함됩니다.