Он будет выполнен без каких-либо ошибок (не уверен, что он выполняет правильные вычисления, но это зависит от вас, так как это домашняя работа), если вы измените все свои MOVE
, ADD
, SUB
, CMP
на MOVE.B
, ADD.B
, SUB.B
, CMP.B
. Я предполагаю .B
, поскольку ваши переменные объявлены DC.B
. Даже если вы не получаете ошибок, вы должны указать размер. Примечание Основными, которые необходимо изменить, являются MOVE
, которые обращаются к памяти по причинам, указанным ниже, но все они должны быть действительно указаны.
В любом случае ошибка произошла по адресу: MOVE (A1),D4
. Если вы просмотрите и посмотрите регистры, вы увидите похожую инструкцию до того, как (MOVE (A0),D3
) считывал СЛОВО, а не БАЙТ в D3
: D3=00000602
. Он читает первые два байта из T
в D3
. MOVE (A1),D4
также хочет прочитать СЛОВО, на этот раз от J
.
Однако, поскольку вы указали ассемблеру DC.B
, он выровнял память, чтобы вы могли получить доступ к вашим массивам как байты, а не как слова. Поскольку ваши MOVE
инструкции и другие по умолчанию равны MOVE.W
, вы также можете изменить DC.B
на DC.W
, и ошибка исчезнет. Но не делайте этого, просто показывая вам, как и почему возникает ошибка, вы должны указать размеры, как я упоминал выше.
Также обратите внимание, что с помощью инструкций, подобных MULU
, если вы хотите только умножить отдельные байты вместе, вы должны убедиться, что старшие байты вашего регистра (ов) обнуляются, так как это умножает вместе, по крайней мере, WORD из каждый операнд Поскольку вы не переместили ничего, кроме байта, в D3
, все равно старшие байты равны нулю.
Другое дело, END $400
обычно должно быть что-то вроде END START
, то есть:
ORG $1000
START:
...
END START
РЕДАКТИРОВАТЬ : Просто подумал, что я укажу (если это не было уже очевидно), что вы должны исправить ваш прирост A0
и A1
, т.е. прочитайте ответ Джастина.