인라인 어셈블리 예제

GCC는 항상 입력 된 나산 (변경 되지 않은) 읽기 전용 가정 합니다. 입력 된 나연산자 기록 될 때 할 올바른 일은 출력으로 나열 하는 것입니다., 하지만 이 시간 때문에 방정식 기호를 사용 하지 않고 원래 값 문제. 다음은 시스템 호출: 상위 수준 언어에는 임의의 시스템 호출을 수행할 수 있는 직접 기능이 거의 없으므로 어셈블리 코드가 사용됩니다. rsi 값을 mov 명령으로 변환할 수 있습니까? 우리는 정확한 값을 모르기 때문에 이것은 까다롭습니다. rsi의 값은 쓸 두 번째 인수이며 쓸 바이트에 대한 포인터입니다. 그래서 rsi는 정적 할당 된 문자열 “안녕하세요, 세계!n”에 대한 포인터를 부여해야합니다. 어셈블리 코드에 해당 포인터 값을 얻으려면 어떻게해야합니까? 이렇게하려면, 우리는 “확장 asm”로 전환해야합니다, 나는 또 다른 시간을 다룰 것이다 더 진보 된 기능. 위의 예에서, “val”은 출력 진연이며, %0으로 지칭된다. 및 “아니오”는 입력 된 나연, %1에 의해 참조 됩니다. “r”은 난산에 대한 제약조건이며, 이는 GCC에 난산자를 저장하기 위한 임의의 레지스터를 사용하라고 말한다.

다음은 FPU(부동 점 단위) 명령 집합을 사용하는 몇 가지 예입니다. __asm 인라인 어셈블리 문의 일반적인 형태는 어셈블리 코드를 사용하여 “b”에서 “a”의 값을 복사하여 어셈블리 코드의 일부 C 변수를 효과적으로 사용하는 것입니다. 축! 다음은 GCC를 사용하는 대부분의 OS 개발자에게 유용할 정도로 일반적인 인라인 어셈블리 함수 모음입니다. 다른 컴파일러에는 본질적인 대안이 있을 수 있습니다(참조 참조 참조). 이러한 함수가 C 언어에 대한 GNU 확장을 사용하여 구현되는 방법과 GNU 확장을 사용하지 않도록 설정하면 특정 키워드로 인해 문제가 발생할 수 있습니다. 대신 __asm__와 같은 예약된 네임스페이스에서 대체 키워드를 사용하는 경우 asm과 같은 비활성화된 키워드를 계속 사용할 수 있습니다. 인라인 어셈블리를 올바르게 가져오는 데 주의: 컴파일러는 어셈블리가 방출되는 어셈블리를 이해하지 못하며 컴파일러에 거짓말을 하면 드문 불쾌한 버그가 발생할 수 있습니다. 동일한 __asm 문 내에 여러 명령을 작성할 수 있습니다. 이 예제에서는 Armv8-M 기본 선 아키텍처에 대해 하나의 __asm 문으로 작성된 인터럽트 처리기를 보여 주며 있습니다. 예를 들어 CPU를 중지하려면 다음 명령을 사용해야합니다.

입력 된 나산자 출력 나연과 동일한 구문을 사용 합니다. 이 예제에서는 [input_i] “r”(i), [input_j] “r” (j)의 두 가지 입력 피연산자가 있습니다. 목록이 비어 있을 수 있습니다. 확장 된 인라인 어셈블리 문을 사용 하 여 전체 예제를 보자. 정수 피연산에 대한 간단한 산술 연산을 수행하고 결과를 표시합니다(다운로드시 산술.c로 사용 가능).

Comments

No one has said anything yet.

Comments are closed.