인라인 어셈블리 코드를 작성하여 실시간 시계를 읽습니다. 'dl'로 읽을 레지스터 번호 (4)를로드하고이를 포트 0x70에로드합니다. 나는이 레지스터 값 (4)을 알로 읽으려고한다. 자세한 내용은 - RTCGNU 어셈블러 구문
asm(
"mov $4, %%dl;"
"out 0x70, %%dl;"
"in %%al, 0x71;"
:
:
:"%al","%dl"
);
이 코드가 들어있는 C 파일을 컴파일에 오류 메시지가 아래 얻고있다.
Assembler messages:
Error: operand size mismatch for 'out'
Error: operand size mismatch for `in'
어셈블러 버전 : GNU 어셈블러 버전 2.26.1 (x86_64에-리눅스 GNU) (우분투 GNU Binutils의) BFD 버전을 사용 2.26.1
누군가가 문제를 지적시겠습니까?
오류 메시지는 상수 앞에'$'이 없기 때문에 발생합니다. 즉, asm에 값을 출력하려면 첫 번째 콜론 뒤에 출력 매개 변수가 있어야합니다. 우분투를 실행하는 동안'in' 또는'out'을 사용할 수 있다면 놀랄 것입니다. 그리고 RTC를 읽기 전에'cli'한다고 생각하지 않습니까? 16 비트 코드를 작성하는 경우 64 비트 컴파일러를 사용하는 것이 효과가 있을지 잘 모르겠습니다. 그리고 부팅 할 때 RTC를 읽으 려한다면 [this] (https://stackoverflow.com/q/46074535/2189500)는 어떨까요? –
AT & T 구문에는 일반적으로 오른쪽에 대상이 있습니다. 나는 IN과 OUT 명령에도이를 기대합니다. 'IN 0x71, %% al'? –
@DavidWohlferd'iopl()'이나'ioperm()'시스템 호출을 사용하여'in'과'out'을 사용할 수 있습니다. – fuz