조립-메모리 세그먼트
우리는 이미 조립 프로그램의 세 부분에 대해 논의했습니다. 이 섹션은 다양한 메모리 세그먼트도 나타냅니다.
흥미롭게도 섹션 키워드를 세그먼트로 바꾸면 동일한 결과를 얻을 수 있습니다. 다음 코드를 시도하십시오-
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 −이 세그먼트에는 프로그램 내의 기능 및 절차에 전달 된 데이터 값이 포함됩니다.