현재 하드 드라이브의 부트 섹터에서 실행할 수있는 약간의 게임을하고 있습니다. 이것은 내 프로그램이 16 비트 리얼 모드로 실행된다는 것을 의미하며 컴파일러 플래그를 설정하여 순수한 i386 코드를 생성합니다. 저는 C++로 게임을 작성하고 있지만 인터럽트 호출을 통해 BIOS와 대화하기 위해 많은 인라인 어셈블리가 필요합니다. 이러한 호출 중 일부는 32 비트 정수를 반환하지만 두 개의 16 비트 레지스터에 저장됩니다. 현재 내가 어셈블리에서 내 전화 번호를 얻기 위해 다음과 같은 일을 해요 :인라인 어셈블리의 두 레지스터에서 값의 상위 및 하위 부분을 검색하려면 어떻게합니까?
auto getTicks = [](){
uint16_t ticksL{ 0 }, ticksH{ 0 };
asm volatile("int $0x1a" : "=c"(ticksH), "=d"(ticksL) : "a"(0x0));
return static_cast<uint32_t>((ticksH << 16) | ticksL);
};
이것은 내가 틱 수를 반환 this interrupt function를 호출하는 데 사용하는 람다 함수입니다. 나는 시간 데이터를 얻는 더 좋은 방법이 있다는 것을 알고 있으며, 자정인지 확인하기 위해 AL
에 대한 점검을 구현하지 않았지만, 그것은 또 다른 주제입니다.
두 개의 16 비트 값을 사용하고 레지스터 값을 별도로 구한 다음 return 문에서 볼 수있는대로 32 비트 숫자로 결합해야합니다.
코드에서 해당 데이터를 하나의 32 비트 숫자로 가져 와서 shift 및 bitwise-or를 피할 수있는 방법이 있습니까? 필자가 액세스하는 16 비트 레지스터는 실제 32 비트 레지스터의 상위 16 비트에 불과하지만 전체 32 비트 레지스터에 액세스하는 방법을 알지 못합니다.
'CX'와 'DX'는 서로 다른 레지스터의 하위 16 비트이므로 32 비트 레지스터에 이들을 넣으려면 'shift'와 'or'와 같은 트위 들링을해야합니다. C 코드를 사용 했으므로 컴파일러에서 코드를 작성하는 가장 좋은 방법을 찾아 내도록하십시오. – Jester
아, 그것들은 다른 레지스터입니다. 나는 그들이 같은 레지스터의 상위 16 비트보다 하위 16 비트라고 생각했기 때문에 이것을보다 효율적인 방식으로 작동시킬 수 있다고 생각했습니다. 그것들이 실제로 다른 레지스터라면, 나는이 작업들을 피할 수 없을 것입니다. – adam10603
상위 16 비트는 직접 접근 할 수 없습니다. – Jester