2009-10-12 3 views
6

내 C 코드로 작성된 작은 인라인 어셈블리 코드가 있습니다. asm은 배열을 거치며 필요한 경우 다른 배열의 값을 레지스터로 이동합니다. 결국 인터럽트가 호출됩니다. 코드는 다음과 유사합니다x64를 지원하도록 인라인 어셈블리 번역

cmp arrPointer[2],1h 
jne EXIT 
mov AX, shortArrPtr[2] 
EXIT: 
int 3h 

마이크로 소프트에 따르면이 모든 86에서 작동하지만 : 64 인라인 어셈블리를 지원하지 않습니다. x64를 지원하기 위해 어떻게 변환 할 수 있습니까? 필자가 원하는 것을 실행하기 위해 컴파일러 내장 프로 시저를 찾을 수 없으며 어떻게 매개 변수를 외부 asm 파일에 전달할 수 있는지 알 수 없습니다.

+0

, I 번역은'assert (0)'이라고 말합니다. – avakar

+0

int 3h는 예제 일뿐입니다. 나는 또한 다른 int, 주로 int 15h 있습니다. – Eldad

답변

6

인라인 어셈블리가 엉망인 이유에 대해 생각해 봅니다. 이식 할 수 없으며 아키텍처 간에는 물론 컴파일러마다 서로 다른 호환되지 않는 구문이있을 수 있습니다. 외부 어셈블리 파일을 작성하고 그런 식으로해야 할 일을하십시오. 어셈블리 루틴에 매개 변수를 전달하는 것은 C 함수에 전달하는 것과 완전히 동일합니다. 그냥 앞으로 함수 선언을 어딘가에 선언하면 호출 코드 (C로)가 올바른 일을 할 것이다. 그런 다음 외부 어셈블리 파일에 루틴을 구현하고 (호출 규칙을 따르십시오) 링커가 모든 것을 올바르게 묶을 수 있도록 적절한 심볼을 내 보냅니다. Presto - 조립 작업!

요청시 예입니다. 나는 이것을 어떤 식 으로든 컴파일하거나 테스트하려고하지 않았으므로 100 %가 아닐 수도 있습니다. 행운을 빕니다.

myHeader.h :

void *someOperation(void *parameter1, int parameter2); 

myAssemblyFile.s :

.text 
.globl someOperation 

someOperation: 
    add %rdx, %rcx 
    mov %rcx, %rax 
    ret 

.end 

mySourceCode.c :

INT의 3h` 디버거로 이동하는 데 사용되는`때문에
#include "myHeader.h" 

void someFunction(void) 
{ 
    void *arg1 = (void *)0x80001000; 
    int arg2 = 12; 
    void *returnValue; 

    printf("Calling with %x %x\n", arg1, arg2); 

    // call assembly function 
    returnValue = someOperation(arg1, arg2); 

    printf("Returned: %x\n", returnValue); 
} 
+0

아직 어셈블리에 익숙하지 않습니다. 코드 좀 줄 수있어? [내 C 함수가 다음과 같을 경우 : assembleThingy (shortArr [], char byteArr)] – Eldad

+0

어셈블러 구문에 거의 의존한다고 생각합니다. –

+0

그것은 내 어셈블러 구문에 따라 다르지만, 나에게 좋은 시작을 주었다. 감사! – Eldad