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