인라인 어셈블리가 엉망인 이유에 대해 생각해 봅니다. 이식 할 수 없으며 아키텍처 간에는 물론 컴파일러마다 서로 다른 호환되지 않는 구문이있을 수 있습니다. 외부 어셈블리 파일을 작성하고 그런 식으로해야 할 일을하십시오. 어셈블리 루틴에 매개 변수를 전달하는 것은 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);
}
, I 번역은'assert (0)'이라고 말합니다. – avakar
int 3h는 예제 일뿐입니다. 나는 또한 다른 int, 주로 int 15h 있습니다. – Eldad