source

조립 코드를 C에 삽입할 수 있는 방법이 있나요?

factcode 2022. 8. 17. 23:44
반응형

조립 코드를 C에 삽입할 수 있는 방법이 있나요?

옛날에는 오래된 볼랜드 DOS 컴파일러로 다음과 같은 작업을 할 수 있었던 것으로 기억합니다.

asm {
 mov ax,ex
 etc etc...
}

현재 준플랫폼에 의존하지 않는 방법이 있습니까?BIOS를 호출할 필요가 있기 때문에 ASM 코드를 사용하지 않고 할 수 있는 방법이 있다면 마찬가지로 도움이 될 것입니다.

GCC 사용

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

VC++ 사용

__asm {
  mov eax, edx
  add eax, 2
}

GCC에는 그 이상의 것이 있습니다.명령어에서는 컴파일러의 옵티마이저가 망치지 않도록 무엇이 변경되었는지 컴파일러에 알려야 합니다.난 전문가는 아니지만 가끔은 이렇게 보이기도 해

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

샘플 코드를 C로 작성하고 GCC에 어셈블리 리스트를 작성하도록 의뢰한 후 코드를 수정하는 것이 좋습니다.

C/C++의 인라인어셈블리에 대해 설명하는 다음 기사를 읽는 것이 좋습니다.

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

기사의 예:

#include <stdio.h>


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

Microsoft 컴파일러의 경우 인라인 어셈블리는 x86에서만 지원됩니다.다른 타겟의 경우 전체 함수를 별도의 어셈블리소스 파일에 정의하고 어셈블러에 전달하여 결과 객체 모듈을 링크해야 합니다.

보호 모드 운영 체제에서는 BIOS를 호출할 수 없기 때문에 해당 시스템에서 사용할 수 있는 모든 기능을 사용해야 합니다.커널 모드라도 안전하지 않을 수 있습니다.BIOS가 OS 상태에 대해 올바르게 동기화되지 않을 수 있습니다.

의 사용.asm또는__asm__function (컴파일러에서는 차이가 있습니다)

또한 포트란 코드를 작성할 수 있습니다.fortran기능.

asm("syscall");
fortran("Print *,"J");

언급URL : https://stackoverflow.com/questions/61341/is-there-a-way-to-insert-assembly-code-into-c

반응형