2010-08-17 7 views
12

어셈블리 언어를 배우려고하고 있는데 뭔가 명확한 설명이 필요합니다. 내가 조립에 대해 많이 알지 못하기 때문에 내가 잘못했다면 나를 바로 잡으십시오.어셈블리 메모리 할당

내가 본 모든 튜토리얼에는 0x0000과 같은 메모리 주소에 할당 된 어셈블리 프로그램의 변수가 있습니다. 어셈블리에서 수동으로 메모리 주소를 할당해야한다는 것을 이해할 수 있지만 사용할 주소를 어떻게 알 수 있습니까?

분명히 가능한 가장 낮은 메모리 주소에서 시작하는 것이 좋습니다. 그러나 할당 할 변수가 0x0000에서 사용 가능한 메모리보다 큰 경우 어떻게해야합니까? 문제의 변수가 0x0001 또는 0x0002으로 실행 되나요? 만약 그렇게했다면 다른 변수가 비슷한 번호 매기기를 가진 공백을 할당하게 될 것입니다 (또는 그 공백을 할당하지 않아도됩니까?).

동시에 (현대 OS에서) 실행중인 어셈블리에서 작성된 두 개의 프로그램이 있고 두 프로그램 모두에서 동일한 메모리 주소를 사용하는 경우 한 프로그램이 다른 프로그램과 충돌하거나 OS가 실제로 프로그램에 쓰여진 내용과 관계없이 사용 가능한 메모리 주소는 무엇입니까?

제목에 관한 모든 정보는 높이 평가됩니다.

답변

18

(대부분의 최신 OS에서) 두 번째 질문에 대한 답은 가상 메모리입니다.

실제 메모리가있는 하드웨어 계층부터 시작합니다. 그게 손가락으로 실제로 찌를 수있는 물건입니다. 이것은 운영 체제가 보는 것입니다. 운영 체제를 사용하면 가상 메모리라는 추상화에 따라 프로세스를 실행할 수 있습니다.

각 프로세스는 자체 가상 메모리 공간을 갖습니다. 그래서 그것은 그것이 실행되는 유일한 프로세스 인 척할 수 있으며, 그것은 많은 메모리를 가지고 있습니다. 그런 다음 메모리에 액세스 할 때마다 실제 주소에 매핑되는 가상 주소를 제공합니다. 운영 체제는 가상 주소가 실제 실제 주소에 매핑되는 표를 RAM에 유지합니다. 일반적으로 이것은 성능상의 이유로 일부 특수 하드웨어 (MMU, 메모리 관리 장치)로 수행되지만 소프트웨어에서도 100 % 할 수 있습니다.

그래서 프로그램에서 0x000이라고 말하면 가상 주소입니다. 읽거나 쓰면 컴퓨터에 의해 실제 주소로 변환됩니다. 따라서 다른 프로세스에서 동일한 가상 주소 0x000이 다른 실제 주소에 매핑됩니다. 이 시스템을 사용하면 사용 가능한 RAM의 양 또는 프로그램이로드 될 주소를 정확히 알지 못해도 프로그램을 작성할 수 있습니다. 또한 프로그램이 다른 프로그램에 속한 메모리를 제거하지 못하게합니다.

절대적으로. 서로 다른 유형의 데이터는 서로 다른 양의 메모리를 사용합니다. 데이터 구조를 배치 할 때 필요한 공간의 양을 알아야합니다. 바이트 정렬 문제도 염두에 두어야합니다. 멀티 바이트 데이터 유형 (예 : 부동 소수점 수)은 종종 2 또는 4로 나눌 수있는 주소 또는 부동 소수점을 저장하는 데 필요한 바이트 수에서 시작해야합니다. 이는 프로세서 또는 RAM의 요구 사항입니다.따라서 다음에 한 바이트 씩 모든 데이터를 함께 정리할 수는 없습니다. 사용하지 않는 메모리를 최소화하려면 퍼즐 조각을 함께 맞추는 등의 특정 순서로 레이아웃해야합니다.

+0

감사합니다. 답의 마지막 부분에서 데이터의 각 비트에 필요한 공간의 양을 정확하게 계산하는 방법은 무엇입니까? 프로그램에 대한 수백 가지 변수를 수동으로 계산하는 것은 실현 가능하지 않습니다. 당신의 말을 사용해서, 당신은 어떻게 그것을 눕습니까? – ubiquibacon

+0

커다란 프로젝트에서 어셈블리를 사용한 적은 한번도 없지만 내 OS 클래스에서 권장되는 경험적 방법은 크기별로 변수를 정렬 한 다음 가장 작은 메모리 주소에 가장 작은 것을 넣는 것이 었습니다. 이것은 항상 최상의 레이아웃은 아닙니다. 큰 데이터 사이에 작은 데이터 유형을 넣을 수 있습니다. 변수의 유형에서 필요한 메모리 양을 알 수 있어야합니다. 어셈블리 언어에 대한 설명서를 참조하십시오. 변수는 프로그램 실행 전체에서 동일한 양의 메모리를 차지한다는 것을 기억하십시오. 그것은 "성장할"수 없습니다. 오버 플로우가 발생하는 이유입니다. –

+1

훌륭한 답변, 단 하나의 수정. 데이터를 올바르게 정렬하는 것은 공간을 절약하는 것이 아니라 어쨌든 모든 인접한 메모리를 저장하는 것입니다. 데이터 버스가 메모리에 매핑하는 방법과 관련이 있습니다. 첫 번째 8 비트는 주소 0에서 시작하고 다음 8 비트는 주소 1에 연결됩니다. 즉, 주소 0에서 시작하는 16 비트 정수는 데이터 버스의 양면을 사용하기 때문에 단일 읽기에서 읽을 수 있습니다. 그러나 16 비트 정수가 1에서 시작하면 이제 전체 정수를 얻기 위해 두 번 읽어야합니다. 32 비트 정수의 경우 동일한 이유로 4로 나눌 수있는 주소에서 시작해야합니다. – Despertar

1

목표와 메모리 유형 (RAM, ROM 등)에 따라 다릅니다. RAM에 대한 작은 임베디드 프로젝트에 대해 이야기하고 싶다면 몇 가지 파일을 가지고 있어야하며 마이크로 용 데이터 시트는 다양한 메모리 영역 어드레싱을 알려줄 것입니다. 여러 개의 '모듈'이있는 경우 링커를 사용하여 객체 파일을 실행 파일로 링크합니다. 링커는 중복되지 않도록 메모리 주소를 다시 할당하거나 모든 메모리 위치가 정의 된 중앙 파일을 가질 수 있으며 다른 모듈은이를 리소스로 사용합니다. 죄송합니다. 그 답변에 많은 큰 질문.

5

이것은 정확하게 대답은 아니지만이 책에는 대답이 나와 있습니다. 나는 단지 그것을 추천 할 수있다. 이름에서 알 수 있듯이 프로그래밍은 기초부터 가르쳐 줄 것입니다.

ProgrammingGroundUp