Ввод двух целых чисел и проверка этих чисел условиями - 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
Объяснение кода листинга программы
Код на ассемблере выполняет ввод двух целых чисел и проверяет их условиями. Список действий:
- Ввод строки и преобразование её в число.
- Проверка символа на принадлежность цифрам.
- Обработка результатов ввода.
- Проверка первого числа на отрицательность.
- Проверка второго числа на позитивнось.
- Вывод символа
+
или-
в зависимости от результатов проверки. - Вывод сообщения об ошибке в случае некорректного ввода.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д