문제

예전에 볼랜드 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 상태와 관련하여 올바르게 동기화되지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top