Нужна процедура, которая сообщает об ошибке при вводе букв вместо цифр - Assembler
Формулировка задачи:
привет. У меня программа , которая переводит введеное в 10с.с число в 2 с.с, но не получается процедура,которая сообщает об ощибке,при вводе букв вместо цифр. Кидаю код основы, а ниже,после "////////////" процедура проверки. Буду признательна,если скажете,в чем дело (вставляла в код,но программа работала при любом вводе,даже неверном)
Листинг программы
- STAK SEGMENT STACK
- DB 256 DUP (?)
- STAK ENDS
- DATA SEGMENT
- BUF DB 5, 00, 6 DUP ('$')
- OUTBUF DB 13, 10, 16 DUP ('0'), '$'
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS:STAK
- READ PROC
- MOV AH, 0AH
- LEA DX, BUF
- INT 21H
- RET
- READ ENDP
- PRINT PROC
- MOV AH, 09H
- LEA DX, OUTBUF
- INT 21H
- RET
- PRINT ENDP
- STR_TO_NUM PROC
- MOV DI, 0
- LEA BX, BUF + 1
- MOV CX, [BX]
- XOR CH, CH
- MOV SI, 1
- M1: PUSH SI
- MOV SI, CX
- MOV AX, [BX+SI]
- XOR AH, AH
- POP SI
- SUB AX, 30H
- MUL SI
- ADD DI, AX
- MOV AX, SI
- MOV DX, 10D
- MUL DX
- MOV SI, AX
- LOOP M1
- STR_TO_NUM
- ENDP
- DEC_TO_BIN PROC
- MOV BX, DI
- LEA SI, OUTBUF + 2
- MOV CX, 10h
- DB2: SHL BX, 1
- JC DB1
- MOV BYTE PTR [SI], '0'
- JMP DB3
- DB1: MOV BYTE PTR [SI], '1'
- DB3: INC SI
- LOOP DB2
- RET
- DEC_TO_BIN ENDP
- START:
- XOR AX, AX
- MOV BX, DATA
- MOV DS, BX
- CALL READ
- CALL STR_TO_NUM
- CALL DEC_TO_BIN
- CALL PRINT
- MOV AH, 4CH
- INT 21H
- CODE ENDS
- END START
- //////////////////////////////////////////////////
- cifra proc
- error: txt db 0dh,0ah, "error", 0dh,0ah, "$"
- lea DX, txt
- end cifra
Решение задачи: «Нужна процедура, которая сообщает об ошибке при вводе букв вместо цифр»
textual
Листинг программы
- cifra proc
- mov cx, BUF+1
- lea si, BUF+2
- jcxz @@Error
- @@While:
- mov al, [si]
- inc si
- cmp al, '0'
- jb @@Error
- cmp al, '9'
- ja @@Error
- loop @@While
- @@Ok:
- ret
- @@Error:
- MOV AH, 0AH
- LEA DX, error
- INT 21H
- ret
- cifra endp
Объяснение кода листинга программы
Список элементов:
- cifra proc - метка процедуры
- mov cx, BUF+1 - перемещение указателя на первый символ в буфере в регистр cx
- lea si, BUF+2 - перемещение указателя на второй символ в буфере в регистр si
- jcxz @@Error - если значение регистра cx равно нулю, то переход к метке @@Error
- mov al, [si] - перемещение значения символа в регистр al
- inc si - увеличение значения регистра si на единицу
- cmp al, '0' - сравнение значения регистра al со значением '0'
- jb @@Error - если значение регистра al меньше '0', то переход к метке @@Error
- cmp al, '9' - сравнение значения регистра al со значением '9'
- ja @@Error - если значение регистра al больше '9', то переход к метке @@Error
- loop @@While - цикл, выполняющийся до тех пор, пока не будет выполнено условие @@While
- mov al, [si] - перемещение значения символа в регистр al
- inc si - увеличение значения регистра si на единицу
- cmp al, '0' - сравнение значения регистра al со значением '0'
- jb @@Error - если значение регистра al меньше '0', то переход к метке @@Error
- cmp al, '9' - сравнение значения регистра al со значением '9'
- ja @@Error - если значение регистра al больше '9', то переход к метке @@Error
- loop @@While - цикл, выполняющийся до тех пор, пока не будет выполнено условие @@While
- mov al, [si] - перемещение значения символа в регистр al
- inc si - увеличение значения регистра si на единицу Примечание: В данном коде происходит проверка введенных пользователем символов на предмет их принадлежности к цифрам от 0 до 9. Если встречаются символы, не являющиеся цифрами, то выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д