Я сузил свою проблему до 4 строк кода.8086 Assembly - определение конфликтов с прямой ссылкой
MOV BX, testz
ADD AL, [testz]
INT 20h
testz:
~ ^
#ERROR 16: Definition Conflicts With Forward Reference @@@@#
db ?
Как вы думаете, а не на этот код? Я перемещаю адрес непосредственно в регистр BX и добавляю значение байта в адрес testz к AL.
В более крупной программе я также получаю #ERROR 13: Байт/комбинация слов не допускается.
Но ярлык - это слово, где [ярлык] является байтом. Почему мой компилятор не может отличить их?
ADD BL, [second]
MOV BX, second
~ ^
#ERROR 13: Byte/Word Combination Not Allowed
second:
~ ^
#ERROR 16: Definition Conflicts With Forward Reference @@@@#
db ?
Потому что я не вижу конфликта между Byte/Word.
Спасибо.
Update: это я полагаю, немного долго, чтобы быть комментарием, так что я изменить мой вопрос
мой компилятор интерпретирует смещение testz и testz одинаково. Я посмотрел на бат-коды и не видел разницы.
MOV BX, testz ADD AL, [BX]
Код выше работ, но есть ли другой способ, что я могу сделать это в одной строке, как
ADD AL, [testz]
Всякий раз, когда я помещаю имя метки в [], это просто неприемлемо в соответствии с моим компилятором a86. Но я чувствую, что они разрешены на этом языке.
Aah! Например, это работает ADD AL, testz B. Поэтому, когда я писал [testz], я имел в виду testz B. Но был ли мой синтаксис и допущения неправильными? Или это мой компилятор, который решил реализовать их таким образом? – EralpB
Это были ... десятилетия? ... так как я коснулся A86. Стандарт де-факто для синтаксиса ассемблера 8086 - это синтаксис MASM. Но A86 делает все по-другому. Похоже, что A86 пытается выполнить сборку одного прохода, в то время как MASM использует многопроходный подход. Но я точно не помню. – Managu
Спасибо, по крайней мере, я узнал, как заставить его работать сейчас :) – EralpB