어셈블리 언어를 사용하고 있지 않습니다. 예를 들어 코드 세그먼트 나 데이터 세그먼트와 같은 메모리 세그먼트를 초기화 할 때마다 OS는 메모리 세그먼트의 일부를 할당한다고합니다. 그러나, 나는 정말로 내 책이 "기억의 일부분"을 의미하는 것으로 혼란 스럽다. RAM의 코드 세그먼트가 구체적입니까?어셈블리 언어 : 다른 세그먼트 .... 그들은 RAM에 저장되어 있습니까?
0
A
답변
1
예! 일반적으로 모든 세그먼트는 RAM에로드됩니다. 효율성과 보안상의 이유로 다양한 세그먼트를 구별합니다. 예를 들어, 텍스트는 실행 가능하지만 쓰기가 불가능한 반면 데이터는 쓰기 가능하지만 실행 가능하지 않기 때문에 텍스트와 데이터를 구별합니다.
임베디드 플랫폼에서 일부 섹션은 RAM 대신 EEPROM 또는 플래시 ROM에있을 수 있으므로 소중한 RAM을 낭비하지 않을 수 있습니다. 프로그래머에게있어 유일한 차이점은 특별한 준비를하지 않는 한 그러한 섹션에 쓸 수 없다는 것입니다.
2
당신은 코멘트에 참조 번호를 가지고,하지만 난 핵심 질문에 답변 고려해야 할 여러 가지 상태가 있다는 것을 추가하고 싶었 :
- 컴파일하고 코드를 연결, 그것은 기록이 결과를 실행 파일 또는 라이브러리로 디스크에 저장합니다.
- 디스크 이미지에서 컴파일러/링커는 다양한 세그먼트에 대한 정보를 인코딩합니다.
- 실행 파일/라이브러리가로드되면 OS는 RAM으로 선언 한 세그먼트를 설정하고 세그먼트가 적절한 권한 (예 : noted by fuz)을 차지하는 메모리 페이지를 표시합니다.
- 세그먼트의 전체 내용을 읽고 RAM에로드할지 여부는 실행중인 플랫폼에서 제공되는 여러 요인 및 최적화에 따라 달라집니다. 당신은 다른 곳에서 그것을 연구 할 수 있습니다 ...
당신은 x86에 대해 이야기하고 있습니까? 그렇다면 세그먼트 * 레지스터 * 또는 어셈블러에서 설명 할 수있는 세그먼트 표현에 대해 이야기하고 있습니까? 불행히도 "세그먼트"는 x86 문헌에서 상당히 과부화 된 용어입니다. –
예 ... 저는 x86을 언급하고 있습니다. 세그먼트 레지스터는 메모리 세그먼트의 주소를 보유합니다. 내 질문은, 내가 어셈블러에 예를 들어 데이터 세그먼트를 초기화하라는 지시를하면 .... 그 데이터 세그먼트가 RAM 내부에서 생성 된 것인가? – Eliza
'mov ax, @data/mov ds, ax'와 같은 일을 할 때? 아니요, 세그먼트가 로더에 의해 실행 파일에서로드되는 경우 올바른 위치를 가리 키도록 레지스터를 설정하는 것입니다. DOS와 같은 OS에서는 모든 메모리에 액세스 할 수 있습니다. 세그먼트 레지스터를 적절히 설정하면 원하는 모든 메모리를 "할당"(또는 더 잘 사용) 할 수 있습니다. –