c언어에서 어셈블리의 in, out 명령어의 역할을 할 수 없을까요?

csm4338의 이미지

운영체제를 만들고 있는 중인데
A20 gate를 활성화하려면 어셈블리에서 in, out명령으로 포트의 값을 읽고 쓴다고 하는데요.
제가 c에서 했던 방법은

char *port64=(char*)0x64;
unsigned char status;

do
{
status=(unsigned char)*port64;
}while(status & 0x02);

이런식으로 0x64라는 포트의 값을 읽어오려고했습니다.
여기서 문제가 0x64포트에서 값을 읽었을 때 입력버퍼가 비어있다면 읽은 값과 0x02를 and연산을 했을 때 0이 나와서 while문을 빠져나가야되는데
무한루프를 돌고있는 상황입니다.

만약 이경우처럼 포트의 값을 읽고 쓸때는 어셈블리로 하는수 밖에 없는건가요?

익명 사용자의 이미지

메모리 어드레스 영역과
I/O 어드레스 영역에 대한 명령이 다릅니다.
따라서 예를 드신 코드는 0x64 메모를 접근할 뿐입니다.

어셈블리, 혹은 인라인 어셈블리를 사용하여 만드시거나,
사용하고 계신 라이브러리에 i/o 에 사용할 수 있는
함수나 api가 있는지 알아보세요.

gilgil의 이미지

상기 코드는 while loop안에 들어 갈 때 0x64번지의 내용을 한번만 읽고 그 다음부터는 확인하지 않을 수가 있네요(최적화로 인해서).

unsigned char status;

이 부분을
volatile unsigned char status;

이렇게 바꿔 보세요.