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