В настоящее время я работаю над небольшой игрой, которая может работать из загрузочного сектора жесткого диска, просто для чего-то интересного. Это означает, что моя программа работает в 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-битных значения, получить значения регистра отдельно, а затем объединить их в 32-разрядное число, как вы видите в инструкции return.
Есть ли способ получить эти данные в одном 32-битном номере в моем коде сразу же, избегая сдвига и поразрядного или? Я знаю, что эти 16-битные регистры, к которым я обращаюсь, на самом деле представляют собой только более высокие и младшие 16-разрядные 32-битные регистры в реальности, но я понятия не имею, как получить доступ к исходному 32-битовому регистру в целом.
'CX' и' DX' - это низкие 16 бит разных регистров, чтобы объединить их в 32-битный регистр, вам нужно будет немного свернуть, например shift и 'or'. Поскольку вы использовали код C, просто дайте компилятору понять, как лучше создать код для этого. – Jester
О, это разные регистры, я вижу. Я думал, что они были выше и ниже 16-бит одного регистра, поэтому я подумал, что могу заставить это работать более эффективно. Если на самом деле это разные регистры, я боюсь, что не могу избежать этих операций. – adam10603
Лучшие 16 битов недоступны напрямую. – Jester