Нужна процедура, которая сообщает об ошибке при вводе букв вместо цифр - 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. Если встречаются символы, не являющиеся цифрами, то выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д