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