При изучении языка Ассемблера у многих студентов возникают сложности с вводом/выводом чисел (особенно, если оно многозначное...а с учетом отрицательных чисел - вообще смерть). А именно: преобразованием последовательности кодов ASCII в число и наоборот. С операциями посимвольного ввода/вывода все справляются замечательно. Проблемы начинаются при осваивании буферизованного ввода для многозначных чисел.
На самом деле, в конвертации лежит очень простая идея. При преобразовании последовательности кодов в число необходимо всего лишь вычитать из кода 30h(48) и умножать полученную цифру на соответствующий ей порядок (1, 10, 100, и т.д.). А при представлении числа последовательностью ASCII-кодов нужно только делить число на порядок и прибавлять к результату 30h для получения кода полученной цифры.
Пришла в голову мысль написать подпрограммы для этих операций и оформить их в виде подключаемого модуля. Вполне вероятно, что это мне пригодится в дальнейшем. А если данный модуль послужит на благо кого-либо, кроме меня (например, будущим поколениям студентов) - это вдвойне замечательно.
(быть может, в будущем доработаю его для поддержки преобразования еще каких-либо типов данных)
(быть может, в будущем доработаю его для поддержки преобразования еще каких-либо типов данных)
Итак, перехожу к сути...
Написан код под TASM, т.е. возможно использование без изменений еще и под MASM.
Текст модуля TYPECONV.ASM:
Теперь необходимо сказать об использовании данного модуля.
Для того, чтобы в программе появилась возможность использования подпрограмм char_to_int и int_to_char, необходимо отметить их как внешние.
Для использования подпрограмм необходимо учесть следующее.
Подпрограмма char_to_int:
- перед вызовом нужно поместить в стек сначала адрес, по которому располагается в памяти последовательность символов, которая должна быть преобразована;
- затем в стек должно быть помещено значение количества символов, составляющих число.
Подпрограмма int_to_char:
- перед вызовом в стек должно быть помещено число, которое нужно преобразовать в последовательность кодов символов;
- затем в стек необходимо поместить адрес буфера для сохранения кодов символов.
Теперь нужно сказать пару слов относительно компиляции. Сначала должно выполняться ассемблирование самого модуля (с опцией /m), затем - основной программы. После этих двух операций следует линковка с объединением объектных модулей. Т.е. всего последовательность из трех команд (для TASM):
Поскольку в модуле используются нерасширенные регистры, то возможна конвертация целых чисел из диапазона:
-32767...+32767
Прилагаю архив с модулем и программой его тестирования.
iFolder: http://ifolder.ru/24145614
Deposite: http://depositfiles.com/files/uybsn2puw
Если вдруг ссылки перестанут действовать, отписывайтесь в комментариях, перезалью файл.
P.S.: Данный модуль мне видится достаточно "тяжелым". Его использование может представляться "стрельбой из пушки по воробьям". В будущем постараюсь по возможности его оптимизировать. Если у Вас есть замечания, или пожелания относительно сего моего творения, пожалуйста высказывайте.
Итак, прошу пользовать...
No comments:
Post a Comment