'Instruction'에 해당되는 글 1건

  1. 2009.02.04 Assembly에서 Memory To Memory 연산이 불가능한 이유 1
2009. 2. 4. 16:19

Assembly에서 Memory To Memory 연산이 불가능한 이유

Assembly 연산에서 Indirect Addressing Mode로 Memory To Memory 연산이 불가능한 이유

Written By Sim-Hyeon, Choe

예전에 임베디드 아키텍처를 주제로 한 기술 세미나(손성호 회원)에서 Memory To Memory

연산이
불가능한 이유를 묻는 질문이 있었습니다. 거기에 대한 이유가 명확하지 않았는데요...

나름대로 유추해
보았습니다(결코 정답은 아닙니다).
 
일단 RISC 프로세서에서는 레지스터 단위로 연산하는데, LOAD/STORE와 같은  메모리 접근

전용
명령어를 제공해 주고 있습니다. 메모리에 직접 접근하여 하나의 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로
메모리 필드의 내용을 왼쪽으로 이동하라는 명령어입니다.
   
    여기에 대한 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에서
위와 같이 큰 루틴을 저장한다고 하였을 때, 기억

    장소 낭비가 상당하지요.

    중복 사이클 루틴(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

    크기를 수용할 수 있는
칩으로 집적해야 되는데, 이것은 곧 프로세서 제조 비용이 상승하게 되

    는 문제이기도 하지요.
 
 
결국은 두가지 모두 프로세서 설계에 있어서 굉장히 효율이 떨어지는 구조가 될 수 밖에 없기

때문에 지원하지
않는 것이 아니냐는 것이 저의 생각입니다.