2014-04-29 1 views
15

인텔 64 아키텍처에는 단순히 A..D 범용 레지스터 인 rax..rdx 레지스터가 있습니다.인텔 64, rsi 및 rdi 레지스터

그러나 또한 "소스 인덱스"와 "대상 인덱스"레지스터입니다라고 RSI와 RDI가 등록되어있다. 왜이 레지스터들은 실제 이름을 가지고 있습니까 (A와 비교했을까요?)?
"원본 색인"과 "대상 색인"은 실제로 무엇을 의미합니까? 그리고 특정 조건에서이 레지스터를 사용해야한다는 규정이 있습니까? 세그먼트 화 메모리를 가진 16 비트 시스템의 시간에 (DestinationIndex ExtraSegment) ES:DI에 :

+13

또한 그 A..D뿐만 아니라 이름을 가지고주의 (배터리, 일반적인 사용을 반영하는 자료, 카운터, 데이터). – Jester

+0

@Jester, 아, 고맙습니다. 우리는 A, B, C 및 D라고 가정 했으므로 결코 말한 적이 없습니다. –

+0

D는 "제수"를 의미하지 않습니까? –

답변

10

이러한 레지스터는 원래 암시 DS:SI (SourceIndex DataSegment)로부터 1 바이트를 복사 인스턴스 MOVSB위한 반복 지시에 사용 된 리얼 모드. 또한 [bx + si]과 같은 16 비트 주소 지정 모드의 인덱스 레지스터로도 사용됩니다.

은 지금, 이들 레지스터는, 예를 들면 지금까지 원래의 목적에서, UNIX's x86_64 ABI 처음 두 (정수) 함수 파라미터를 전송하는데 사용된다. (What are the calling conventions for UNIX & Linux system calls on i386 and x86-64 참조)

새로운 rXX 64 비트 레지스터의 이름은 이전 레지스터 이름이 친숙하고 이전 버전과 호환 될 수 있음을 분명히 보여줍니다. (그러나 일부 명령어는 여전히 일부 레지스터에서만 작동합니다. 예를 들어 rep movsbmemcpy(rdi, rsi, rcx)으로 작동하고 x86-64 System V ABI에서는 is in fact why RDI and RSI were chosen as the first 2 arg-passing registers으로 작동합니다 : 일부 함수는 memset 또는 memcpy을 첫 번째 1 또는 2 인수와 함께 호출하므로 인라이닝됩니다 rep movsb/d 그 경우 저렴합니다.)

+0

우리가 제공 한 호출 규칙에 따르면 매개 변수가 스택에 푸시된다고합니다? –

+0

OS와 프로세서에 따라 다릅니다. 적어도 GNU/Linux x64 및 OS X x64에서는 내가 제공 한 호출 규칙이 중요합니다. 그러나 말했듯이 Linux는 x86-32에서 스택 패싱을 사용했습니다. – delehef

+0

'rdi'와'rsi'는 여전히 x86-64의''rep movsb' (https://github.com/HJLebbink/asm-dude/wiki/REP_REPE_REPZ_REPNE_REPNZ)에 의해 암묵적으로 사용됩니다. 명령어는 여전히 존재하며, 어떤 경우에는 'memcpy'를 구현하는 데 실제로 유용합니다. https://stackoverflow.com/questions/43343231/enhanced-rep-movsb-for-memcpy –