| imho.ws |
![]() |
|
|
|
# 1 |
|
Newbie
Регистрация: 11.01.2003
Адрес: c:\windows\system32
Сообщения: 28
![]() |
Подскажите пожалуйста как конвертировать данные введенные с клавы, в числа с которыми я далее мог бы оперировать (+,-,*,/ и т.д.). Как я понял это конвертация (String to DB,DW). Если кто знает помогите, это очень срочно. Заранее спасибо.
|
|
|
|
|
# 2 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Встроенной процедуры, как ты понимаешь, для этого нет. Последний раз писал на асме очень давно, поэтому написать код не могу (может попозже), но алгоритм таков:
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. готово Попохже может выложу код.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 3 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Гыхм... Вот пример простенькой проги на асме для преобразования строки в число:
Код:
stak segment stack db 128 dup (?) stak ends data segment sc db '123' ; string content sl dw 3 ; string length dc dw ? ; convert result data ends code segment assume ds:data,cs:code start: mov ax,data mov ds,ax ; detect adress of last symbol in string lea di, sc add di, sl dec di ; initialize si and bl mov si, sl mov bx, 1 ; initialize variable 'dc' mov ax, 0 mov dc, ax ; start convert circle convert: ; verify: si > 0; else goto to end circle cmp si, 0 je cnv_end ; read and covert digit mov ah, 0 mov al, [di] sub al, 48 mul bx ; summ with 'dc' add ax, dc mov dc, ax ; decrease si and di dec si dec di ; mul bl 10x mov ax, bx mov bx, 10 mul bx mov bx, ax ; goto circle start jmp convert cnv_end: ; cotvert complit, see variable 'dc' mov ah,4ch int 21h code ends end start
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 4 |
|
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
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 ;-).
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
|
|
|
|
# 5 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
helldomain
Насчет ввода: я писал прогу только для конвертации, т.е. здесь нет ни процедуры ввода, ни определения длины строки, ни вывода результата. Только исходные данные и преобразование. Насчет преобразования на лету (т.е. при вводе): можно и так, тогда отпадает необходимость в постоянном преобразовании из строки в число и обратно (для вывода на экран и произведения арифметических действий), но увеличивается объем памяти под переменные, поскольку приходится хранить и само введенное число, и его строковое представление.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 7 |
|
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ghost, preobrazowanie w realtaime ne wozmojno pri pobukwennom wwode - ti ne znaesh, skolko budet cifr.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
|
|
|
|
# 8 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
helldomain
Очень даже возможно: - вводим первый символ, преобразуем его в цифру и записываем в 'res'; - вводим второй, преобразуем, и добавлям его к 'res', предварительно умножив 'res' на 10; - и т.д. Такой способ вполне пойдет, если ввод не будет использовать никаких управляющих клавиш кроме "ENTER" (и "BACKSPACE"). Но если добавить еще и управление курсором (влево, вправо, вначало, вконец) и удаление текущего символа (delete), вот тогда действительно невозможно. Точнее, можно, на выигрыша от этого никакого не будет, поскольку алгоритм чересчур усложниться.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 10 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
2 n0n
если ты пользуешь что-нить из Visual C++, Borland C++ Builder, Borland Delphi, то там обычно в комплекте идет хелп с заголовком что-то типа Win32 Programming reference, от туда можно взять описание функций с числом и типом параметров, а вот значения констант можно выцепить из заголовочных фалов в случае с С++, а в случае с делфи львиная доля находится в Windows.pas |
|
|
|
|
# 11 |
|
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
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.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
|
|
|
|
# 12 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
helldomain
Хи-хи. Ты мой пост внимательно читал? Алгоритм посимвольного ввода с одновременным преобразованием строки в число я предложил такой:
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 27.04.2004 в 19:18. Причина: Очередной приступ склероза |
|
|
|
|
# 13 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Вот. Наколбасил прогу. Прогнал в TurboDebugger'е - усё пашет:
Код:
stak segment stack
db 128 dup (?)
stak ends
data segment
rs dw 0 ; результат преобразования
dg dw 0 ; введенная цифра
sm dw 0 ; введенный символ
data ends
code segment
assume ds:data,cs:code
start:
mov ax, data
mov ds, ax
; ----------------------------------------------
ent_beg: ; начало ввода и преобразования
mov ah, 07h ; вводим с
int 21h ; клавиатуры
mov ah, 00h ; символ в
mov sm, ax ; переменную 'sm'
cmp ax, 0Dh ; если 'sm' = #13 (ENTER)
je ent_end ; то конец ввода => ent_end
cmp ax, 08h ; если 'sm' = #8 (BACKSPACE)
je ent_bsp ; то => ent_bsp
cmp ax, 30h ; если 'sm' < #48 ('0')
jb ent_beg ; или
cmp ax, 39h ; если 'sm' > #57 ('9')
ja ent_beg ; то повторяем ввод => ent_beg
sub ax, 30h ; преобразуем символ 'sm'
mov dg, ax ; в цифру 'dg' = ord('sm') - 48
mov ax, rs ; вычисляем значение
mov bx, 10 ; выражения 10*'rs'+'dg'
mul bx ; и если результат вызывает
jo ent_beg ; переполнение при умножении
add ax, dg ; или перенос при сложении
jc ent_beg ; то повторяем ввод => ent_beg
mov rs, ax ; сохраняем результат
mov dx, sm ; выводим на экран
mov ah, 02h ; введенный с клавиатуры
int 21h ; символ 'sm' и
jmp ent_beg ; возврат на начало => ent_beg
ent_bsp: ; обработка нажатия 'backspace'
mov ax, rs ; если 'rs' = 0, т.е.
cmp ax, 0 ; строка ввода пуста, то
je ent_beg ; возврат на начало => ent_beg
mov dl, 08h ; возвращаем указатель
mov ah, 02h ; курсора на предыдущую
int 21h ; позицию
mov dl, 20h ; стираем предыдущий
mov ah, 02h ; введенный символ, выведя
int 21h ; на его место пробел
mov dl, 08h ; возвращаем указатель
mov ah, 02h ; курсора на предыдущую
int 21h ; позицию
mov dx, 0 ; делим нацело текущий
mov ax, rs ; результат преобразования
mov bx, 10 ; на 10 и запоминаем
div bx ; частное как новый
mov rs, ax ; результат преобразования
jmp ent_beg ; возврат на начало => ent_beg
ent_end: ; конец ввода и преобразования
; ----------------------------------------------
mov ah, 4ch
int 21h
code ends
end start
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 14 |
|
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ghost poluchaet karmu ;-).
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
|
|