Директива BYTE в сборке [закрыто]
Вопрос
Я читаю учебник под названием «Введение в язык ассемблера 80x86 и компьютерную архитектуру» Ричарда К.Детмера, а на стр. 59 говорится о БАЙТ директиву на языке ассемблера и использовать ее для символов и строк.Вот текст:
«Помимо числовых операндов, БАЙТ Директива допускает символьные операнды с одним символом или строковые операнды с множеством символов.Для обозначения символов или разделения строк можно использовать апострофы (') или кавычки (").Они должны быть парами;нельзя ставить апостроф слева и кавычку справа.Строка, разделенная апострофами, может содержать кавычки, а строка, разделенная кавычками, может содержать апострофы, что позволяет иметь строки, содержащие эти специальные символы».
Это очень понятно, но мое любопытство заключается в том, БАЙТ директиву, потому что я думал, что она может содержать только один байт, восемь бит.Я сделал тест, и если бы я сказал
string BYTE "HelloWorld"
конечно, он скомпилируется, но если вы проверите шестнадцатеричный код, вы заметите, что это не просто один байт, а несколько байтов.Глядя на таблицу ascii, мы уже знаем, что один символ — это байт.Так как же нам иметь строки?Я попытался применить это к цифрам.Мы знаем диапазон БАЙТ директива от -128 до 255.Я попробовал этот код:
number BYTE 9987
когда я попытался скомпилировать и запустить, я получил ошибку, потому что, конечно, 9987 было больше байта.Но почему строки невосприимчивы к этому?Почему может БАЙТ директива содержит более байта в контексте строк, но не делает того же с числами?
Я предполагаю, что когда я скомпилировал и запустил первый оператор кода, который я перечислил, возникла та же ошибка, что и второй.Почему здесь нарушено «правило»?
-Дэн
Решение
Обратите внимание, что не существует единого синтаксиса ассемблера, разные программы могут использовать разный синтаксис.Вам следует обратиться к руководству по сборке.
Тем не менее, строковая константа обычно представляет собой просто сокращенное обозначение каждого символа в отдельности, а BYTE
Директива позволяет определить несколько элементов одновременно.
Так, например, BYTE 1, 2, 3, 4
действителен и определяет 4 байта, а ваш string BYTE "HelloWorld"
эквивалентно string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'
и определяет 10 байт.Причина, по которой вы не получаете ошибку, заключается в том, что каждый символ сам по себе помещается в байт.
Некоторые ассемблеры даже не допускают использования строковых литералов. BYTE
или эквивалентные директивы, у них есть специализированные директивы для строк, например .string
или .ascii
.
Другие советы
А BYTE
Директива сообщает ассемблеру зарезервировать блок памяти и запомнить его длину в байтах.Длина определяется количеством байтов в инициализаторе, которые могут быть числами от 0 до 255 десятичных знаков или символами в одинарных кавычках.Строки распространены в языках программирования и обычно считаются массивами символов в последовательных байтах в памяти.Для удобства программиста ассемблер позволяет зарезервировать последовательность байтов, инициализированную символьной строкой, заключив строку в одинарные или двойные кавычки.Это эквивалентно
string1 BYTE 'H', 'e', 'l', 'l', 'o'
или
string1 BYTE 'Hello'
Некоторые ассемблеры имеют для этого разные директивы, например, язык ассемблера Oracle Solaris x86 имеет
.byte
директива, которая просто принимает байты.ascii
директива, которая принимает строку, которая не будет завершаться NUL.string
директива, которая принимает строку, котораяwill
быть прекращено NUL