어셈블리 코드를 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
'programing' 카테고리의 다른 글
ASP.NET MVC 5의 HttpException에 해당하는 ASP.NET Core (0) | 2021.01.15 |
---|---|
tf.nn.conv2d 대 tf.layers.conv2d (0) | 2021.01.15 |
SQL Server Compact의 제한 사항은 무엇입니까? (0) | 2021.01.15 |
Java의 선언적 GUI 프로그래밍에 대한 제안 (0) | 2021.01.15 |
Nokogiri로 노드를 제거하려면 어떻게해야합니까? (0) | 2021.01.15 |