2012-06-08 5 views
1

Я сузил свою проблему до 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. Но я чувствую, что они разрешены на этом языке.

ответ

4

Я подозреваю, что вы хотите MOV BX, offset testz. Похоже, что ваш ассемблер интерпретирует [testz] и testz для обозначения того же самого.

Вы можете подтвердить это, пытаясь вместо этого умозрительно эквивалент LEA BX, testz

EDIT: (от http://www.csn.ul.ie/~darkstar/assembler/manual/a14.txt):

ERROR 16: Definition Conflicts With Forward Reference 

    This error occurs when the assembler has previously guessed 
    the type of a forward-referenced symbol in order to determine 
    what kind of instruction to generate, and the guess turned out 
    to be wrong. The error is reported at the time the symbol is 
    defined. For example, when A86 sees MOV AX,FOO, it will 
    assume FOO is an immediate value. This error is reported if 
    FOO turns out to be a word variable: FOO DW 0. You need to 
    search backwards from the error message, to references of FOO, 
    and specify the type you intend to be used: MOV AX,FOO W. If 
    you really did intend to load the offset of FOO and not the 
    memory contents, you can code MOV AX,OFFSET FOO to make the 
    error message go away. 
+0

Aah! Например, это работает ADD AL, testz B. Поэтому, когда я писал [testz], я имел в виду testz B. Но был ли мой синтаксис и допущения неправильными? Или это мой компилятор, который решил реализовать их таким образом? – EralpB

+0

Это были ... десятилетия? ... так как я коснулся A86. Стандарт де-факто для синтаксиса ассемблера 8086 - это синтаксис MASM. Но A86 делает все по-другому. Похоже, что A86 пытается выполнить сборку одного прохода, в то время как MASM использует многопроходный подход. Но я точно не помню. – Managu

+0

Спасибо, по крайней мере, я узнал, как заставить его работать сейчас :) – EralpB

1

Руководство DOS команду для указателя на обработчик таких:

mov ax, word ptr es: [bx], BBBB

, где BBBB является базой

также является ссылкой на базу для сегмента-то же после нажатия ого [я думаю, я не могу вспомнить]

, к которому так же, как указано выше, кроме BBBB является ГСС для segement

сейчас Я написал обработчик, когда моя мышь перестала функционировать из-за плохой аварии, и я использовал это слово ptr как байт вместо слова и, похоже, работал, поскольку я никогда не делал фактический указатель слов, а просто использовал слово ptr в программе наряду с обратным двоичным преобразованием байта в шестнадцатеричный [A6 назад 65].

Также я обнаружил, что inthh DOS amnual для совершения вызова INT [не так, как в сборке отладки или сборки для программирования, вызвав int ##, но фактически сделав прямой вызов 8080 и к которому факт этого что это не вызов прерывания, а вызов IRQ. Код команды неверен - особенно в презентации. Также на Intel es: [bx] не работает - необходимо использовать es [bx]

Также ine xtension-wheres my head at --- чтобы ответить на ваш вопрос, вы делаете ссылку на 8-битный регистр и затем 16-разрядный регистр, в котором вы инструктируете ADD bl, а затем меняете bx после добавления операнда. Это ваша ошибка № 13.

Что нужно сделать, так это убедиться, что bl совместим с BX до того, как вы или нет, вы получите ошибку прямого обращения, к которой в основном относится это. Инструкция ADD автоматически защищает BX от амнипуляции до тех пор, пока запрос вычисления не будет или запрос команды полностью завершены, если только он не выполнен как запрос IRQ, к которому он может быть приостановлен с помощью sti и cli, к которому в промежутке используется ссылка для изменения таблицы страниц или справочной таблицы.

Смежные вопросы