Конвертировать 32-битную программу в 16-битную

Ошибка ассемблера для моего 16-битного кода movzbw (%ax), %ax Ошибка: `(%ax)'не является допустимым выражением базы / индекса

Но приведенная ниже инструкция действительна для генерации 32-битного кода. movzbl (%eax), %eax

Среда: Процессор: Intel(x86). Ассемблер: "GNU AS" Операционная система: "Linux" Цель: При написании очень простого загрузчика, который выводит на экран "Hello, World", я пытаюсь передать строку в функцию и затем пройти байт за байтом, а затем распечатать его.

Какую эквивалентную инструкцию я могу использовать, чтобы избежать ошибок при записи 16-битного кода реального режима?

Дополнительная информация: Ниже приведен код на C, который я пытаюсь смоделировать в ассемблере "16 bit GNU AS"

void _prints(char*);


int main(void)
{
   char* mess = "hello";
   _prints(mess);
   return 0;
}

void _prints(char* str)
{
   while(*str)
   {
      ++str;
   }
}

Примечание: пытаясь сгенерировать файл сборки с помощью команды "gcc -S test.c", я вижу, что в _prints действует инструкция "movzbl (%eax), %eax". Я хочу смоделировать 16-битный код реального режима, используя тот же ассемблер, но он выдает ошибку при использовании "movzbw (%ax), %ax"

Пожалуйста помоги

1 ответ

В реальном режиме (%ax) ([ax]) не является допустимым методом косвенной адресации. Вы должны использовать %bp регистр. Я рекомендую вам взять руководства по процессорам Intel (или AMD) и прочитать том 2 (для Intel) спереди назад, как я.

Если вы просто удаляете e для имитации реального режима в этом нет необходимости. Ваша программа не будет компилироваться в 16-битный исполняемый файл. Это все еще будет 32 или 64-битный исполняемый файл с gcc, Единственный способ создать 16-ти исполняемые файлы - это OpenWatcom. Даже тогда нет необходимости писать 16-битные программы. Они медленные, и переключение между реальным и защищенным режимом (изменение потока выполнения) является дорогостоящим для процессора.

Как вы упомянули, это для загрузчика, вы не можете написать такой загрузчик. Вы должны написать сборку вручную. Нет исключений, о которых я знаю.

Другие вопросы по тегам