아마 당신을 일인가있어 첫 번째 것은 당신이 제공하는 C 함수에 의해 지정된 옵 코드의 D 컴파일러의 지원 목록이 outb
을 포함하지 않습니다. 일부 파고 들자, 나는 outb
이 일반적인 opcode out
의 더 구체적인 이름이라는 것을 알았습니다. outb
은 opcode의 첫 번째 인수가 바이트 레지스터에 포함됨을 나타냅니다. (outw
및 outl
은 첫 번째 인수 크기가 각각 단어와 더블 워드를 나타냄) 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
의 경우이 레지스터는 dx
및 al
입니다. D의 인라인 어셈블리 구문에 따라, 당신은 변수를 이동하고 다음과 같이 out
오피 코드를 호출 할 수
asm
{
MOV AL, value;
MOV DX, port;
OUT DX, AL;
}
주
, 그 GCC는 AT & T 어셈블러 구문을 사용하고, D는 인텔 어셈블러 구문, 주문을 사용하기 때문에
OUT
에 제공된 인수가 거꾸로됩니다.