почему ассемблер не сообщает об ошибке по этому поводу? - PullRequest
2 голосов
/ 23 февраля 2011

Рассмотрим следующие два оператора из очень простой программы на языке ассемблера:

DATA1 DB  +200
DATA2 DB  -130

, когда я пытаюсь его собрать, ассемблер выдает ошибку в операторе no 2, как и должно быть, поскольку байт может удерживаться за пределами.-128 десятичных.Но почему ассемблер не дал ошибку ни в одном утверждении?В конце концов, байт может содержать до 127 положительных целых чисел со знаком. Вместо этого ассемблер помещает значение C8 в этот байт.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Любое число преобразуется в массив битов, когда оно собирается в исполняемый файл. -1, например, 0xFF, -2 это 0xFE и т. Д. Единственное отличие между -1 и 255 состоит в том, как он используется в вашем коде. Ассемблеру все равно, он просто хочет сохранить данные для использования.

3 голосов
/ 23 февраля 2011

Возможно, он не знает, является ли литерал подписанным или беззнаковым. Для ассемблера я не нахожу это слишком удивительным, есть варианты использования для обоих.

-130 никогда не помещается в байт, так как он должен быть подписан и меньше -128. 200, с другой стороны, прекрасно вписывается в неподписанный байт, и, похоже, это именно тот взгляд, который использует ассемблер, 0xC8 равен 200, если интерпретировать его как неподписанный байт.

1 голос
/ 24 февраля 2011

так что суть:

Содержание поля означает то, что вы хотите, чтобы они имели в виду. Результатом всего этого является то, что у вас должно быть хорошее представление о величине чисел, которые будет обрабатывать ваша программа, и вы должны определять размеры полей соответственно.

Питер Абель "Язык программирования и программирования на IBM PC".

Также от того же автора "инструкции ADD и SUB не различают неподписанные и подписанные данные и, на самом деле, просто складывают и вычитают биты"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...