Инструкции для обычных процессоров кодируются как сами байты, например:
ORG 200H
MOV A,#15
с высокой вероятностью выдаст, например, два или три байта (в зависимости от процессора, на который ориентирован ваш ассемблер)для 8051 CPU mov A,#immediate
кодируется как два байта 74h, 0Fh
, и из-за директивы ORG
байт 74h
находится по адресу 200h и байт 0Fh
по адресу 201h, поэтому вы не выполнили свою задачу.
Задача уже содержит подсказку, говорящую о «директиве ассемблера» , а не об инструкциях, поэтому ваша определяющая строка DB
выглядит как то, что вы должны использовать также для трех числовых значений.
(вы все еще можете определить эти три байта также как инструкции, если вы проверите, какая команда (-ы) выполняет сборку как эти три запрошенных байта, но тогда вы используете не «директиву ассемблера», а «инструкцию CPU»)
А что касается определения строки ... если вы хотите C-подобную строку, то ей также нужен нулевой терминатор: DB “CpE363”,0
будет работать так, добавляя еще один нулевой байте после этого.Необработанные строки без терминатора можно использовать только по коду, который знает длину строки, в то время как «завершенные» строки можно искать по коду для определения значения терминатора, так что вы можете передавать только указатели из них на подпрограммы (но вычисление длины в этом случае требует дополнительного времени выполнениявыполнение проверки байтов для значения терминатора).
И добавление STOP:AJMP $
после этого, вероятно, бесполезно, поскольку такой исходный код, определяющий только байты как запрошенный, не содержит никаких преднамеренных инструкций для выполнения (вывсе еще может выполнить определенные данные, и процессор будет декодировать их как некоторые инструкции и делать кто-что знает-что).Также, если кто-то обработает ваш код как есть и выполнит в «START:», то ЦП выполнит три MOV
инструкции, как и ожидалось, тогда он получит некоторое содержимое памяти по адресам 206h..2FFh (если он будет заполненнули, они декодируются ЦП как инструкция NOP
, поэтому ЦП будет просто выполнять их шаг за шагом), а затем по адресу 300h выполнит строку как инструкции ЦП (у меня под рукой нет дизассемблера для 8051)поэтому я не могу сказать, какие инструкции будут декодированы из этой строки), и он, вероятно, достигнет этой метки STOP:
в совершенно неожиданном состоянии, если он вообще ее достигнет.
Это одна особенностьКомпьютеры "архитектуры фон Неймана", в которых байты данных и инструкции занимают один и тот же тип памяти (и память может использоваться для обоих), а ЦП не может определить, что есть, что, поддерживая (программистом) правильнуюпоток ЦП через содержимое памяти только для инструкций имеет решающее значение.Как только вы потеряете его из-за какой-либо ошибки, ЦП выполнит любой доступный ему объем памяти и будет действовать в соответствии с этими значениями (в крайне маловероятных случаях при подключении какого-либо чувствительного устройства ЦП может случайно даже разрушить периферийное устройство, выполнив некоторые операции ввода-вывода).команда, например, некоторые из старых мониторов CRT со старыми VGA-картами, возможно, были вынуждены отображать все изображение в одной точке экрана-экрана, эффективно записывая точку в слой люминофора за короткое время - но я никогда не слышал о выполнении кодаэто непреднамеренно по ошибке / ошибке, в большинстве случаев люди просто стирали целые диски или замятые принтеры и т. д., и на 99% данные выполнялись случайно, заканчиваясь сбросом машины без какого-либо вреда).
И вот почему естьчто AJMP $
в обычном коде в конце, бесконечно прыгает на себя, мешая ЦП начать блуждать в памяти за пределами разработанного кода и выполняя некоторую случайную бессмыслицу.Но в вашей задаче нет кода для выполнения, поэтому нет смысла добавлять бесконечный цикл в конце.