2014-09-24 5 views
0

내가, 내가 몇 가지 알고리즘과 범용 레지스터의 양을 만들고있어 어셈블러 프로그래밍에 저를 시작하고있어 그IA32-86를 사용하여 특수 목적 레지스터는 어떤 방법이 있나요

에 충분하지 않습니다 등록 asm에서 범용 레지스터로 특수 레지스터 (eip, eflags)를 사용 하시겠습니까?

몇 가지 작업에만 필요하지만 모든 일반 레지스터가 이미 사용 중이므로 알고리즘의 성능을 저하시키는 값을 메모리에 저장하지 않습니다.

가능합니까?

+3

'jmp 값 '을 써서'eip'에 쓸 수 있습니다. 그리고 당신은'call foo; foo : pop eax;'하지만 처음에는 원치 않는 부작용이있을 것입니다. :) 간단히 말해, 다른 어떤 목적으로도'eip'와'eflags'를 사용할 수 없습니다. (그리고 대부분의 산술 명령어는 암시 적으로'eflags'에 쓸 것입니다.) – Mysticial

+2

실용적인 방법으로 의도 된 목적 이외의 목적으로 레지스터를 사용할 수는 없습니다.어셈블러를 처음 사용하는 경우 레지스터 압박을 최소화하기 위해 코드를 구성하는 방법을 아직 모를 것입니다. 그리고 어떤 곳에서는 특정 알고리즘의 요구 사항에 걸림돌이됩니다. 일반적으로 코드를주의 깊게 작성하면 코드가 대부분 충분히 빠르게 실행됩니다. 합리적으로 코드를 작성한 다음 실행하십시오. * 너무 느린지 걱정하십시오. –

+0

'ah'의 일부 비트를'ehlags'에'sahf'로 저장할 수 있고'lhf'로'ah'에 적재 할 수 있습니다. 'popf'로 플래그에 데이터를 저장할 수도 있지만, 이로 인해 원하지 않는 부작용이 생길 수 있습니다. 그리고 리얼 모드 코드 (레거시 또는 부트 로더)에서는'cli '로 인터럽트를 차단 한 다음 어딘가에'esp'를 저장하고,'esp'를 범용 레지스터로 사용하고,'esp'의 원래 값을로드하고 'sti'. 'eip '를 사용하여 예를 들어 어떤 데이터를 저장할 수 있습니다. 사용 된 모든 값 (점프 대상)에 유효한 코드가있는 경우'jmp eax' /'call eax'를 사용하십시오. 어쨌든, 실용적인 목적으로, Ira Baxter의 조언을 따르는 것이 좋습니다. – nrz

답변

0

짧은 대답은 아니오입니다.

eip을 범용 레지스터로 사용하는 경우 eip에 "쓰기"하는 것처럼 불가능합니다. 프로그램이 해당 주소 (대략)에서 실행 지침으로 건너 뜁니다. EFLAGS는 EFLAGS에 관해서는, 당신이 바꾸고 싶지 않은 여러가지 것들을 예약하거나 제어 할 수있는 비트를 가지고 있습니다. 다시 말하자면, 그것은 범용 레지스터로서 작동하지 않을 것입니다. 값을 유지하기 위해 메모리를 사용하지 않으려 고하는 것처럼 보이기 때문에 esp와 ebp를 사용할 수 있습니다 (스택을 사용하는 경우 모두주의하십시오). 그 외에도, 내가 사용하는 것으로 생각할 수있는 대부분의 레지스터는 권한 수준 0을 사용하여 다시 쓰기를 요구하며, 범용 레지스터로 사용할 경우 부정적인 결과를 초래할 가능성이 매우 높습니다.

프로세서에 따라 매우 특수한 레지스터가있을 수 있지만 프로세서를 사용하려면 코드를 프로세서간에 이식 할 수 없습니다.

+0

리얼 모드 및 가상 모드에서 세그먼트 레지스터 (DS, ES, FS 및 GS 및 SP - 미사용 된 경우 SS)가 일반 데이터를 저장하는 데 사용될 수도 있습니다. 그러나 이러한 레지스터로 수행 할 수있는 연산은 매우 제한적입니다. –

2

이미 사용 가능한 범용 레지스터를 신중하게 재사용하는 것이 가장 좋습니다. 알고리즘에 대해 매우 신중히 생각하십시오.

EIP를 Repurposing하는 것은 불가능하며 가능하다면 EFLAGS를 사용하면 일반적으로 너무 많은 부작용이있어 일반적으로 유용합니다.

메모리를 사용하여 실제로 알고리즘 시간을 확인하는 것이 좋습니다. 캐싱으로 인해 액세스가 느려지지 않을 수도 있습니다.

또 다른 옵션은 수치 연산 보조 프로세서의 레지스터를 저장소의 작은 개인 스택으로 사용하는 것입니다.하지만 메모리를 단순히 사용하는 것보다 만족스럽지 않을 수도 있습니다.

2

짧은 대답 : 아니오.이 레지스터는 명시 적으로 쓰여지지 않습니다.

알고리즘을 다시 작성하거나 레지스터를 잘 할당하거나 메모리에 지능적으로 spilling/reloading 레지스터를 처리하여 성능에 미치는 영향을 최소화하거나 가능한 경우 XMM 레지스터를 사용하여 INT 레지스터를 /에서 이동 시키거나 XMM 측에서 모든 지시 사항을 따르십시오. 또 다른 옵션은 64 비트를 사용하여 사용 가능한 추가 레지스터를 활용하는 것입니다.

0

나는 데이터 저장을 위해 dr0에 dr0 디버그 레지스터를 사용했다는 것을 기억합니다. 그러나 나는 그들이 얼마나 빨리 사용해야하는지 확신하지 못한다. 어쩌면 CPU 내부에서 이름을 바꾸는 레지스터가 마이크로 op를 만들기 위해 성능을 발휘할 수도 있습니다.