경우 32 비트 프로세서 RAM의 약 4 지브을 처리 할 수 있습니다 (즉, ) 바이트, 않습니다 왜 내 아두 이노 메가 2560 SRAM의 8 킬로바이트를하는 것을 경우 8 비트 프로세서하기로 할 수 있습니다 256 바이트 만 처리 합니까 ( )? 아니면 다음 페이지를 잘못 읽고 있습니까?
경우 32 비트 프로세서 RAM의 약 4 지브을 처리 할 수 있습니다 (즉, ) 바이트, 않습니다 왜 내 아두 이노 메가 2560 SRAM의 8 킬로바이트를하는 것을 경우 8 비트 프로세서하기로 할 수 있습니다 256 바이트 만 처리 합니까 ( )? 아니면 다음 페이지를 잘못 읽고 있습니까?
답변:
대부분의 8 비트 CPU에는 16 비트 주소 버스가있어 64KB를 처리 할 수 있습니다. 정확히 256 바이트만으로는 충분하지 않기 때문입니다! 주소를로드 할 때마다 1이 아닌 2 바이트를로드해야한다는 의미입니다. 크기를 고려하면 약간 느리지 만 견딜 수 있습니다.
(예, 64k가 너무 작아 졌을 때 주로 개발 된 많은 예외가 있지만 여기서는 기본 아이디어에 대해 이야기하고 있습니다).
어드레스 버스 및 데이터 버스는 서로 다른 크기를 가질 수 있도록 분리된다. 특정 주소 버스 크기의 경우 레지스터 비트 너비보다 더 많은 메모리를 처리하는 많은 기술이 있습니다.
가장 일반적인 방법은 어떻게 든 주소 버스 너비를 늘리는 것입니다
주소에 여러 레지스터 사용
X
, Y
그리고 Z
RAM의 최대 64킬로바이트 있도록 레지스터 어드레스 데이터. 차례로 사람들은와 결합 될 수있다 RAMPX
, RAMPY
, RAMPZ
더 큰 버전 이상 RAM 주소를 액세스 할 수 있습니다. 또한 256 바이트 이상의 RAM을 가진 변형 SPH
에 더하여 스택 포인터의 높은 바이트를 SPL
가지고 있습니다 1H
&을 L
, B
& C
, D
& E
그는 16 비트 주소 레지스터로 함께 사용할 수 있습니다주소 지정을 위해 자연 크기보다 큰 단일 큰 특수 레지스터 사용
주소의 높은 부분에 특수 레지스터를 사용합니다 . 일부 메모리의 주소를 지정할 때 기본적으로 주소의 8 개의 하위 비트는 8 비트 마이크로 컨트롤러의 8 비트 즉시 또는 8 비트 레지스터에서 가져 오는 반면, 상위 비트는 다른 주소 레지스터의 값으로 대체됩니다.
call
하거나 goto
명령 할 때 8 비트 또는 9 비트의 하위 비트가 즉시 표시되고 나머지는 현재 프로그램 카운터에서 가져옵니다. 따라서 현재 세그먼트 주변에서 멀지 않은 곳에 액세스하려면 하나의 명령어 만 사용하고 추가 주소에는 2 개의 명령어 (높은 비트를 설정)가 필요합니다.PC
.이를 달성하는 또 다른 방법은 메모리 뱅킹 입니다. 이것은 오늘날 일부 아키텍처에서 여전히 유용한 방법입니다. 이 모델에서 메모리는 여러 뱅크 로 나뉩니다 . 매번 특정 은행 만 처리 할 수 있습니다. 글로벌 뱅크 또는 주소 범위가 항상 항상 보이는 경우가 종종 있지만 다른 부분의 경우 필요할 때 뱅크를 전환해야합니다.
꽤 일반적인 기술은 아니지만 Intel 8051 에서 찾을 수 있습니다 . 8 비트 데이터 주소를 가진 마이크로 컨트롤러는 최대 256 개의 주소를 가질 수 있습니다. 공간의 절반 (높은 부분)은 특수 기능 레지스터 ( SFR )에 사용되며 실제 RAM은 128 바이트로 제한 할 수 있습니다. 그러나 현대 8051 시리즈 제조업체는 메모리 액세스 를 분리 하여이를 극복 할 수있는 영리한 방법을 찾았습니다 . 주소 직접 액세스 할 SFR을 하면서 간접 주소 지정 레지스터는 RAM의 높은 부분에 액세스하지만 지금은 256 + 128 = 384 주소 바이트를 가지고있는 의미합니다.
1 https://ko.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
가장 작은 코어는 256 바이트 이하의 데이터 주소 공간 (I / O 포트 및 기타 예약 된 주소가 제거 된 후 128 바이트 이하의 RAM을 의미 함)과 ≤8192 바이트 (8KiB)의 프로그램 ROM을 갖습니다. 여기에는 8 비트 스택 포인터 (SPL) 만 있으며 12 비트 상대 점프 / 호출 RJMP / RCALL 만 지원합니다. (AVR 프로그램 카운터는 바이트가 아닌 16 비트 워드를 카운트하기 때문에 12 비트 오프셋은 213 바이트의 ROM을 처리하기에 충분합니다.)
사용 가능한 리소스에 액세스하는 데 필요한 추가 메모리 주소 지정 기능이 있습니다.
- > 256 바이트 이상의 데이터 주소 공간 (≥256 바이트의 RAM)을 가진 모델은 16 비트 스택 포인터를 가지며 SPH 레지스터의 절반이 높습니다.
- ROM이 8KiB 이상인 모델은 2 워드 (22 비트) JUMP 및 CALL 명령어를 추가합니다. 건너 뛰기 명령 다음에 2 워드 명령이 오는 경우 일부 초기 모델에서는 오류가 발생합니다.
- ROM이 64KiB 이상인 모델은 ELPM 명령어 및 해당 RAMPZ 레지스터를 추가합니다. LPM 명령어는 ROM 주소를 Z로 0 확장합니다. ELPM 명령어는 RAMPZ 레지스터 앞에 높은 비트를 붙입니다. 이것은 일반적인 LPM 명령어와 동일하지 않습니다. 제로 오퍼랜드 형식의 ELPM (ATmega103 및 at43usb320) 만있는 "클래식"모델이 있습니다. 자동 증분을 사용할 수있는 경우 (대부분의 모델) RAMPZ를 포함하여 전체 24 비트 주소를 업데이트합니다.
- ROM이 128KiB 이상인 (레어) 모델에는 3 바이트 프로그램 카운터가 있습니다. 서브 루틴 호출 및 리턴은 추가 바이트 공간의 스택 공간을 사용하고, 무관 한 점프 및 호출을위한 추가 높은 비트를 제공하는 새로운 EIND 레지스터가 있으며, EIND : Z를 대상 주소로 사용하는 새로운 확장 명령어 EIJMP 및 EICALL이 있습니다. (이전 IJMP 및 ICALL 명령어는 확장되지 않은 Z를 사용합니다.)
- RAM 주소 공간이 64KiB 이상인 (레어) 모델은 RAMPX, RAMPY, RAMPZ 및 RAMPD 레지스터를 사용하여 16 비트 RAM 주소 지정 한계를 확장합니다. 이들은 각각 X, Y 또는 Z 레지스터 쌍을 사용하는 주소 지정 모드 또는 직접 주소 지정 명령어 LDS / STS를위한 추가 하이 비트를 제공합니다. ROM 액세스와 달리 고유 한 "확장 된"명령어는 없습니다. 대신 RAMP 레지스터가 무조건 사용됩니다.
거의 모든 8 비트 프로세서는 하위 부품과 상위 부품에서 16 비트 주소를 형성 할 수 있습니다. 원래 8080을 포함한 일부 프로세서에는 주소의 상단과 하단을 유지하는 전용 레지스터가 있습니다 (프로그래머의 관점에서 보면 8080의 스택 포인터와 같은 일부 레지스터는 별도로 주소 지정하는 명령을 제공하지 않을 수 있음). 일부 다른 프로세서에는 주소의 상반신에 할당 된 레지스터가 없지만 주소는 "즉시"조립됩니다. 예를 들어, 6502에서 "LDA $ 1234, X"명령어는 8 비트 X 레지스터에 $ 1234를 추가하여 형성된 주소로 누산기를로드합니다 ($ F0을 포함한다고 가정). 해당 명령의 실행은 4 단계 또는 5 단계로 진행됩니다.
판독 바이트를 누산기로 전송하면 다음 명령어의 페치가 겹칩니다. 또한 많은 작업의 경우 3 단계에서 캐리가 생성되지 않으면 4 단계에서 올바른 주소를 읽었으며 5 단계를 무시하고 4 단계에서 다음 명령으로 바로 건너 뛸 수 있습니다.
작업 순서를 살펴보면 리틀 엔디안 아키텍처가 빅 엔디안 아키텍처에 비해 확실한 이점을 가지고 있음을 알 수 있습니다. 또한 ALU 결과를 기다리지 않고 계산 된 주소에서 바이트를 읽을 수 있습니다. 일반적으로 페치 된 상위 바이트는 대상 피연산자의 상위 바이트이기 때문입니다. 8 비트 ALU가있는 빅 엔디안 시스템에서 인덱스로드는 5 사이클 이상이 소요됩니다 (주소의 아래쪽 절반은 3 단계까지 읽지 않으므로 4 단계에서 계산 됨).
데이터 버스 라인 (핀)과 주소 라인 (핀)은 완전히 분리되어 있습니다. 간단히 말해, 데이터 버스 라인은 한 번에 하나씩 전송할 수있는 최대 비트 수 (메모리에 저장)를 결정하는 반면, 주소 라인은 선택할 수있는 최대 메모리 "셀"수를 결정합니다.
32 비트 x86 CPU는 4GB 이상의 RAM을 처리 할 수 없었습니다. 펜티엄 4 CPU에 A33-34 핀이 있다는 것을 기억합니다.
주소 지정 가능한 메모리 크기와 내부 레지스터 크기 간에는 어떤 관계가있는 경우가 종종 있지만 관계는 다른 이유로 다릅니다. 초기 마이크로 프로세서에서도 256 바이트의 주소 공간이 너무 작은 것으로 간주되었으므로 대부분의 8 비트 프로세서는 64 비트를 처리하는 16 비트 (2 바이트) 주소를 생성했습니다. 그러나 뱅크 스위칭을 사용하면 (필수적으로 더 많은 주소 라인을 생성하기 위해 특정 I / O 라인을 사용) 훨씬 더 많은 것을 가질 수있었습니다.
첫 16 및 32 비트 프로세서에는 장치의 내부 주소 레지스터가 처리 할 수있는 모든 공간에 도달 할 수있는 핀이 항상 충분하지 않았습니다. 예를 들어 Motorola 68000에는 16MB의 RAM을 처리 할 수있는 충분한 주소 핀 (24) 만 있었지만 내부 주소 레지스터의 너비는 32 비트였습니다.
언급 한 AVR 컨트롤러에 대해이 질문에 구체적으로 답변하겠습니다. 기본 원칙은 다른 많은 8 비트 아키텍처에도 적용됩니다.
AVR은 8 비트 코어입니다. 즉, 8 비트 레지스터가 있습니다. 그러나 8 비트로는 사용 가능한 메모리 양에 액세스하기에 충분하지 않습니다. 따라서 AVR 코어는 16 비트 포인터 레지스터로 결합 된 특정 레지스터 세트를 사용할 수 있습니다. 레지스터 r30 및 r31 (ZL 및 ZH라고도 함)이 이에 대한 예입니다. 함께 그들은 Z 포인터를 형성합니다.
어셈블리에서 주소 0x1234의 바이트를 읽는 것은 다음과 같습니다.
ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z ; Load byte to r16
AVR 제품군에는이를 위해 사용할 수있는 3 개의 레지스터 쌍이 있습니다. 그것들은 특별히 그러한 작업을 할 수 있도록 하드웨어로 설계되었습니다.
C와 같은 고급 언어로 프로그래밍 할 때 컴파일러는이 내용을 처리합니다.
참고 : 일부 AVR은 64k보다 큰 메모리 크기도 지원합니다. 이 컨트롤러에는 액세스 전에 주소의 추가 비트가 기록되는 특수 기능 레지스터가 있습니다. 따라서 주소는 다음 비트로 구성됩니다 (MSB에서 LSB로).
특수 기능 레지스터 (일반적으로 1 바이트), ZH (8 비트), ZL (8 비트).