![]() |
Вопрос по ассемблеру!Помогите новичку!
Подскажите пожалуйста как конвертировать данные введенные с клавы, в числа с которыми я далее мог бы оперировать (+,-,*,/ и т.д.). Как я понял это конвертация (String to DB,DW). Если кто знает помогите, это очень срочно. Заранее спасибо.
|
Встроенной процедуры, как ты понимаешь, для этого нет. Последний раз писал на асме очень давно, поэтому написать код не могу (может попозже), но алгоритм таков:
1. узнаешь адрес и длину строки, в регистр dx (например) записываешь "адрес - длина + 1" (это адрес последней цифры) 2. в регистр bl (например) записываешь 1 (это коэффициент, на который будем множить) 3. в регистр si (например) записываешь "длина строки" (это номер обрабатываемой цифры) 4. заводишь переменную "результат" и записываешь в нее 0 (без комментариев) 5. проверяешь, если si = 0, то переходишь на пункт (9) 6. считываешь байт по адресу dx, уменьшаешь его на 48 (код "0"), умножаешь на bl, результат прибавляешь к переменной "результат" 7. уменьшаешь dx и si на 1; умножаешь bl на 10 8. возвращаешься к пункту 5 9. готово Попохже может выложу код. |
Гыхм... Вот пример простенькой проги на асме для преобразования строки в число:
Код:
stak segment stack |
Algoritm wsegda odin i tot-je. Wopros - implementaciya ;-).
Ya delal nemnogo po-drugomu. Chital key s klawi, pinal w stek (esli ne 13 i ne 10), uwelichiwal kaunter kol-wa schitannih simwolow. Nu i dalee - 10 w stepeni nomer cifri esli schitat sprawa na lewo pomnojit na wwedenuju cifru i w akkumulyator (tipa Ax). Wwod simwolow mojno i po-drugomu sbacat. Smotri doku po int 21h dlya DOS'a, nomer funkcii pozowlyajushei schitiwat stroki s stdin. A dalshe - algoritm tot-je ;-). |
helldomain
Насчет ввода: я писал прогу только для конвертации, т.е. здесь нет ни процедуры ввода, ни определения длины строки, ни вывода результата. Только исходные данные и преобразование. Насчет преобразования на лету (т.е. при вводе): можно и так, тогда отпадает необходимость в постоянном преобразовании из строки в число и обратно (для вывода на экран и произведения арифметических действий), но увеличивается объем памяти под переменные, поскольку приходится хранить и само введенное число, и его строковое представление. |
2 Ghost, Helldomain
Nu rebyat, spasibo vam ogromnoe, vyruchili! A to vremya podjimaet... |
Ghost, preobrazowanie w realtaime ne wozmojno pri pobukwennom wwode - ti ne znaesh, skolko budet cifr.
|
helldomain
Очень даже возможно: - вводим первый символ, преобразуем его в цифру и записываем в 'res'; - вводим второй, преобразуем, и добавлям его к 'res', предварительно умножив 'res' на 10; - и т.д. Такой способ вполне пойдет, если ввод не будет использовать никаких управляющих клавиш кроме "ENTER" (и "BACKSPACE"). Но если добавить еще и управление курсором (влево, вправо, вначало, вконец) и удаление текущего символа (delete), вот тогда действительно невозможно. Точнее, можно, на выигрыша от этого никакого не будет, поскольку алгоритм чересчур усложниться. |
Еще разрешите вопросик: где найти документацию по WinAPI на асме?
Заранее бдлагодарен. |
2 n0n
если ты пользуешь что-нить из Visual C++, Borland C++ Builder, Borland Delphi, то там обычно в комплекте идет хелп с заголовком что-то типа Win32 Programming reference, от туда можно взять описание функций с числом и типом параметров, а вот значения констант можно выцепить из заголовочных фалов в случае с С++, а в случае с делфи львиная доля находится в Windows.pas |
Doka po API: http://msdn.microsoft.com/
Ghost: xmm. Ti ne rulish ;-). Tebe nado digit umnojat na 10 w stepeni n, gde n - poryadkowij nomer digita sprawo na lewo. |
helldomain
Хи-хи. ;) Ты мой пост внимательно читал? Алгоритм посимвольного ввода с одновременным преобразованием строки в число я предложил такой:
|
Вот. Наколбасил прогу. Прогнал в TurboDebugger'е - усё пашет:
Код:
stak segment stack |
Ghost poluchaet karmu ;-).
|
| Часовой пояс GMT +4, время: 17:01. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.