BX에서 많은 게시물을 봤습니다. 오늘은 “범용 등록”이라고 생각합니다. 사람들이 기본 주소 레지스터라고 부르는 이유가 혼란 스럽습니다.
- 역사적으로 기본 주소 레지스터라고 부르는 이유는 무엇입니까?
- 오늘날에도 여전히 관련이있는 것이 있습니까? ?
- 기본 주소 지정에 사용하도록 예약하는 규칙이 있습니까?
볼 수 있습니다. 여기에서 라고합니다.
댓글
- 생각하면 이것은 ' t 정확히 RC 질문입니다. ' 이전 컴퓨터에 대한 어떤 것도 대상으로하지 않기 때문입니다. 특히 오늘 관련성을 묻는 것이 아니기 때문에이 질문이 더 적합 할 것입니다. SE 메인 사이트에서-그리고 빠른 검색을 통해 변형이 많이 요청되었음을 알 수 있습니다.
- 여기서 핵심은 x86의 레지스터가 " 뿐이라는 것입니다. 다소 일반적인 목적으로 ", 기본 작업에서 이들 중 하나를 사용할 수 있지만 사용할 수있는 레지스터에 제한이있는 상황이있었습니다. se.
- 또 다른 요점은 x86과 관련하여 과거 사용량과 현재 사용량을 비교하는 것이 오해의 소지가 있다는 것입니다 (여기서는“범용 레지스터”에 대한 설명이 실제로 EBX / RBX를 참조한다고 가정합니다. BX보다). 현재 x86은 8086과 역 호환되지만 현대의 x86 어셈블리 언어 프로그래밍은 8086 프로그래밍 (또는 심지어 386 프로그래밍과 비교할 때 매우 다릅니다.) 따라서 BX를 사용한다고해서 EBX / RBX 사용에 대해 많이 언급되는 것은 아닙니다.
Answer
BX는 항상 일반 레지스터 중 하나였으며 항상 기본 레지스터라고 불 렸습니다 (예 : 8086 입문서 , 19 페이지). BX에 주소를 저장하고 SI 또는 DI (각각 소스 및 대상 인덱스 레지스터)에 오프셋을 저장하면 BX + SI 또는 BX에서 메모리에 액세스 할 수있는 다양한 기반 주소 지정 모드에서 사용할 수 있으므로 기본 레지스터입니다. + DI ( ibid , 31 페이지) 또는 BX + SI + 즉시 또는 BX + 즉시 . 또한 XLAT
의 기반 역할도합니다.
BP는 유사하며 위의 모든 주소 지정 모드를 지원합니다. BX와 BP의 차이점은 BX는 기본적으로 데이터 세그먼트 (DS)를 사용하는 반면 BP는 기본적으로 스택 세그먼트 (SS)를 사용한다는 것입니다. (BX 및 BP에는 각각 고유 한 지침이 있습니다. 예 XLAT
는 BX, ENTER
및 LEAVE
BP를 사용합니다.)
이러한 주소 지정 모드는 오늘날에도 여전히 존재하므로 사용은 여전히 관련이 있지만 색인이 생성되고 간접 주소 지정 32 비트 x86으로 시작하는 모든 일반, 포인터 또는 인덱스 레지스터에서 사용할 수 있습니다 . BX 및 BP는 16 비트 x86에서 “특별”하지만 간접 또는 인덱싱 된 주소 지정이 가능한 유일한 레지스터라는 점에서 32 비트 또는 64 비트 x86에서는 더 이상 그렇지 않으므로 EBX, EBP, RBX , RBP는 그렇게 특별하지 않습니다. (BP, EBP 및 RBP는 16 비트 및 32 비트 모드에서 기본 레지스터로 SS를 선택하고 오프셋없이 포인터로 사용할 수 없기 때문에 여전히 다소 특별합니다. 즉 MOV AX, [BP]
및 MOV AX, [BP+0]
에 대한 opcode가 대신 사용됩니다.)
내가 알고있는 규칙이 없습니다. 기본 주소 지정을 위해 BX 사용을 특별히 예약합니다. 기본 주소 지정에 사용해야하는 경우 적절하게 설정하고 사용합니다. 사용중인 호출 규칙에서 BX를 보존해야하는 경우이를 고려해야합니다 (작성중인 규칙 및 코드에 따라 호출자 또는 호출 수신자로).
설명
- +2 (XLAT / ENTER / LEAVE 추가)
답변
(이것은 Stephen Kitts 답변에 추가 된 것입니다.)
역사적으로 Base Address 레지스터라고 불리는 이유
글쎄요. 모든 경우에는 모든 인덱스 주소 지정에서 “Base”로 추가 할 수있는 유일한 레지스터 주소를 지정하는 원래 16 비트에 있었기 때문에 “Base Index”(또는 더 나은 Index Base)가됩니다. SI
또는 DI
로 인덱싱되었습니다. (* 1)
이 주소는 기본 포인터로 BP
와 대칭입니다. 기본 아이디어는 어레이가 BX로 가리키고 SI
또는 DI
를 통해 주소를 지정할 수 있다는 것입니다. 스택 (* 2)
게다가 원래의 범용 2 바이트 레지스터 중 하나입니다.
오늘날에도 여전히 관련이 있습니까?
정말 아닙니다. 적어도 32/64 비트 모드에서는 아닙니다.REX
주소 지정을 통해 32 비트 모드에서 모든 “클래식”레지스터를 (인덱스)베이스로 사용할 수 있습니다 (BP
/ SP
(* 3). 64 비트 모드에서는 16 개 레지스터 중 12 개를 동일한 방식으로 사용할 수 있습니다 (BP
/ SP
/ / R13
(* 4)).
이제 16 비트 보호 모드 코드 세그먼트가있는 “Long”모드가 함께 제공됩니다. . 여기서 고전적인 (16 비트) 인코딩은 32/64 비트 레지스터 크기와 함께 사용됩니다. BX
는 SIB
가 필요하지 않기 때문에 인코딩 이점을 유지합니다. 이 다소 잊혀진 모드가 얼마나 관련이 있는지는 논의 중입니다.
기본 주소 지정을 위해 사용을 예약하는 규칙이 있습니까?
정말 아닙니다. 필요에 따라 사용하십시오. 결국, 이것은 어셈블리입니다. 원하지 않는 규칙은 없습니다. :))
유일한 문제는 호출자를 위해이를 보존하는 것입니다 (명시 적으로 수행되지 않은 경우)
여기에서 이름을 확인할 수 있습니다.
Err … 그가 틀린 것은 아니지만 x86 (Check Wiki (books) 또는 OSDEV-Wiki )에 대해 자세히 알아 보려면 더 자세한 설명을 찾는 것이 좋습니다. 또는 고전적인 (16 비트) x86 프로그래밍에 대한 구체적인 내용이라면 읽어야 할 책은 Steve Morse “ 8086 Primer 뿐입니다. 32/64 비트는 어쨌든 다르며 특별한 경우에 특별한 경우의 배낭 대신 실제로 유용하려면 이러한 고전적인 가정없이 배워야합니다.
* 1-니모닉을 할당하려는 경우 4 개의 기본 2 바이트 레지스터에 이름을 지정합니다.
- AX = A ccumulator . A 산술 (또는 A lways 가장 짧은 인코딩)
- BX = B ase. 데이터 (구조)에 대한 포인터로 사용됩니다.
- CX = C ounter. 시프트 / 회전, 문자열 연산 및 루프에 사용됩니다.
- DX = D ata. 산술 및 I / O에 사용됩니다.
* 2- “표준”프로그래밍의 경우 BP
가 스택 프레임을 유지합니다. 따라서 여기서 색인은 BP가 일시적으로 이동하지 않는 한 항상 해당 프레임의 색인입니다.
* 3-SP
는 인코딩.
* 4-SP
/ R12
다시 SIB
인코딩.
댓글
-
REX addressing allows [using any register in 32-bit mode]
-이것을 찾으 셨나요? 여기 SIB? - @ilkkachu Nop. 적어도 내가 기억하는 한. REX는 모든 레지스터에 r / m 모드를 사용할 수 있습니다. SIB는 SP 및 R12에만 필요합니다. 물론 스케일링을 사용하고 싶다면 … 아니면 내가 망쳐 놓았습니까? 다시 확인해야합니다.
- 음. 32 비트 모드에서 모든 레지스터를 포인터로 사용할 수 있으므로 ' ' REX가 될 수 없습니다. 실제로 32 비트 모드에서는 modr / m 바이트만으로도 단일 레지스터를 주소로 사용하기에 충분하며이 경우 SIB가 필요하지 않습니다 (ESP 제외). wiki.osdev.org/ …
- @ilkkachu Jup,하지만 당신은 '도 맞습니다. 레지스터를베이스로 함께 인덱스로 다른 레지스터를 사용하려면 SIB가 필요합니다. 이것을 다시 확인하고 내 대답을 수정하겠습니다. 그래요?
답변
BX는 가장 오래된 색인 레지스터입니다. 일반적으로 구조체의 요소는 [BX + constant]
에 의해 액세스됩니다. 따라서 그 이름 (또는 이름이 [BX + SI]
에서 따온 것일 수 있습니다. 왼쪽에는 BX 또는 BP 만 사용할 수 있고 오른쪽에는 SI 및 DI 만 사용할 수 있습니다).
특정 명령어 (mul / div / shl / shr)에 의해 차단되지 않는 가장 낮은 레지스터를 제외하고는 ebx / rbx에 대한 특정 정보를 찾을 수 없으므로 포인터.
반면, [esp + offset]은 [ebp + offset]보다 긴 명령어이므로 프레임 포인터 제거가 항상 짧은 코드를 생성하지는 않습니다.
Comments
- 32 비트 opcode가 더 짧아지는 것이 확실합니까? 16 비트 모드에서는 BX / BP, SI / DI 및 8 비트 또는 16 비트 변위 조합에 대한 명시 적 인코딩이 있으며 다른 변형은 인코딩 할 수 없습니다. 32 비트 모드에서는 일반 레지스터 인코딩 (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI)이 사용됩니다. 단, 100b (일반적으로 ESP)는 SIB 바이트를 나타내는 데 사용되며 101b (일반적으로 EBP)는 ) 변위 없음은 32 비트 오프셋을 나타내는 데 사용됩니다.
MOV EAX, [EBX+9]
는MOV EAX, [ECX+9]
처럼 3 바이트를 사용합니다. 추가 레지스터를 사용하려면 4 바이트가 필요합니다. - @StephenKitt : 정정했습니다. 실제로 더 긴 유일한 것은 [esp + x]