2011-12-23 3 views
8

내가 D.변환 도움 : __asm__ __volatile__

static __inline void outb (unsigned char value, unsigned short int port) 
{ 
    __asm__ __volatile__ ("outb %b0,%w1" 
          : 
          : 
         "a" (value), 
          "Nd" (port)); 
} 

에 포트 C의 OUTB 기능을하고 싶습니다 이것은 D 버전입니다.

extern(C) 
{ 
    void outb (ubyte value, ushort port) 
    { 
     // I couldn't figure out this part 
    } 

} 

다음은 주제에 대한 링크입니다.

D 인라인 어셈블러

http://dlang.org/iasm.html

GCC-인라인 어셈블리-HOWTO

http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

하지만 내가 도움이 필요 어셈블리 언어를 모른다. 어떤 도움을 주시면 감사하겠습니다. 감사.

답변

8

outb 명령어는 outb %al, %dx으로 호출해야합니다. 여기서 %al은 값이고 %dx은 포트입니다.

D는 기본적으로 AT & T 구문을 사용하는 GNU 어셈블러와 달리 x86 용 인텔 구문을 사용합니다. 해당 인텔 구문은 out dx, al 될 것이고, D에 해당하는 코드는 같을 것이다 : 당신이 druntime이 같은 명령을 수행 core.bitop.outp 기능을 가지고 있기 때문에, 모든 어셈블리를 작성할 필요가 없습니다

void outb (ubyte value, ushort port) 
{ 
    asm { 
     mov AL, value; 
     mov DX, port; 
     out DX, AL; 
    } 
} 

참고.

void outb (ubyte value, ushort port) 
{ 
    import core.bitop; 
    outp(port, value); 
} 
4

아마 당신을 일인가있어 첫 번째 것은 당신이 제공하는 C 함수에 의해 지정된 옵 코드의 D 컴파일러의 지원 목록이 outb을 포함하지 않습니다. 일부 파고 들자, 나는 outb이 일반적인 opcode out의 더 구체적인 이름이라는 것을 알았습니다. outb은 opcode의 첫 번째 인수가 바이트 레지스터에 포함됨을 나타냅니다. (outwoutl은 첫 번째 인수 크기가 각각 단어와 더블 워드를 나타냄) D 컴파일러는 opcode out을 사용하고 지정한 인수의 크기에 따라 작성할 특정 opcode를 결정합니다.

다음으로 할 일은 GCC 구문을 D 구문으로 변환하는 것입니다. GCC는 인라인 어셈블리-HOWTO에 따르면, 사용자가 제공 한 코드가 확장 조립 구문을 사용합니다

asm (assembler template 
    : output operands     /* optional */ 
    : input operands     /* optional */ 
    : list of clobbered registers  /* optional */ 
    ); 

이 템플릿을 살펴보면를, 함수는 두 개의 인수 한 어셈블리 명령 ( outb)를 지정하는 첫번째 되 바이트 ( %b0)이고 두 번째는 단어 또는 짧은 정수 ( %w0)입니다.

입력 인수 목록에 관한 까다로운 점은 각 함수 매개 변수 앞에 붙는 문자열입니다. HOWTO에 따르면 이것들은 제약이라고 불린다. 그것들은 근본적으로 GCC가 제공된 어셈블리 명령어에 대한 인수로 매개 변수를 사용해야 할 때 반드시 따라야하는 규칙입니다.value 매개 변수에 적용된 "a" 제약 조건은 변수 크기에 따라 변수 내용이 eax, ax 또는 al 레지스터에 저장되어야 함을 나타냅니다. 변수의 제약 조건은 먼저 값이 0-255 범위에 있음을 나타내고 두 번째 값은 다시 edx, dx 또는 dl 중 하나의 값으로 지정해야 함을 나타냅니다. 변하기 쉬운.

G 컴파일러는 GCC처럼 어셈블리 블록의 변수에 많은 도움을주지 않습니다. D의 인라인 어셈블러에서는 매개 변수 값을 적절한 레지스터로 이동해야합니다. outb의 경우이 레지스터는 dxal입니다. D의 인라인 어셈블리 구문에 따라, 당신은 변수를 이동하고 다음과 같이 out 오피 코드를 호출 할 수

asm 
{ 
    MOV AL, value; 
    MOV DX, port; 
    OUT DX, AL; 
} 

, 그 GCC는 AT & T 어셈블러 구문을 사용하고, D는 인텔 어셈블러 구문, 주문을 사용하기 때문에 OUT에 제공된 인수가 거꾸로됩니다.