16-битный набор команд asm - PullRequest
7 голосов
/ 29 сентября 2011

Какой набор инструкций используется в COM-файлах?Я предположил, что это 8086, но, похоже, я ошибся.В руководстве 8086, которое я нашел, shl может принимать только 1 или cl в качестве второго аргумента, в то время как непосредственные значения, отличные от 1, работают для меня нормально.В случае, если это имеет значение, я использую NASM.
Спасибо за ваше время.

Ответы [ 3 ]

9 голосов
/ 29 сентября 2011

Это один из тех забавных вопросов, и, как всегда, ответы вводят в заблуждение.

настоящий файл DOS COM не имеет заголовков и должен помещаться в одном сегменте памяти, поскольку не имел информации о перемещении,DOS должен был поместить файл туда, где он был нужен, и поэтому единственно верным способом совместимости (с x86) было использование 8086-совместимой сборки.Редактировать: Чтобы прояснить выше, это потому, что 8086 не было страниц памяти.

Вы, безусловно, могли бы скомпилировать в 286/386 операндов в, так как после запуска программы, в DOS нет исполнительной среды выполнения дляостановите вас и скажите «нет, вы не можете этого сделать, это инструкция 386.»

Что, как ни странно, является одной из причин того, что COM-файлы не очень часто работают в Windows7 x32 или вообщев Windows 7 x64.

Из-за того, как работал DOS, command.com был выгружен при выполнении файла .com и впоследствии перезагружен, поэтому по сути ваш файл .com мог получить доступ ко всей памяти системы, и теоретическииспользуйте устройства памяти DOS, такие как Phar lap DOS / 4GW и CWSDPMI.

Короче говоря;Вы можете использовать любые команды, которые может поддерживать текущая система, но вы должны использовать только 16-битные x86-совместимые команды, чтобы быть уверенными.

Если вышеприведенное звучит как PITA, это потому, что это было, я помню:) Именно поэтому формат .EXE стал очень популярным очень быстро.

7 голосов
/ 29 сентября 2011

Настоящий COM (я не буду вдаваться в COM, которые на самом деле являются EXE-файлами и т. Д.), Просто означает, что это простой исполняемый файл DOS.Независимо от того, какой набор команд поддерживается, доступен.Раньше я занимался программированием DOS (как COM, так и EXE) на 8088 вплоть до i486, и любые инструкции, допустимые в этом режиме, вы можете использовать.Например, я часто использовал 32-битные строковые инструкции и немедленные нажатия, когда моя цель была «16-битной» (технически следует называть «реальный режим») DOS.

4 голосов
/ 29 сентября 2011

Существует два основных типа COM-файлов.Один был разработан для работы в MS-DOS, другой - для ОС CP / M.Насколько я знаю, файлы DOS COM должны быть основаны на x86.COM-файлы CP / M потенциально могут быть инструкциями 8085, 8080 или Z80 согласно Википедии.Как уже упоминалось в другом ответе, COM является простым исполняемым форматом и может использовать любой поддерживаемый базовый набор команд.

С точки зрения инструкции SHL, кажется, что современное оборудование x86 (возможно, x64) поддерживает использование непосредственного значениядля этой инструкции.Я не мог найти ссылку на него, когда просматривал только 8086 документов, поэтому он должен был быть добавлен в какой-то момент.Вот несколько ссылок, в которых подробно описана эта инструкция:

http://siyobik.info/main/reference/instruction/SAL%2FSAR%2FSHL%2FSHR

http://ref.x86asm.net/coder32.html

...