Страницы

Wednesday, 15 June 2011

Преобразование типов на языке Ассемблера

При изучении языка Ассемблера у многих студентов возникают сложности с вводом/выводом чисел (особенно, если оно многозначное...а с учетом отрицательных чисел - вообще смерть). А именно: преобразованием последовательности кодов ASCII в число и наоборот. С операциями посимвольного ввода/вывода все справляются замечательно. Проблемы начинаются при осваивании буферизованного ввода для многозначных чисел.
На самом деле, в конвертации лежит очень простая идея. При преобразовании последовательности кодов в число необходимо всего лишь вычитать из кода 30h(48) и умножать полученную цифру на соответствующий ей порядок (1, 10, 100, и т.д.). А при представлении числа последовательностью ASCII-кодов нужно только делить число на порядок и прибавлять к результату 30h для получения кода полученной цифры.
Пришла в голову мысль написать подпрограммы для этих операций и оформить их в виде подключаемого модуля. Вполне вероятно, что это мне пригодится в дальнейшем. А если данный модуль послужит на благо  кого-либо, кроме меня (например, будущим поколениям студентов) - это вдвойне замечательно.
(быть может, в будущем доработаю его для поддержки преобразования еще каких-либо типов данных)
Итак, перехожу к сути...

Написан код под TASM, т.е. возможно использование без изменений еще и под MASM.
Текст модуля TYPECONV.ASM:

Теперь необходимо сказать об использовании данного модуля. 
Для того, чтобы в программе появилась возможность использования подпрограмм char_to_int и int_to_char, необходимо отметить их как внешние.

Для использования подпрограмм необходимо учесть следующее.

Подпрограмма char_to_int:
  1. перед вызовом нужно поместить в стек сначала адрес, по которому располагается в памяти последовательность символов, которая должна быть преобразована;
  2. затем в стек должно быть помещено значение количества символов, составляющих число.
Число возвращается в место вызова в стеке. Т.е. для его использования необходимо только "выплюнуть" верхний элемент.

Подпрограмма int_to_char:
  1. перед вызовом в стек должно быть помещено число, которое нужно преобразовать в последовательность кодов символов;
  2. затем в стек необходимо поместить адрес буфера для сохранения кодов символов.
Результат работы данной процедуры - последовательность ASCII-кодов символов в буфере, который представляет собой: 1 первый байт - под количество символов, и остальное пространство - собственно, сам буфер.

Теперь нужно сказать пару слов относительно компиляции. Сначала должно выполняться ассемблирование самого модуля (с опцией /m), затем - основной программы. После этих двух операций следует линковка с объединением объектных модулей. Т.е. всего последовательность из трех команд (для TASM):

Поскольку в модуле используются нерасширенные регистры, то возможна конвертация целых чисел из диапазона:
-32767...+32767

Прилагаю архив с модулем и программой его тестирования.
iFolder: http://ifolder.ru/24145614
Deposite: http://depositfiles.com/files/uybsn2puw
Если вдруг ссылки перестанут действовать, отписывайтесь в комментариях, перезалью файл.

P.S.: Данный модуль мне видится достаточно "тяжелым". Его использование может представляться "стрельбой из пушки по воробьям". В будущем постараюсь по возможности его оптимизировать. Если у Вас есть замечания, или пожелания относительно сего моего творения, пожалуйста высказывайте.
Итак, прошу пользовать...

No comments:

Post a Comment

]]>