'Assembly'에 해당되는 글 1건
- 2009.02.04 Assembly에서 Memory To Memory 연산이 불가능한 이유 1
2009. 2. 4. 16:19
Assembly에서 Memory To Memory 연산이 불가능한 이유
2009. 2. 4. 16:19 in x86 Architecture
Assembly 연산에서 Indirect Addressing Mode로 Memory To Memory 연산이 불가능한 이유
Written By Sim-Hyeon, Choe
중복 사이클 루틴(2번의 인출 과정)도 함께 포함하여 하나의 루틴으로 구성하여야 하기 때문에
비효율적입니다.
물론 위의 Micro-Operation은 어디까지나 저의 유추이기 때문에 실제로 어느 정도 길이의
Instruction일지 확실하게 장담할 수 없으나, 대략적인 그림은 흡사하다고 생각하고 있습니다.
mov eax, dword ptr [addr]
하지만, 위에서 언급한 것과 같이 Control Memory에서 Sub routine의 크기나 구성면에서
볼 때, 비효율적이라고 할 수 있지요.
저의 컴퓨터(Intel-Pentium Quad core)에서 OpCode를 분석해보면, Instruction Set에서
하나의 간접 비트만 쓰도록 디자인 되어 있습니다(OllyDebug와 Intel-Manual 조합으로 분석
한 결과) 따라서 하나의 Operand 뿐만 아니라, 두 Operand 모두 간접 비트임을 나타낼 수
있는 비트열이 필요합니다. 이것은 단순히 추가적으로 간접 비트를 쓰도록 지원하는 일과 같이
간단할지 의문이네요. Data Bus Line의 길이가 적어도 80Bit이상은 되어야 합니다.
왜냐하면, 저의 프로세서 Data Bus는 64Bit인데요. 두 Operand에 대하여 32Bit 주소 지정
이 가능해야 하기 때문에 최소 64Bit까지 필요합니다. (물론 64Bit 프로세서일 경우에는 이러
한 Instruction Set 지원이 불가능하겠지요)
뿐만 아니라, 프로세서에 내장되어 있는 MBR, IR, IBR 등과 같은 레지스터도 위의 Data Bus
크기를 수용할 수 있는 칩으로 집적해야 되는데, 이것은 곧 프로세서 제조 비용이 상승하게 되
는 문제이기도 하지요.
Written By Sim-Hyeon, Choe
예전에 임베디드 아키텍처를 주제로 한 기술 세미나(손성호 회원)에서 Memory To Memory
연산이 불가능한 이유를 묻는 질문이 있었습니다. 거기에 대한 이유가 명확하지 않았는데요...
나름대로 유추해 보았습니다(결코 정답은 아닙니다).
연산이 불가능한 이유를 묻는 질문이 있었습니다. 거기에 대한 이유가 명확하지 않았는데요...
나름대로 유추해 보았습니다(결코 정답은 아닙니다).
일단 RISC 프로세서에서는 레지스터 단위로 연산하는데, LOAD/STORE와 같은 메모리 접근
전용 명령어를 제공해 주고 있습니다. 메모리에 직접 접근하여 하나의 Instruction을 인출하여
읽거나 쓰는 과정 자체는 한 사이클 내에 처리할 수가 없습니다. Indirect Cycle과 같은 Sub
Cycle이 필요하기 때문이지요.
전용 명령어를 제공해 주고 있습니다. 메모리에 직접 접근하여 하나의 Instruction을 인출하여
읽거나 쓰는 과정 자체는 한 사이클 내에 처리할 수가 없습니다. Indirect Cycle과 같은 Sub
Cycle이 필요하기 때문이지요.
(Indirect Cycle이란, 최초 지정된 번지에서 인출한 데이터 필드 내용에 있는 Address를
한번 더 참조하여 가지고 오는 사이클을 말합니다)
RISC에서는 한 사이클에 하나의 Instruction 처리를 설계의 기본으로 하고 있다고 하네요.
하지만 CISC 프로세서에서는 하나의 Instruction이 여러 개의 Micro-Operation의 조합으로
구성될 수 있는데, 이것은 Instruction은 여러 클럭을 사용할 수 있음을 의미하기 때문에
프로세서 설계시 Memory To Memory 연산을 지원해 준다면 가능할 수 있습니다.
그렇게 디자인한다면 2가지의 형태로 디자인 할 수 있을 겁니다.
1. cpy addr1, addr2 [imme] - Instruction을 지원
cpy는 제가 임의로 디자인 명령어입니다. 그러니까 의미상 두 오퍼랜드에 대하여
Indirect Addressing mode로 메모리 필드의 내용을 왼쪽으로 이동하라는 명령어입니다.
Indirect Addressing mode로 메모리 필드의 내용을 왼쪽으로 이동하라는 명령어입니다.
여기에 대한 Pseudo Sub cycle routine의 Micro-Operation을 다음과 같이 정의할
수 있습니다.
수 있습니다.
// 첫번째 오퍼랜드 인출
MAR <- PC
MBR <- M[MAR], PC <- PC + 1
IR <- MBR
// 임시 저장
MAR <- IR
MBR <- M[MAR]
AC <- MBR
// 두번째 오퍼랜드 인출
MAR <- PC
MBR <- M[MAR], PC <- PC + 1
IR <- MBR
// 대상 메모리 주소를 엑세스하여 저장
MAR <- IR
M[MAR] <- AC
위에서 보시다시피, 최소 11사이클(한 사이클에 1 Micro-Operation이라는 가정하에) 이상
소요가 될 수 있는 오버헤드가 매우 큰 명령어가 되겠군요. 뿐만 아니라, Program Control
Unit 내부에 있는 Control Memory에서 위와 같이 큰 루틴을 저장한다고 하였을 때, 기억
장소 낭비가 상당하지요.
소요가 될 수 있는 오버헤드가 매우 큰 명령어가 되겠군요. 뿐만 아니라, Program Control
Unit 내부에 있는 Control Memory에서 위와 같이 큰 루틴을 저장한다고 하였을 때, 기억
장소 낭비가 상당하지요.
중복 사이클 루틴(2번의 인출 과정)도 함께 포함하여 하나의 루틴으로 구성하여야 하기 때문에
비효율적입니다.
물론 위의 Micro-Operation은 어디까지나 저의 유추이기 때문에 실제로 어느 정도 길이의
Instruction일지 확실하게 장담할 수 없으나, 대략적인 그림은 흡사하다고 생각하고 있습니다.
결과적으로 아래의 Instruction Sets 조합과 동일한 디자인이 되겠지요.
mov eax, dword ptr [addr]
mov dword ptr [addr], eax
퍼포먼스는 2번의 Indirect Cycle을 피할 수 있기 때문에 cpy 명령어가 좀 더 빠를 것입니다.
하지만, 위에서 언급한 것과 같이 Control Memory에서 Sub routine의 크기나 구성면에서
볼 때, 비효율적이라고 할 수 있지요.
2. mov dword ptr [addr1], dword ptr [addr2] - 이러한 형태의 Instruction Set을 설계
- Instruction Set의 비트열의 재구성
저의 컴퓨터(Intel-Pentium Quad core)에서 OpCode를 분석해보면, Instruction Set에서
하나의 간접 비트만 쓰도록 디자인 되어 있습니다(OllyDebug와 Intel-Manual 조합으로 분석
한 결과) 따라서 하나의 Operand 뿐만 아니라, 두 Operand 모두 간접 비트임을 나타낼 수
있는 비트열이 필요합니다. 이것은 단순히 추가적으로 간접 비트를 쓰도록 지원하는 일과 같이
간단할지 의문이네요. Data Bus Line의 길이가 적어도 80Bit이상은 되어야 합니다.
왜냐하면, 저의 프로세서 Data Bus는 64Bit인데요. 두 Operand에 대하여 32Bit 주소 지정
이 가능해야 하기 때문에 최소 64Bit까지 필요합니다. (물론 64Bit 프로세서일 경우에는 이러
한 Instruction Set 지원이 불가능하겠지요)
가변적인 명령어에서 최대 길이는 16bit이기 때문에 OpCode가 포함될 공간이 부족합니다.
뿐만 아니라, 프로세서에 내장되어 있는 MBR, IR, IBR 등과 같은 레지스터도 위의 Data Bus
크기를 수용할 수 있는 칩으로 집적해야 되는데, 이것은 곧 프로세서 제조 비용이 상승하게 되
는 문제이기도 하지요.
결국은 두가지 모두 프로세서 설계에 있어서 굉장히 효율이 떨어지는 구조가 될 수 밖에 없기
때문에 지원하지 않는 것이 아니냐는 것이 저의 생각입니다.
때문에 지원하지 않는 것이 아니냐는 것이 저의 생각입니다.