#assembly #nasm #bootloader
#сборка #nasm #загрузчик
Вопрос:
У меня есть этот ассемблерный код:
fin:
jmpi 0,0xc200
hlt ;halt cpu run and wait instructions
jmp fin
jmpi 0,0xc200
это неверно, и я не могу понять, что не так. Я собираю этот код с помощью:
nasm -f bin bootsect.asm -o bootsect.bin
Комментарии:
1. Для какой архитектуры процессора вы пишете assembly? Это не x86; x86 не имеет
jmpi
инструкции, и ееjmp
инструкции не принимают список аргументов, разделенных запятыми. Откуда вы берете этот код?2. Единственная интересная вещь в вашем коде — это значение 0xc200, которое является точкой входа BDOS в CP / M. Является ли это загрузчиком для системы x86? Может быть, это совпадение, поэтому я и спрашиваю.
3. Спасибо всем, этот код взят из книги под названием <<30 дней, сделай себя ОС>> и я внес некоторые изменения, потому что я также изучил linux 0.11 , но я не рассматривал архитектуру. Еще раз спасибо.
Ответ №1:
Похоже, вы, возможно, просматривали ассемблерный код AS86, который использует JMPI
(межсегментный переход). Обычно это называется FAR JMP и кодируется в NASM таким образом:
jmp 0:0xc200
В NASM JMPI
это просто JMP
, и между сегментом и смещением есть двоеточие ( :
), а не запятая ( ,
).
Если вы хотите использовать AS86 для сборки загрузчика вместо NASM, вам нужно будет установить пакет AS86, а затем собрать свой код в двоичный файл таким образом:
as86 -b bootsect.bin bootsect.asm
Неясно, как вы намеревались достичь цикла HLT после FAR JMP, но вы, вероятно, намеревались сделать это:
fin:
hlt ;halt cpu and wait for interrupt
jmp fin