2012-09-01 2 views
2

일부 x86_64 어셈블리를 작성하여 C 함수를 호출합니다. 내 C 함수는 1 개의 인수를 취하므로 어셈블리에서는 인수를 %rdi에 배치합니다. 아래에 링크 된 ABI pdf는 다른 6 개의 인자 레지스터 (rsi, rdx, rcx, r8, r9)가 함수 호출을 통해 보존되지 않는다고 말합니다. 그러나 내 C 함수는 하나의 long 인수 만 취하므로 C 함수가 다른 5 개의 레지스터를 손상 시킬지에 대한 보증이 있습니까? 내 가정은 인수의 값이 변경 될 경우 인수 레지스터는 사방에서 공격하는 것이 었습니다 :x86_64 어셈블리 규칙 저장 인수 레지스터

void foo(int a, int b) { 
    a++; /* %rdi will be changed, but %rsi won't be changed when control returns. */ 
} 

내 C 함수 호출에서 다른 5 개 인수 레지스터의 값을 유지하고 싶습니다 때문에 내가 부탁 해요 (없이 명시 적으로 스택에서 수동으로 푸시/팝해야 함).

x86_64의 ABI는 - http://www.x86-64.org/documentation/abi-0.99.pdf

답변

7

보장이 없다. 변경되지 않았 으면 스택에 저장해야합니다. 변경 여부는 컴파일러에 따라 다릅니다.

어떻게 든 변경되지 않도록하려면 어셈블리에서 함수를 작성할 수 있습니다.

+0

호출중인 함수의 작동이 보장되지는 않습니다. 그러나 우리는 그것이 ABI의 요점이라는 가정을 할 수 있어야합니다. –

4

21 페이지의 표를보십시오.이 레지스터에는 모든 레지스터에 대해 "Preserved Yes/No"열이 있습니다. 그리고 매개 변수를 전달하는 데 사용되는 모든 레지스터에 대해 "아니오"라고 표시됩니다.

인수를 전달하는지 여부에 관계없이 인수 레지스터는 보존 할 필요가 없습니다. 아마도 매개 변수를 다시 얻지 못할 것입니다.