새로운 X86_64 프로세서 레지스터의 이름은 무엇입니까?
-
20-09-2019 - |
문제
이 아키텍처에서 어셈블리를 위한 새 레지스터의 이름을 어디서 찾을 수 있습니까?
나는 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
현재로서는 아직 사용되지 않습니다.)
이것이 지원되는지 여부 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에서 레지스터 값을 인쇄하는 방법은 무엇입니까?