어셈블리 언어를 배우려고하고 있는데 뭔가 명확한 설명이 필요합니다. 내가 조립에 대해 많이 알지 못하기 때문에 내가 잘못했다면 나를 바로 잡으십시오.어셈블리 메모리 할당
내가 본 모든 튜토리얼에는 0x0000
과 같은 메모리 주소에 할당 된 어셈블리 프로그램의 변수가 있습니다. 어셈블리에서 수동으로 메모리 주소를 할당해야한다는 것을 이해할 수 있지만 사용할 주소를 어떻게 알 수 있습니까?
분명히 가능한 가장 낮은 메모리 주소에서 시작하는 것이 좋습니다. 그러나 할당 할 변수가 0x0000
에서 사용 가능한 메모리보다 큰 경우 어떻게해야합니까? 문제의 변수가 0x0001
또는 0x0002
으로 실행 되나요? 만약 그렇게했다면 다른 변수가 비슷한 번호 매기기를 가진 공백을 할당하게 될 것입니다 (또는 그 공백을 할당하지 않아도됩니까?).
동시에 (현대 OS에서) 실행중인 어셈블리에서 작성된 두 개의 프로그램이 있고 두 프로그램 모두에서 동일한 메모리 주소를 사용하는 경우 한 프로그램이 다른 프로그램과 충돌하거나 OS가 실제로 프로그램에 쓰여진 내용과 관계없이 사용 가능한 메모리 주소는 무엇입니까?
제목에 관한 모든 정보는 높이 평가됩니다.
감사합니다. 답의 마지막 부분에서 데이터의 각 비트에 필요한 공간의 양을 정확하게 계산하는 방법은 무엇입니까? 프로그램에 대한 수백 가지 변수를 수동으로 계산하는 것은 실현 가능하지 않습니다. 당신의 말을 사용해서, 당신은 어떻게 그것을 눕습니까? – ubiquibacon
커다란 프로젝트에서 어셈블리를 사용한 적은 한번도 없지만 내 OS 클래스에서 권장되는 경험적 방법은 크기별로 변수를 정렬 한 다음 가장 작은 메모리 주소에 가장 작은 것을 넣는 것이 었습니다. 이것은 항상 최상의 레이아웃은 아닙니다. 큰 데이터 사이에 작은 데이터 유형을 넣을 수 있습니다. 변수의 유형에서 필요한 메모리 양을 알 수 있어야합니다. 어셈블리 언어에 대한 설명서를 참조하십시오. 변수는 프로그램 실행 전체에서 동일한 양의 메모리를 차지한다는 것을 기억하십시오. 그것은 "성장할"수 없습니다. 오버 플로우가 발생하는 이유입니다. –
훌륭한 답변, 단 하나의 수정. 데이터를 올바르게 정렬하는 것은 공간을 절약하는 것이 아니라 어쨌든 모든 인접한 메모리를 저장하는 것입니다. 데이터 버스가 메모리에 매핑하는 방법과 관련이 있습니다. 첫 번째 8 비트는 주소 0에서 시작하고 다음 8 비트는 주소 1에 연결됩니다. 즉, 주소 0에서 시작하는 16 비트 정수는 데이터 버스의 양면을 사용하기 때문에 단일 읽기에서 읽을 수 있습니다. 그러나 16 비트 정수가 1에서 시작하면 이제 전체 정수를 얻기 위해 두 번 읽어야합니다. 32 비트 정수의 경우 동일한 이유로 4로 나눌 수있는 주소에서 시작해야합니다. – Despertar