Как работает косвенная адресация на ассемблере 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.