assembly

created : 2020-11-03T11:28:40+00:00
modified : 2020-11-03T11:44:40+00:00

assembly

인라인 어셈블리 문법

  • (출처)[https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/app3.basic.html]
  • __asm__ : inline assembly 임을 명시
  • __volatile__ : c언어의 volatile 과 동일, 컴파일러의 최적화를 조심해야할때 고려
  • 기본구조 : __asm__ __volatile__ (asms : output : input : clobber)
    • asms : 어셈블리 코드
    • output : 변수들을 적어 주고, 각각은 쉼표로 구분
    • input : output과 같은 방식으로 사용
    • clobber : output, input에는 명시하지 않지만, asms로 값이 변하는 것들을 적어야 한다.
  • 예제 코드
    static __inline int test_and_set_bit(int nr, volatile void * addr)
    {
      int oldbit;
    
      __asm__ __volatile__( LOCKPREFIX
        "btsl %2, %1\n\tssbl %0,%0"
        :"=r" (oldbit), "=m" (ADDR)
        :"Ir" (nr) : "memory");
      return oldbit;
    }
    
    • 위를 해석하면 LOCKPREFIX 는 매크로로 lock; 명령어가 있다고 생각하고, 아래와 동일
      lock
      btsl nr, *addr
      sbbl oldbit