Я продолжаю получать и адрес ошибки для моего языка ассемблера - PullRequest
2 голосов
/ 31 октября 2011

Итак, я создаю язык ассемблера для следующего:

 X = 5
 Y = 7
 FOR I = 1 TO 9
    Y = Y + I
    IF T(I) = J(I) + X THEN J(I) = T(I) * 4 - Y
               ELSE J(I) = J(I) - T(I) 
END_FOR

и продолжаю получать

"Address Error: Instruction at  418 accessing address  44f
Execution halted"

Код, который у меня пока есть:

    ORG $400

    MOVEA   #T,A0
    MOVEA   #J,A1
    MOVE.B  #1,D0       //D0 is a counter to hold I
    MOVE    #5,D1       //X = 5
    MOVE    #7,D2       //Y = 7
NEXT    
    ADD D0,D2       //Y = Y + I
    MOVE    (A0),D3     
    MOVE    (A1),D4
    MOVE    D4,D5       //D5 is a temp copy of J(I)
    MOVE    D5,D1
    CMP D5,D3       //IF T(I) = J(I) + X
    BNE ELSE
    SUB D2,D3
    MULU    #4,D3
    MOVE    D3,(A1)     
    BRA END_LOOP
ELSE    
    SUB D3,D4       //J(I) = J(I) - T(i)
    MOVE    D4,(A1)
END_LOOP
    ADDA    #2,A0       //POINT TO NEXT ELEMENT IN T
    ADDA    #2,A1       //POINT TO NEXT ELEMENT IN J
    ADD #1,D0
    CMP #9,D0
    BNE NEXT
    MOVE.B  #4,D0
    TRAP    #15     //; halt simulator

* Variables and Strings
T   DC.B    6,2,5,4,9,7,3,1,0
J   DC.B    5,7,1,9,2,5,6,6,1

    END $400        //; last line of source

Что я пропускаю?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Он будет выполнен без каких-либо ошибок (не уверен, что он выполняет правильные вычисления, но это зависит от вас, так как это домашняя работа), если вы измените все свои 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, т.е. прочитайте ответ Джастина.

3 голосов
/ 31 октября 2011

Не знаю насчет Easy68K, но в других известных мне ассемблерах не будет команда под названием DC.B выделять байты?В каком случае вам понадобится adda # 1, a0 для их повторения?

...