Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Числа и строки. Ассемблер (книга)

На канале Old Programmer продолжаю публиковать книгу о программирование на языке ассемблера в операционной системе Linux. Параграф 2.5. Строки и числа на ассемблере Очень часть книги по программированию строятся по принципы: все нужно знать для освоения данной темы должно быть уже изложено. Это не плохой и не хороший подход. Я бы его назвал классическим. Так обычно строят книги по математике. Но если нужно, чтобы некоторые читатели заранее от книги не отвернулись, следует придерживаться более, я бы сказал либерального, подхода. Например описание команд процессора не обязательно помещать ранее других материалов. Ранее должны все таки появляться программы. Поэтому более систематическое описание команд процессора x86-64 я откладываю до следующей главы. Очень важный вопрос в программировании: строки и числа. Последовательность символов можно рассматривать как строку, но если все символы, например, являются цифрами, то данную строку можно рассматривать и как целое число. Но если это число
programmer's notes

На канале Old Programmer продолжаю публиковать книгу о программирование на языке ассемблера в операционной системе Linux.

  • Список разделов канала Old Programmer, канала о программировании и программистах
  • Книга "Ассемблер для Linux"

Параграф 2.5.

Строки и числа на ассемблере

Очень часть книги по программированию строятся по принципы: все нужно знать для освоения данной темы должно быть уже изложено. Это не плохой и не хороший подход. Я бы его назвал классическим. Так обычно строят книги по математике. Но если нужно, чтобы некоторые читатели заранее от книги не отвернулись, следует придерживаться более, я бы сказал либерального, подхода. Например описание команд процессора не обязательно помещать ранее других материалов. Ранее должны все таки появляться программы. Поэтому более систематическое описание команд процессора x86-64 я откладываю до следующей главы.

Очень важный вопрос в программировании: строки и числа. Последовательность символов можно рассматривать как строку, но если все символы, например, являются цифрами, то данную строку можно рассматривать и как целое число. Но если это число, то тогда с ним можно выполнять арифметические действия, с помощью тех же команд процессора. C другой стороны, если мы имеем число, то для того, чтобы вывести его на некоторое устройство, например, консоль, следует преобразовать его строку, так выводить строку мы уже умеем.

В данном параграфе мы рассмотрим упрощенные алгоритмы перевода строки в число и обратно. Почему упрощенные? Потому что не будем учитывать нюансы, которые могут возникнуть в процессе преобразования. Например, если число слишком велико, или строка содержит символы, отличные от цифр.

В основе преобразования строки в число и числа в строку лежит известная арифметическая формула представления десятичного числа в виде суммы разрядов с множителями кратными десяти.

Из этой формулы вытекают алгоритмы преобразования. Для того, чтобы преобразовать строку в число, при условии, что она состоит из цифр, нужно преобразовать символы цифр в строке в цифры, а затем применить представленную выше формулу.

В листинге 9 представлена программа которая преобразует строку, которая задана здесь же в программе, в целое число. Результат легко проверить так как мы знаем число, которое должно получиться. Если результат правильный, то программа выводит строку «Преобразование прошло успешно».

Трансляция программы осуществляется последовательностью командами

as --64 l9.s -o l9.o
ld -s l9.o -o l9

Хотя программа (листинг 9) подробно прокомментирована мы сделаем дополнительные пояснения.

1. Коды символов, представляющие цифры в разных кодировках одинаковы: от 48(цифра 0) до 57(цифра 9). Поэтому чтобы получить значение десятичного разряда нужно из кода цифры вычесть число 48.

2. Поскольку младшие разряды в строковом представлении имеют большие адреса, то для преобразования по выше представленной формуле нужно начинать с конца строки и двигаться к ее началу. dec %r8- это как раз переход к старшей цифре.

3. Поскольку r9 содержит начало строки, то сравнивая r9 с r8мы получим критерий того, что мы прошли всю строку.

4. В представленном алгоритме мы дважды используем команду умножения (mul). Первое — произведение разряда на соответствующую степень числа 10, второе — получение соответствующей степени числа 10.

В листинге 10 представлено преобразование целого числа в строку. Число также задано в программе. Полученная строка затем выводится на консоль, известным уже нам способом.

Трансляция программы осуществляется последовательностью командами

as --64 l10.s -o l10.o
ld -s l10.o -o l10

Сделаем несколько пояснений к программе из листинга 10.

1. Алгоритм преобразования числа в строку основывается на последовательном делении числа на 10. При этом остаток от деления и будет очередным разрядом. Добавляем к нему 48 и получаем символ цифры.

2. Алгоритм построен так, что строка начинается с младших разрядов, потому далее в программе меняется порядок следование символов строки на противоположное. Для простоты алгоритма мы копируем символы в другой буфер.

Мы не заканчиваем вопрос о преобразовании строки в число и обратно. Мы вернемся к нему, когда будем говорить о стеке и функциях.

-->Глава 2. Параграф 2.6. <--Глава 2. Параграф 2.4.

Фрагмент программ l9.s
Фрагмент программ l9.s
programmer's notes