programing

어셈블리 코드를 C에 삽입하는 방법이 있습니까?

nicescript 2021. 1. 15. 07:52
반응형

어셈블리 코드를 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 ;
}

x86이 아닌 Microsoft 컴파일러는 인라인 어셈블리를 지원하지 않습니다. 전체 함수를 별도의 어셈블리 소스 파일에 정의하고 어셈블러에 전달해야합니다.

보호 모드 운영 체제에서 BIOS를 호출 할 가능성은 거의 없으며 해당 시스템에서 사용할 수있는 모든 기능을 사용해야합니다. 커널 모드에 있더라도 안전하지 않을 수 있습니다. 그렇게하면 BIOS가 OS 상태와 관련하여 올바르게 동기화되지 않을 수 있습니다.

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

반응형