Как работает косвенная адресация на ассемблере motorola 68k

У меня есть этот код:

loop2
        move.b  (a4)+,d3      * moving the morse code array input to d3
        muls    #5,d3
        add.b   $d3(a6),d3    * moving the character in morse code array to d4
        move.b  d3,d4
        cmp.b   #dot,d4

Здесь я обращаюсь к массиву, начинающемуся с a4, Я беру элемент массива и умножаю его на 5, чтобы переместить в область памяти, где у меня есть нужный элемент.

a6 представляет начальную точку массива, который содержит определенный символ.

заявление $d3(a6),d3 wokrs но код становится неисправным, так как я знаю код d3(a6),d3 должен быть правильным, но он показывает мне ошибку. Как я должен это делать?

2 ответа

Что происходит с $ для указания шестнадцатеричных констант, и d3 технически допустимая шестнадцатеричная константа, она использует a6 + 0xd3 как адрес памяти. То, что вы пытаетесь выполнить, использует другой синтаксис, а именно оба регистра в скобках: (a6,d3)

Итак, правильное утверждение:

add.b   (a6,d3),d3

В add.b (a6,d3),d3 вам, вероятно, следует объявить размер d3, используемого для генерации адреса: либо (a6,d3.w) или же (a6,d3.l)в зависимости от того, что вам нужно. В общем случае, после умножения вы получите полный 32-битный результат и должны использовать d3.l, Только если вы уверены, что результат умножения соответствует 16 битам, вы можете использовать d3.w,
Если вы пишете код специально для 68020+ (020,030,040,060), также рассмотрите возможность использования режима масштабированной адресации, например (a6,d3.w*n)где n является одним из 1, 2, 4, 8.

Другие вопросы по тегам