Я пытался написать ассемблерный код с использованием ASSUME, но продолжаю получать ошибки, причины которых я не смог выяснить. Вот пара примеров: Пример 1
.286
.model medium, c
pproc typedef ptr proc
.data
dummy db ?
.code
assume bx:ptr pproc
call [bx]
end
при сборке ошибок не возникает.
Если я изменяю .286 на .386, то получаю следующую ошибку:Error A2158: type is wrong size for register
.
Эта ошибка возникает для строки: Assume bx:ptr proc
Почему это происходит? Что нужно изменить в ПРЕДПОЛОЖЕНИИ, чтобы исправить ошибку?
Примечание: я заметил, что pproc определяется ассемблером как указатель FAR. ЗАЧЕМ?
пример 2:
.286
.model medium
.data
dummy db ?
.code
assume bx:near ptr
call [bx]
call near ptr [bx[
end
Теперь, если я просто заменю .286 на .386, я получу следующую ошибку ассемблера:assume bx:near ptr
A2158: Type is wrong size for register
Почему я получаю эту ошибку? Это ближний сегмент. Обратите внимание, что инструкция, которая делает то же самое, не использует Assume.
пример 3
.286
.model medium, c
.data
dummy db ?
.code
assume bx:ptr byte
mov [bx],12h
mov byte ptr [bx],12h
end
Теперь, если я просто поменяю .286 на .386, я получаю следующие ошибки при попытке собрать его.
для строки: assume bx:ptr byte
я получаю сообщение об ошибкеA2158: Type is wrong size for register
Почему это происходит? Что нужно изменить в ПРЕДПОЛОЖЕНИИ, чтобы исправить ошибку?
для строки: mov [bx],12h
возникает следующая ошибка: error 2070 :invalid instruction operands.
Почему я получаю эту ошибку? Это ошибка? Это должно сработать, я пытаюсь сохранить 12h
в [bx]
. Обратите внимание, что инструкция, которая делает то же самое, не использует Assume.
mov [bx],12h
- неоднозначный размер операнда. Ассемблер не знает, нужен ли вам размер операнда в байтах, словах или двойных словах для этого хранилища. (Сообщение об ошибке, к сожалению, ужасное. Используйтеmov word ptr [bx], 12h
, если это то, что вам нужно, или byte ptr. - person Peter Cordes   schedule 25.05.2019assume
.386 подразумевает 32-битные указатели, а BX по-прежнему является 16-битным регистром. Это может также означать плоскую модель памяти, IDK. - person Peter Cordes   schedule 25.05.2019assume
может делать что-либо, кроме сообщения ассемблеру, на какую базу сегментов вы собираетесь установить DS или ES. Кажется, что лучший стиль IMO, чтобы сделать размер явным, где вы используете регистр, даже если существует синтаксис, который подразумевает его из какой-то другой строки. Но в любом случае, вы уверены, что этоptr byte
вместоbyte ptr
? - person Peter Cordes   schedule 25.05.2019.386
не означает плоскую модель. Вы можете использовать.386
с моделями реального режима, и это позволит вам сгенерировать 386 инструкций в реальном режиме. - person Michael Petch   schedule 25.05.2019ptr xxxx
, а неxxxx ptr
при связывании типов с регистрами. - person Michael Petch   schedule 25.05.2019