Простой арифмометр с целыми положительными числами, конвертация по Р.Мареку:
...
data:
stroka db 15 dup (?),0
rezult dd ?
...
nabor: ;обработка кнопок полного цикла
push 15
push offset stroka ;получаем содержимое дисплея
push [hedt]
call GetWindowTextA@12
add eax,offset stroka ;добавляем его в ЕАХ
push 15
push eax ;туда-же добавляем
push [EBP+14h] ;символ нажатой кнопки
call GetWindowTextA@12
call settext
mov esi,eax ;сбрасываем число в ESI, EAX - на очистку
jmp exit
...
plus: ;набираем 1-е число-строку и жмём "+"...одна из 4-х кнопок
;операций, начало цикла
mov edi,hbutS ;фиксируем тип операции
call asc2dec ;преобразуем ASCII-символы в 1-e дес.число --> ЕВХ
mov eax,ebx ;копируем 1-e дес.число --> EAX
call clearproc ;очищаем дисплей
...
plus_ex: ;набираем 2-е число-строку и жмём "="
xor edi,edi ;убираем хэндл кнопки из EDI
call asc2dec ;преобразуем ASCII-символы во 2-е дес. число --> EBX
add eax,ebx ;сумма-итог в ЕАХ
mov rezult,eax ;сохраняем итог в rezult
xor eax,eax ;очищаем ЕАХ (скопировал - очисти)
call clearproc ;очищаем дисплей
call dec2asc ;преобразуем дес. число в ASCII-строку и...
call settext ;...добавляем её на дисплей
jmp exit ;окончание "цикла" одной из 4-х операционных кнопок
...
exit: ;заканчиваем работу программы
xor eax,eax
xor ebx,ebx
jmp finish
...
finish:
pop edi
pop esi
pop ebx
pop ebp
ret 16
...
;преобразуем строку в дес.число: суть --> 1234 = ((((1)*10 + 2)*10 + 3)*10) + 4
;вход --> ESI = stroka
;выход --> ЕВХ = дес. число
asc2dec proc
mov ecx,0Ah ;ECX = основание системы счисления
xor ebx,ebx ;ЕВХ = 0 <-- под десятичное число
cycl: ;после набора --> mov esi,eax и еах --> 0
lodsb ;записываем байт из ES:ESI в AL
or al,al ;конец строки ?
jz exit ;если 0
sub al,"0" ;вычитаем 30h и сохраняем дес. цифру в AL
push eax ;сохраняем цифру в стеке - ЕАХ необходим для умножения
mov eax,ebx
mul ecx ;умножить ЕВХ на ЕСХ и...
mov ebx,eax ;...сохраняем в ЕВХ
pop eax ;достаём цифру из стека и...
add ebx,eax ;...складываем с содержимым EBX
jmp cycl ;и повторить
exit:
ret
asc2dec endp
;преобразуем дес.число в строку:
dec2asc proc ;выход: заполненная stroka
pushad ;сохраняем все регистры общего назначения
mov ebx,10h ;EBX = основание системы счисления
mov eax,rezult ;EAX = дес.число
lea edi,stroka ;EDI = указатель на строку
xor ecx,ecx ;ECX = 0 - счетчик цифр в стеке
conv: ;преобразуем число
xor edx,edx ;сюда - остаток от деления - цифра
div ebx ;делим ЕАХ на ЕВХ, частное в ЕАХ, остаток в EDX
add dl,"0" ;преобразуем остаток в ASCII-символ и...
push edx ;...запихиваем в стек
inc ecx ;увеличиваем счётчик цифр в стеке
or eax,eax ;частное(ЕАХ) = 0 ?
jnz conv ;если - нет, продолжаем
cld ;сбрасываем флаг направления DF, запись вперёд
write: ;записываем число
pop edx ;выталкиваем символы из стека
mov eax,edx ;копируем в ЕАХ
stosb ;записываем byte из AL в буфер по адресу ES:EDI
loop write ;если - нет, переходим к следующей цифре
mov byte ptr [edi],0 ;заканчиваем строку 0-вым байтом
popad
ret
dec2asc endp
...
end main
Примеры операций:
44 + 22 = 866762083(1563948387)...
44 - 22 = 866762083(1563948387)...
44 * 22 = 866762083(1563948387)...
44 : 22 = 866762083(1563948387)...в скобочках - после перезагрузки арифмометра
Что интересно - при наборе с клавы - результат другой. Помогите люди добрые - кто чем может.