Вопрос

Я читаю учебник под названием «Введение в язык ассемблера 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top