2017-04-02 4 views
0

VS2015 C++을 사용하는 x64 인라인 어셈블리에서 메모리 인덱싱에 rsprbp 레지스터를 사용합니다. 저장하지 않고 복원 할 수 있습니까 push rsp, push rbp, ... pop rbp, pop rsp?인텔 x64 C++ 인라인 어셈블리 대 2015

__asm{ 

mov rsi, memory 
mov rsp, rsi 
mov rbp, rsi 
... 
movntps [rsp+rdx], ymm0 
... 

} 

디버깅 모드에서 mov rbp, rsi 다음에 메모리의 기본 주소가 변경됩니다. 이것도 문제가되지 않습니까?

+2

이 코드가 vs2015에서 어떻게 컴파일되었는지는 알 수 없습니다. 이것은 64 비트 코드입니다 (레지스터 이름이 'r'로 시작하기 때문에). vs2015는 인라인 asm 사용을 지원하지 않습니다. 아마도 당신은'esi','esp' 등을 의미했을까요? –

답변

0

인라인 어셈블리를 작성할 때 사용할 수있는 레지스터에 대한 컴파일러의 규칙을 준수해야합니다. VS2015's rules are documented here 나는 키 비트 인용합니다 :

C/C++ 함수의 어셈블리 언어를 작성하는 __asm를 사용하여, 당신은 EAX, EBX, ECX, EDX, ESI, 또는 EDI 레지스터를 보존 할 필요가 없습니다합니다. .. __asm 블록의 범위에 대해 사용하는 다른 레지스터 (예 : DS, SS, SP, BP 및 플래그 레지스터)를 보존해야합니다.

"should"를 "must"로 읽습니다. 질문에 대한 좁은 대답은 "아니요, ESP와 EBP를 저장하고 복원해야합니다. 어떤 용도로든 사용하고 싶습니다."

라인 사이를 읽으면 실제로 원하는 것은 어셈블리 언어로 전체 함수를 작성하는 것입니다. Visual Studio에서는 별도의 .ASM 파일에 넣을 것입니다. calling convention을 준수해야하지만 컴파일러의 __asm 블록에 대한 더 엄격한 규칙은 준수하지 않아야합니다. 호출 규칙에 따라 ESP와 EBP (사실 EAX, ECX, EDX를 제외한 모든 레지스터)를 저장하고 복원해야합니다.

실제로 x64/Windows를 코딩하는 경우이 설명서를 올바르게 읽는다면 을 사용할 수 없습니다. __asm을 사용하십시오. 별도의 .ASM 파일을 사용해야합니다. 그리고 호출 규칙은 다릅니다.