문제

이 아키텍처에서 어셈블리를 위한 새 레지스터의 이름을 어디서 찾을 수 있습니까?

나는 EAX, ESP, EBX 등과 같은 X86의 레지스터를 언급하고 있습니다.하지만 64비트로 하고 싶습니다.

나는 C 코드를 분해할 때 e 대신 r을 얻는 것과 같지 않다고 생각합니다.

도움이 되었습니까?

해결책

기존 32비트 레지스터가 64비트로 확장되었습니다. r 레지스터(rax, rbx, rsp 등등).

또한 몇 가지 추가 범용 레지스터가 있습니다. r8 ~을 통해 r15 (예를 들어) r8d, r8w 그리고 r8b (하위 32비트 더블 워드, 16비트 워드, 8비트 바이트 각각).그만큼 b 접미사는 원래 AMD 명명법이지만 때로는 다음과 같이 쓰여진 것을 볼 수 있습니다. l (소문자 L) "낮은 바이트"의 경우.

나는 ~을 선호하는 경향이 있다 b 접미사 나 자신(현재 낮은 바이트 레지스터가 al, bl, 등)과 일치하므로 d/w = double/word 이름과 l 잠재적으로 오해받을 수도 있다 long.아니면 더 나쁘게도 숫자는 1, 도대체 등록 번호가 무엇인지 질문하게 됩니다. 81 이다 :-)

이전 16비트 레지스터의 상위 바이트는 다음과 같은 여러 상황에서 계속 액세스할 수 있습니다. ah, bh, 등(신규 버전에서는 그렇지 않은 것으로 보임) r8 ~을 통해 r15 레지스터).새로운 것도 있어요 명령어 인코딩, 특히 다음을 사용하는 사람들은 REX 접두사는 원래의 높은 바이트에 액세스할 수 없지만 다른 사람들은 여전히 ​​이를 자유롭게 사용할 수 있습니다.

또한 몇 가지 새로운 SSE 레지스터가 있습니다. xmm8 그렇지만 xmm15.

그만큼 eip 그리고 eflags 레지스터도 다음으로 확장되었습니다. rip 그리고 rflags(하지만 상위 32비트는 rflags 현재로서는 아직 사용되지 않습니다.)

참조 위키피디아 페이지 그리고 MSDN 상세 사항은.

이것이 지원되는지 여부 asm 특정 C 컴파일러에 대한 키워드는 말할 수 없습니다.내가 하는 작은 어셈블리(그리고 1년에 하루 정도가 되고 있음)는 C가 아닌 어셈블리에서 수행됩니다.


관련된:

다른 팁

그만큼 MSDN 문서 X64 레지스터에 대한 정보가 포함되어 있습니다.

X64는 X64의 8 개의 일반 목적 레지스터를 64 비트로 연장하고 8 개의 새로운 64 비트 레지스터를 추가합니다. 64 비트 레지스터는 "R"로 시작하는 이름이 있으므로 예를 들어 EAX의 64 비트 확장을 RAX라고합니다. 새로운 레지스터의 이름은 R8에서 R15로 지정되었습니다.

각 레지스터의 더 낮은 32 비트, 16 비트 및 8 비트는 피연산자에서 직접 해결할 수 있습니다. 여기에는 ESI와 같은 레지스터가 포함되어 있으며 8 비트가 낮은 비트가 이전에 주소 지정되지 않았습니다. 다음 표는 64 비트 레지스터의 하단 부분에 대한 어셈블리 언어 이름을 지정합니다.

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits
==============================================================
rax             | eax           | ax            | al
rbx             | ebx           | bx            | bl
rcx             | ecx           | cx            | cl
rdx             | edx           | dx            | dl
rsi             | esi           | si            | sil
rdi             | edi           | di            | dil
rbp             | ebp           | bp            | bpl
rsp             | esp           | sp            | spl
r8              | r8d           | r8w           | r8b
r9              | r9d           | r9w           | r9b
r10             | r10d          | r10w          | r10b
r11             | r11d          | r11w          | r11b
r12             | r12d          | r12w          | r12b
r13             | r13d          | r13w          | r13b
r14             | r14d          | r14w          | r14b
r15             | r15d          | r15w          | r15b

X64는 32 비트 범용 레지스터를 다음과 같이 확장합니다.

EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP

X64는 또한 다음 64 비트 범용 레지스터를 추가합니다.

R8, R9, R10, R11, R12, R13, R14, R15

또한 SSE는 X64 사양의 일부이므로 XMM0-XMM15 벡터 레지스터도 사용할 수 있습니다.

아키텍처에 대한 몇 가지 기본 정보를 찾을 수 있습니다. Wikipedia/x86-64 또는 인텔의 웹 사이트로 이동하십시오.

인텔 매뉴얼을 읽어 봅시다

이 아키텍처에서 조립에 대한 새로운 레지스터의 이름을 어디서 찾을 수 있습니까?

프로세서 매뉴얼 "Intel 64 및 IA-32 Architectures 소프트웨어 개발자의 매뉴얼 볼륨 1 : 기본 아키텍처", 예 : 버전 253665-053US:

  • "레지스터"검색
  • 첫 번째 일치는 "3.4 기본 프로그램 실행 레지스터"인덱스입니다.
  • 아래 두 항목 아래 "3.4.1.1 일반 목적 등록 64 비트 모드"

그 섹션에서 :

RAX, RBX, RCX, RDX, RDI, RSI, RBP, R8-R15 (64 비트 피연산자 크기가 지정된 경우 사용할 수 있습니다. R8D-R 15D/R8-R15는 8 개의 새로운 일반 목적 레지스터를 나타냅니다.

알림 : 64 비트 모드는 x86-64의 "일반"모드입니다. 다른 기본 모드는 IA32를 모방하는 "호환성 모드"입니다.

TOC에서 "등록"을 계속 검색하면 부동 소수점에 대한 "숫자 크러싱"레지스터 및 매뉴얼에 Simd가 흩어져있는 섹션을 찾을 수 있습니다.

  • 8.1.2 -x87 FPU 데이터 레지스터 (STX)
  • 9.9.2 -MMX 레지스터
  • 10.2.2 -xmm 레지스터
  • 14.1.1-256 비트 와이드 SIMD 레지스터 지원 (YMM)

다양한 부작용이 있고 이러한 효과를 원하지 않는 한 (그리고 종종 종종 링 0이 필요합니다). 이들은 "Volume 3 시스템 프로그래밍 안내서 -2.1.6 시스템 레지스터"에 요약되어 있으며 OS 개발자에게 더 많은 것입니다.

좋은 경험적 접근법은 달리는 것입니다 info all-registers GDB에서 : GDB에서 레지스터 값을 인쇄하는 방법은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top