Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ассемблер. Ввели строку в консоли - как узнать все ли там цифры или есть другие символы?

Елизавета Данилова Профи (521), закрыт 11 лет назад
Есть код, но нужно к нему придумать проверку ввода. Идет запрос двух чисел десятичных. Вводим и они умножаются. Но если ввести любые символы, всё равно все множиться. Может у кого-то есть какие мысли по поводу как узнать все ли цифры? Уже все, что могла перепробовала. Ну кидаю то, что есть. Тут и жалкое подобие процедуры проверки и кусок вставленого кода проверки в Мейн....Помогите, если можете.
http://pastebin.com/z8K6C3PG
+файл инк) вдруг кто захочет попробовать запустить программный код)
http://pastebin.com/nhVfhTeh
Лучший ответ
Миоко Таканава Гений (51590) 11 лет назад
Хорошо, что вы привели *.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

Остальные ответы
Серж Мыслитель (5321) 11 лет назад
Ну идея такая: когда вводится символ, то сравниваем его с '0' - должен быть больше либо равен, и '9' - должен быть меньше или равен. Это верно, так как символы цифр в ASCII идут подряд. Ну а дальше дело техники.
Елизавета ДаниловаПрофи (521) 11 лет назад
Та пытаюсь, уже с каких сторон только не подходила к этому вопросу)
Άηϑρέΰ ҂ Искусственный Интеллект (179996) 11 лет назад
отфильтруйте полученную строку.
Άηϑρέΰ ҂Искусственный Интеллект (179996) 11 лет назад
советую сначала получить строку, потом прогнать ее по условию: .if al>= '0' and al<='9' и в результате получите только цифры (если такие будут) если длина строки получится = 0 то по умолчанию считайте что пользователь ввел 0.
Похожие вопросы