Конвертировать 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-битные программы. Они медленные, и переключение между реальным и защищенным режимом (изменение потока выполнения) является дорогостоящим для процессора.
Как вы упомянули, это для загрузчика, вы не можете написать такой загрузчик. Вы должны написать сборку вручную. Нет исключений, о которых я знаю.