2010-03-02 9 views
13

조립에 대한 기본적인 질문이 있습니다.조립 : 왜 우리는 레지스터로 귀찮게합니까?

메모리에서 작업 할 수 있다면 레지스터에서만 산술 연산을 수행해야하는 이유는 무엇입니까?

예를 들어 다음과 같은 이유 (실질적으로) 동일한 값을 응답으로 계산되어야 양 :

니핏 1

.data 
    var dd 00000400h 

.code 

    Start: 
     add var,0000000Bh 
     mov eax,var 
     ;breakpoint: var = 00000B04 
    End Start 


니핏 2

.code 

    Start: 
     mov eax,00000400h 
     add eax,0000000bh 
     ;breakpoint: eax = 0000040B 
    End Start 



대부분의 텍스트와 자습서는 대부분 레지스터에서 산술 연산을 수행합니다. 레지스터로 작업하는 것이 더 빠릅니까?

편집 : 빠른 것이 었습니다.

몇 가지 큰 답이 주어졌습니다. 가장 좋은 대답은 첫 번째 좋은 대답을 기반으로 선정되었습니다.

+4

나는 전문가 (따라서 주석 만) 아니지만, 레지스터는 CPU 내부이기 때문에, 빠른 메모리 작업보다 더있다. 1000x의 작은 여백이 아니라 더 빠른 속도로 빠릅니다. –

+4

일부 (일반적으로 RISC) 아키텍처 *하지 * 현실에서 그들은 상대적으로 거의 사용되지 있기 때문에, 메모리 주소의 내용을 직접 운영 산술 명령이있다. (86 물론, 미친 오래된 86의뿐만 아니라 다른 모든 가능한 이상한 기능으로, 때문에, 그것들을 가지고 있습니다.) – bobince

답변

9

레지스터가 훨씬 빠르고 또한 메모리에서 직접 수행 할 수있는 작업이 훨씬 더 제한되어있는 등, 인터럽트 처리, 프로 시저를 호출하기위한 쉽게/팝 레지스터를 푸시 할 수 있습니다.

+1

을 마우스 오른쪽에!또한, "결국"값이 주 메모리로 되돌아 오는 동안, 레지스터가 레지스터 내에서 일어나는 한 버스는 미리 캐시 등으로 읽는 것과 같은 다른 [병렬] 기능에 사용할 수 있습니다. – mjv

+0

그리고 레지스터 등록 지침은 많이 있습니다 짧아서 더 빠릅니다. 그들은 효과적인 주소를 계산할 필요가 없습니다. –

3

"느린"메모리 버스에 액세스 할 필요가 없기 때문에 레지스터는 way RAM 메모리보다 빠릅니다!

0

예, 레지스터를 사용하는 것이 훨씬 더 빠릅니다. 메모리에서 proc에 비해 프로세서에서 레지스터까지의 실제 거리 만 고려하더라도 전자를 보내지 않아도되는 시간이 많이 절약되므로 더 높은 클럭 속도로 실행할 수 있습니다.

0

예 - 또한 일반적으로

-2

그것은 명령어 세트는 같은 복잡한 작업을 수행 할 수 없습니다 단지입니다 :

add [0x400],[0x40002234] 

당신은 레지스터를 통해 이동해야합니다.

+0

정확히 이러한 종류의 명령어를 허용하는 CPU 아키텍처가 많이 있습니다. 문제는 속도이며, 허용되는 작업이 아닙니다. 제한된 작업은 올바른 마음을 가진 사람이 RAM을 RAM으로 처리하지 못하기 때문에 발생합니다. –

+1

질문은 IA32 명령어 세트를 사용하고있었습니다. 그리고 IA32에서는 존재하지 않습니다. 당신은 단지 그것을 할 수 없습니다. –

1

레지스터가 빠르기 때문에 레지스터를 사용합니다. 일반적으로 CPU 속도로 작동합니다.
레지스터와 CPU 캐시는 서로 다른 기술/fabric으로 만들어지며
비싸다. 반면 RAM은 저렴하고 100 배 느립니다.

23

컴퓨터 아키텍처를 살펴보면 일련의 메모리 수준을 알 수 있습니다. CPU에 가까운 것들은 빠르고, 비싸고 (따라서 비트 당), 따라서 작고, 반면에 당신은 크고, 느리고 저렴한 메모리 장치를 가지고 있습니다. 현대 컴퓨터, 이들은 일반적으로 같은 수 있습니다 : 시간이 지남에 따라 캐시의 더 많은 레벨이 추가되었습니다

CPU registers (slightly complicated, but in the order of 1KB per a core - there 
       are different types of registers. You might have 16 64 bit 
       general purpose registers plus a bunch of registers for special 
       purposes) 
L1 cache (64KB per core) 
L2 cache (256KB per core) 
L3 cache (8MB) 
Main memory (8GB) 
HDD (1TB) 
The internet (big) 

- CPU가 온보드 캐시를하지 않았을 때 나는 시간을 기억하고, 난 늙지도 않았어! 요즘에는 HDD가 내장 된 캐시와 함께 제공되며 인터넷은 메모리, HDD, 캐싱 프록시 서버와 같은 여러 위치에 캐시됩니다.극적인 (크기의 자주 주문) 떨어진 CPU의 각 단계에서 지연대역폭 및 증가 감소가

. 예를 들어, HDD는 대기 시간이 5ms 인 100MB/s에서 읽을 수 있습니다 (이 숫자는 정확하지 않을 수 있음). 주 메모리는 대기 시간이 9ns 인 6GB/s (6 자리 크기!). 대기 시간은 CPU를 오래 기다리게하고 싶지 않기 때문에 매우 중요한 요소입니다. (이것은 특히 파이프 라인이 깊은 아키텍처의 경우에 해당하지만 다른 날의 토론 임).

같은 데이터를 반복해서 반복해서 사용하기 때문에 이후의 작업을 위해 작은 빠른 캐시에 저장하는 것이 좋습니다. 이를 임시 국가이라고합니다. 지역의 또 다른 중요한 원칙은 공간 지역이며 서로 가까이있는 메모리 위치가 거의 동시에 읽을 수 있다고합니다. 이 이유 때문에 RAM에서 읽음으로써 훨씬 더 큰 RAM 블록이 읽고 CPU 캐시에 저장됩니다. 이러한 지역의 원칙이 없다면 메모리의 어느 위치에서든 한 번에 읽을 수있는 기회가 동일하므로 다음에 액세스 할 대상을 예측할 방법이 없으며 모든 캐시 수준 세계에서 속도를 향상시키지 못할 것입니다. 당신은 하드 드라이브를 사용할 수도 있지만 페이징 (기본적으로 HDD를 RAM의 확장으로 사용함) 할 때 컴퓨터가 멈추게하는 것이 어떤 것인지 알 것입니다. 개념적으로는 하드 드라이브를 제외하고는 메모리를 사용할 수 없지만 (많은 소형 장치는 단일 메모리를 가짐), 이것은 우리가 익숙한 것에 비해 매우 느릴 수 있습니다.

레지스터가있는 또 다른 이점은 짧은 명령어을 가질 수 있다는 것입니다. 2 개 (또는 그 이상)의 64 비트 주소를 포함하는 지침이있는 경우 긴 지침이 필요합니다!

+0

+1. 매우 도움이됩니다. 감사합니다. – Cam

+1

+1 인터넷 포함. 스토리지 계층을 실제로 완성합니다. –

1

일반적으로 말해서 레지스터 연산은 훨씬 빠르고 더 선호됩니다. 그러나 직접 메모리 연산이 유용한 경우가 있습니다. 메모리에서 숫자를 증가시키고 싶다면 (적어도 몇 백만 건의 명령어가 아니라면) 단일 직접 메모리 산술 명령어는 일반적으로로드/추가/저장보다 약간 빠릅니다.

복잡한 배열 작업을 수행하는 경우 일반적으로 위치를 추적하고 배열이 끝나는 위치를 추적하기 위해 많은 레지스터가 필요합니다. 구형 아키텍처에서는 레지스터가 너무 빨리 없어져서 현재 레지스터를 zapping하지 않고 두 비트의 메모리를 추가하는 옵션이 정말 유용했습니다.

1

x86은 조립을 배울 수있는 거의 모든 다른 "정상적인"CPU와 마찬가지로 "register machine"입니다. 프로그래밍 할 수있는 다른 방법 (예 : 메모리의 논리적 "테이프"를 따라 움직이는 튜링 기계)을 설계하는 방법이 있지만 등록 기계는 기본적으로 고성능을위한 유일한 방법임이 입증되었습니다.

x86은 레지스터를 사용하도록 설계 되었기 때문에 성능에 신경을 쓰고 싶지 않더라도 신경 쓰지 않아도됩니다.

현재 x86 CPU는 메모리 위치보다 클럭주기 당 더 많은 레지스터를 읽고 쓸 수 있습니다.

예를 들어 Intel Skylake는 사이클 당 32KB 8 웨이 연관 L1D 캐시 (최상의 경우)에서 두 개의로드와 한 개의 저장소를 수행 할 수 있지만 read upwards of 10 registers per clock, and write 3 or 4 (plus EFLAGS) 일 수 있습니다.

읽기/쓰기 포트가 the register file 인 L1D 캐시를 구축하는 것은 매우 큰 비용 (트랜지스터 수/면적 및 전력 사용량)으로 매우 비쌉니다. 아마도 x86이 동일한 성능으로 레지스터를 사용하는 방식으로 메모리를 사용할 수있는 무언가를 만드는 것은 물리적으로 불가능합니다.

또한 레지스터를 쓰고 다시 읽는 것은 CPU가이를 감지하고 한 실행 장치의 출력에서 ​​다른 레지스터의 입력으로 직접 결과를 전달하기 때문에 대기 시간이 거의 없습니다. (https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_A._Bypassing 참조).

실행 장치 간의 이러한 결과 전달 연결을 "바이 패스 네트워크"또는 "전달 네트워크"라고하며 모든 것이 메모리에 저장되어 다시 있어야하는 경우보다 CPU가 레지스터 디자인을 위해이 작업을 수행하는 것이 훨씬 쉽습니다 . CPU는 32 비트 또는 64 비트 주소 대신 3 ~ 5 비트 레지스터 번호 만 확인해야만 한 명령의 출력이 다른 작업의 입력으로 바로 필요한 경우를 감지 할 수 있습니다. (그리고 그 레지스터 번호는 기계 코드에 하드 코딩되어 있으므로 즉시 사용할 수 있습니다.)

다른 언급과 마찬가지로 레지스터를 지정하는 데 3 비트 또는 4 비트가 있으면 기계 코드 형식이 훨씬 더 소형이됩니다 모든 명령에 절대 주소가있는 경우보다


https://en.wikipedia.org/wiki/Memory_hierarchy 참조 : 만 지원됩니다 절대 주소 직접 메인 메모리는 별도의 작은 빠른 고정 크기 메모리 공간으로 레지스터 생각할 수 있습니다. (레지스터를 "인덱싱"할 수 없습니다 : 하나의 레지스터에 정수 N이 주어진다면 레지스터의 내용을 하나의 insn으로 얻을 수 없습니다.)

레지스터는 단일 CPU 코어에 대해서도 전용이므로, 따라서 순서에 구애받지 않는 실행은 원하는대로 수행 할 수 있습니다. 메모리를 사용하면 다른 CPU 코어가 어떤 순서로 표시되는지 걱정해야합니다. 레지스터의 고정 된 수를 갖는

는 CPU가 비 순차적 실행을 위해 register-renaming을 수행 할 수 있습니다 무엇의 일부입니다. 명령어가 디코드 될 때 레지스터 번호를 즉시 사용할 수있게하면이 방법이 더 쉬워집니다. 알려진 레지스터에 대한 읽기 또는 쓰기가 결코 없습니다.


메모리 이름은 변경할 수 있지만 실제 CPU에서는 매우 드뭅니다. 현재 x86 CPU는 그렇게하지 않습니다. 같은 레지스터가 자주 독립된 명령에 대해 재사용되기 때문에 이점은 레지스터 이름 바꾸기보다 훨씬 적습니다. 독립적 인 무언가를 위해 동일한 메모리 위치를 재사용하는 것은 더 드뭅니다.

메모리 이름 변경은 이런 경우에 도움이 될 : 작은 버퍼에 뭔가를 쓰고, 다음을 읽고, 당신은 무엇을 읽고에 의존하지 않은 뭔가 다른 물품. 메모리 이름을 바꾸지 않으면 두 번째 쓰기가 첫 번째 읽기가 실행될 때까지 대기해야합니다.