Ввод двух целых чисел и проверка этих чисел условиями - Assembler

Узнай цену своей работы

Формулировка задачи:

Задача в том, что нужно ввести два числа и проверить: если 1-е отрицательное и 2-е положительное то вывести '+', если нет то '-'. Без ввода чисел всё работало, а вот с вводом что только не пытался сделать, всё в никуда, т.к. в асм полный 0. Вот то что я попытался сделать по примерам:
.model small
.stack 100h
.data
    string db 255,0,255 dup(?)
    ermsg db 'Error$'
    negflag dw ?
.code
s:
    mov ah,0ah
    lea dx,string
    int 21h
    xor ax,ax
    lea si,string+2
    mov negflag,ax
    
    cmp byte ptr [si],'-'
    jne z2
    not negflag
    inc si
    jmp z
z2:
    cmp byte ptr [si],'+'
    jne z
    inc si
z:
    cmp byte ptr [si],0Dh
    je ex1
    cmp byte ptr [si],'0'
    jb er
    cmp byte ptr [si],'9'
    ja er
    
    mov bx,10
    mul bx
    sub byte ptr [si],'0'
    add al,[si]
    adc ah,0
    inc si
    jmp z
ex1:
    cmp negflag,0
    je viv
    neg ax
viv:
    push ax
    mov ah,02       ;новая строка
    mov dl,0Ah
    
    int 21h
    pop ax
    xor cx,cx
    
    cmp ax,0        ;проверка первого числа на отрицательность
    jge no          ;ax=>0? Да - прыгаем на no:
    
    mov bx,1
    cmp bx,0        ;проверка второго числа на позитивнось
    jle no          ;bx<=0? Да - прыгаем на no:
    
    mov ah,02
    mov dl,'+'      ;выводим + если все верно
    int 21h
    jmp endo
no:
    mov ah,02
    mov dl,'-'      ;выводим - когда не верно
    int 21h
    jmp endo
er:
    mov ah,02
    mov dl,0Ah
    int 21h
    lea dx,ermsg
    mov ah,9
    int 21h
    jmp s
endo:
    mov ah,4Ch
    int 21h
end s
end

Решение задачи: «Ввод двух целых чисел и проверка этих чисел условиями»

textual
Листинг программы
.model small
 
.stack 100h
 
.data
 
    string      db      255,0,255 dup(?)
    ermsg       db      'Error$'
    negflag     dw      ?
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод строки и преобразование её в число
@@start:
        ;ввод строки
        mov     ah,     0ah
        lea     dx,     string
        int     21h
 
        xor     ax,     ax              ;ax - число, итог преобразований
        lea     si,     string+2
        mov     negflag,ax
 
        cmp     byte ptr [si],'-'
        jne     z2
        not     negflag
        inc     si
        jmp     @@NextChar
z2:
        cmp     byte ptr [si],'+'
        jne     @@NextChar
        inc     si
@@NextChar:
        ;если конец строки - завершить преобразование
        cmp     byte ptr [si],0Dh
        je      ex1
        ;проверка символа на принадлежность цифрам
        cmp     byte ptr [si],'0'
        jb      er
        cmp     byte ptr [si],'9'
        ja      er
 
        mov     bx,     10
        mul     bx
        sub     byte ptr [si],'0'
        add     al,     [si]
        adc     ah,     0
        inc     si
        jmp     @@NextChar
ex1:
        cmp     negflag,0
        je      viv
        neg     ax
 
        ;обработка результатов ввода
viv:
        push    ax
        mov     ah,     02      ;новая строка
        mov     dl,     0Ah
        int     21h
        pop     ax
        xor     cx,     cx
 
        cmp     ax,     0       ;проверка первого числа на отрицательность
        jge     no              ;ax=>0? Да - прыгаем на no:
 
        mov     bx,     1
        cmp     bx,     0       ;проверка второго числа на позитивнось
        jle     no              ;bx<=0? Да - прыгаем на no:
 
        mov     ah,     02
        mov     dl,     '+'     ;выводим + если все верно
        int     21h
        jmp     endo
no:
        mov     ah,     02
        mov     dl,     '-'     ;выводим - когда не верно
        int     21h
        jmp     endo
er:
        mov     ah,     02
        mov     dl,     0Ah
        int     21h
        lea     dx,     ermsg
        mov     ah,     9
        int     21h
        jmp     @@start
endo:
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

Код на ассемблере выполняет ввод двух целых чисел и проверяет их условиями. Список действий:

  1. Ввод строки и преобразование её в число.
  2. Проверка символа на принадлежность цифрам.
  3. Обработка результатов ввода.
  4. Проверка первого числа на отрицательность.
  5. Проверка второго числа на позитивнось.
  6. Вывод символа + или - в зависимости от результатов проверки.
  7. Вывод сообщения об ошибке в случае некорректного ввода.
  8. Завершение работы программы.

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

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