Сборка инструкции JMPI в NASM выдает ошибку «синтаксический анализатор: ожидаемая инструкция».

#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