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

Объяснение кода листинга программы

Список элементов:

  1. cifra proc - метка процедуры
  2. mov cx, BUF+1 - перемещение указателя на первый символ в буфере в регистр cx
  3. lea si, BUF+2 - перемещение указателя на второй символ в буфере в регистр si
  4. jcxz @@Error - если значение регистра cx равно нулю, то переход к метке @@Error
  5. mov al, [si] - перемещение значения символа в регистр al
  6. inc si - увеличение значения регистра si на единицу
  7. cmp al, '0' - сравнение значения регистра al со значением '0'
  8. jb @@Error - если значение регистра al меньше '0', то переход к метке @@Error
  9. cmp al, '9' - сравнение значения регистра al со значением '9'
  10. ja @@Error - если значение регистра al больше '9', то переход к метке @@Error
  11. loop @@While - цикл, выполняющийся до тех пор, пока не будет выполнено условие @@While
  12. mov al, [si] - перемещение значения символа в регистр al
  13. inc si - увеличение значения регистра si на единицу
  14. cmp al, '0' - сравнение значения регистра al со значением '0'
  15. jb @@Error - если значение регистра al меньше '0', то переход к метке @@Error
  16. cmp al, '9' - сравнение значения регистра al со значением '9'
  17. ja @@Error - если значение регистра al больше '9', то переход к метке @@Error
  18. loop @@While - цикл, выполняющийся до тех пор, пока не будет выполнено условие @@While
  19. mov al, [si] - перемещение значения символа в регистр al
  20. inc si - увеличение значения регистра si на единицу Примечание: В данном коде происходит проверка введенных пользователем символов на предмет их принадлежности к цифрам от 0 до 9. Если встречаются символы, не являющиеся цифрами, то выводится сообщение об ошибке.

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы