Есть код, но нужно к нему придумать проверку ввода. Идет запрос двух чисел десятичных. Вводим и они умножаются. Но если ввести любые символы, всё равно все множиться. Может у кого-то есть какие мысли по поводу как узнать все ли цифры? Уже все, что могла перепробовала. Ну кидаю то, что есть. Тут и жалкое подобие процедуры проверки и кусок вставленого кода проверки в Мейн....Помогите, если можете.
http://pastebin.com/z8K6C3PG
+файл инк) вдруг кто захочет попробовать запустить программный код)
http://pastebin.com/nhVfhTeh
Другие языки программирования и технологии
Ассемблер. Ввели строку в консоли - как узнать все ли там цифры или есть другие символы?
Хорошо, что вы привели *.inc, только забыли сообщить, для какого ассемблера (предположительно MASM) и какого пакета (явно не Masm32, так как эти заголовочные файлы нашлись только у JWasm, а макрос TEXTOEM вообще не нашёлся нигде) написана эта программа. Пакет, очень похоже, самодельный.
Программа для пакета Masm32 SDK, часть подпрограмм пришлось написать заново, фрагмент, вызвавший у вас затруднение, выделен жирным шрифтом:
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include msvcrt.inc
includelib kernel32.lib
includelib msvcrt.lib
StdOut proto stdcall :dword
StdIn proto stdcall :dword, :dword
InputDecimal proto stdcall :dword, :dword, :dword
.data
ConsoleTitle db "Организация операций ввода и вывода",0
PromptA db "Число в десятичной системе счисления A = ",0
PromptB db "Число в десятичной системе счисления B = ",0
Error db "Ошибка! Это не десятичное число. Повторите ввод. ",13,10,0
Result db "A * B равно",13,10
db "в десятичной системе счисления: ",0
PromptQ db 13,10,"Нажать Enter для завершения... ",0
.code
start:
call Main
invoke ExitProcess,0
Main proc
local Buffer[128]:byte
invoke AllocConsole
invoke SetConsoleTitle, addr ConsoleTitle
lea esi,Buffer
invoke InputDecimal,addr PromptA,esi,128
mov ebx,eax
invoke InputDecimal,addr PromptB,esi,128
mul ebx
mov ebx,eax
invoke StdOut,addr Result
mov edi,esi
mov eax,ebx
call uBinToDecASCII
invoke StdOut,edi
invoke StdOut,addr PromptQ
invoke StdIn, addr Buffer, lengthof Buffer
ret
Main endp
StdOut proc uses eax ecx edx,lpMessage:dword
invoke crt_printf,lpMessage
ret
StdOut endp
StdIn proc uses eax ebx,lpBuff:dword,BuffLen:dword
local Len:dword
invoke GetStdHandle,STD_INPUT_HANDLE
lea ebx,Len
invoke ReadConsole,eax,lpBuff,BuffLen,ebx,0
ret
StdIn endp
InputDecimal proc uses esi edi,lpMess:dword,lpBuff:dword,BuffLen:dword
RepInput:
invoke StdOut,lpMess
mov edi,lpBuff
invoke StdIn,edi,BuffLen
mov al,0Dh
mov ecx,BuffLen
repne scasb
mov word ptr [edi-1],0
@@: lodsb
.if al == 0
jmp @F
.elseif al >= '0' && al <= '9'
jmp @B
.else
invoke StdOut,addr Error
jmp RepInput
.endif
@@:
mov esi,lpBuff
call uDecASCIIToBin
ret
InputDecimal endp
uDecASCIIToBin proc uses esi ebx edx
;Вход: ESI - адрес ASCIIZ-строки
;Выход: EAX - число
xor ebx,ebx
@@: lodsb
or al,al
jz @F
and eax,0Fh
xchg eax,ebx
mov edx,10
mul edx
add ebx,eax
jmp @B
@@: mov eax,ebx
ret
uDecASCIIToBin endp
uBinToDecASCII proc uses esi edi ebx
;Вход: EAX - число, EDI - адрес буфера не меньше 10 байт
mov esi,edi
mov ebx,10
@@: xor edx,edx
div ebx
or dl,30h
mov byte ptr [esi],dl
inc esi
or eax,eax
jnz @B
mov byte ptr [esi],0
@@: dec esi
mov al,byte ptr [esi]
xchg byte ptr [edi],al
mov byte ptr [esi],al
inc edi
cmp edi,esi
jb @B
ret
uBinToDecASCII endp
end start

Программа для пакета Masm32 SDK, часть подпрограмм пришлось написать заново, фрагмент, вызвавший у вас затруднение, выделен жирным шрифтом:
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include msvcrt.inc
includelib kernel32.lib
includelib msvcrt.lib
StdOut proto stdcall :dword
StdIn proto stdcall :dword, :dword
InputDecimal proto stdcall :dword, :dword, :dword
.data
ConsoleTitle db "Организация операций ввода и вывода",0
PromptA db "Число в десятичной системе счисления A = ",0
PromptB db "Число в десятичной системе счисления B = ",0
Error db "Ошибка! Это не десятичное число. Повторите ввод. ",13,10,0
Result db "A * B равно",13,10
db "в десятичной системе счисления: ",0
PromptQ db 13,10,"Нажать Enter для завершения... ",0
.code
start:
call Main
invoke ExitProcess,0
Main proc
local Buffer[128]:byte
invoke AllocConsole
invoke SetConsoleTitle, addr ConsoleTitle
lea esi,Buffer
invoke InputDecimal,addr PromptA,esi,128
mov ebx,eax
invoke InputDecimal,addr PromptB,esi,128
mul ebx
mov ebx,eax
invoke StdOut,addr Result
mov edi,esi
mov eax,ebx
call uBinToDecASCII
invoke StdOut,edi
invoke StdOut,addr PromptQ
invoke StdIn, addr Buffer, lengthof Buffer
ret
Main endp
StdOut proc uses eax ecx edx,lpMessage:dword
invoke crt_printf,lpMessage
ret
StdOut endp
StdIn proc uses eax ebx,lpBuff:dword,BuffLen:dword
local Len:dword
invoke GetStdHandle,STD_INPUT_HANDLE
lea ebx,Len
invoke ReadConsole,eax,lpBuff,BuffLen,ebx,0
ret
StdIn endp
InputDecimal proc uses esi edi,lpMess:dword,lpBuff:dword,BuffLen:dword
RepInput:
invoke StdOut,lpMess
mov edi,lpBuff
invoke StdIn,edi,BuffLen
mov al,0Dh
mov ecx,BuffLen
repne scasb
mov word ptr [edi-1],0
@@: lodsb
.if al == 0
jmp @F
.elseif al >= '0' && al <= '9'
jmp @B
.else
invoke StdOut,addr Error
jmp RepInput
.endif
@@:
mov esi,lpBuff
call uDecASCIIToBin
ret
InputDecimal endp
uDecASCIIToBin proc uses esi ebx edx
;Вход: ESI - адрес ASCIIZ-строки
;Выход: EAX - число
xor ebx,ebx
@@: lodsb
or al,al
jz @F
and eax,0Fh
xchg eax,ebx
mov edx,10
mul edx
add ebx,eax
jmp @B
@@: mov eax,ebx
ret
uDecASCIIToBin endp
uBinToDecASCII proc uses esi edi ebx
;Вход: EAX - число, EDI - адрес буфера не меньше 10 байт
mov esi,edi
mov ebx,10
@@: xor edx,edx
div ebx
or dl,30h
mov byte ptr [esi],dl
inc esi
or eax,eax
jnz @B
mov byte ptr [esi],0
@@: dec esi
mov al,byte ptr [esi]
xchg byte ptr [edi],al
mov byte ptr [esi],al
inc edi
cmp edi,esi
jb @B
ret
uBinToDecASCII endp
end start

отфильтруйте полученную строку.
Сл Киряковы
советую сначала получить строку, потом прогнать ее по условию: .if al>= '0' and al
Ну идея такая: когда вводится символ, то сравниваем его с '0' - должен быть больше либо равен, и '9' - должен быть меньше или равен. Это верно, так как символы цифр в ASCII идут подряд. Ну а дальше дело техники.
Андрей Сунгуров
Та пытаюсь, уже с каких сторон только не подходила к этому вопросу)
Похожие вопросы
- Как ввести новую строку в консоль, чтобы переменная счета увеличилась? С++
- задача на ассемблере: ввести предложение и заменить в нем символ "а" на символ "о" и наоборот Напишите код пожалуйста
- Ассемблер (TASM). Нужно ввести строку и с помощу команд обработки цепочек подсчитать кол-во русской буквы "в" в строке
- Вопрос по Ассемблеру - Ввести с клавы 3 слова и вывести их на экран лесенкой Tasm
- Пользователь вводит строку. Найти и вывести из строки римские цифры от 1 до 5, введенные прописными символами.
- Програма на С++ Ввести с клавиатуры строку символов и перевернуть каждое четное слово в строке.
- ассемблер, проверка длины строки
- Строки ассемблер нужно заполнить строку (10) рандомными символами. (MASM) как? помогите!
- FASM. Замена символов в строке, используя подпрограммы.
- написать программу на ассемблере: найти (в строке) и вывести слово, у которого код первого символа наибольший