ввод числа с клавиатуры и вывод, если нечетное
вводится строка, затем эта строка должна преобразоваться в число и если это число нечетное оно выводится на экран. Число не выводится, совсем не понимаю в чем проблема(мне необходим именно такой алгоритм, поскольку это будет частью другого кода)
ideal
P386N
Model Small
Dataseg
msg1 db 'Enter number:',0
num1 dw ?
msg2 db 'numbers:',0
address_vm dw 0b800h
attr db 1eh
buf DB 7 DUP(0)
buffer db 7 DUP(0)
;buffer db 10, 0 ; буфер для ввода
;координаты
x db 0
y db 0
Codeseg
proc input ;ввод с клавиатуры
mov al,160
mul [y]
mov di,ax
sub ax,ax
mov al,[x]
shl ax,1
add di,ax
lea si,[buffer]
m: mov dl,[x]
mov dh,[y]
mov ah,2
mov bh,0
int 10h
sub ax,ax
int 16h
cmp al,13
jz m3 ;выход
cmp al, '0'
jb m ; не является цифрой
cmp al, '9'
ja m ; не является цифрой
cmp al,32
jb m
mov [es:di],al
mov [si],al
inc di
inc di
cmp [x],79
jb m1
mov [x],0
inc [y]
jmp m
m1: inc [x]
jmp m
m3:
mov [byte si],0
mov cx,di ;преобразование строки в число
xor bx,bx
xor si,si
mov di,10
xor ax,ax
lea si, [buffer]
@@circle:
mov bl,[si]
inc si
sub bl,'0'
mul di
add ax,bx
loop @@circle
ret ; завершаем функцию преобразования
endp
proc string ;вывод строки
push bp
mov bp, sp
mov si, [bp+4]
mov al,160
mul [y]
mov di,ax
sub ax,ax
mov al,[x]
shl ax,1
add di,ax
mov ah,[attr]
@@m1: lodsb
or al,al
jz @@m2
stosw
inc [x]
jmp @@m1
@@m2:
pop bp
ret 4
endp
proc number ;вывод числа
push bp
mov bp, sp
mov ax, [bp+4]
lea si,[buf]
or ax,ax
jns @@m1
mov [byte si],'-'
neg ax
inc si
@@m1: mov di,si
xor cx,cx
mov bx,10
@@m2: xor dx,dx
div bx ;dx:ax/bx
add dx,48
mov[si],dl
inc si
inc cx
or ax,ax
jnz @@m2
mov [byte si],0
dec si
shr cx,1
jz @@m4
@@m3: mov al,[si]
xchg al,[di]
mov [si],al
inc di
dec si
loop @@m3
@@m4:
mov al,160
mul [y]
mov di,ax
sub ax,ax
mov al,[x]
shl ax,1
add di,ax
mov ah,[attr]
lea si,[buf]
@@m5: lodsb
or al,al
jz @@m6
stosw
inc [x]
jmp @@m5
@@m6: sub ax,ax
int 16h
pop bp
ret 2
endp
start:
mov ax, @Data
mov ds, ax
mov es, [address_vm]
mov ax, 500h
int 10h
;ввод
mov [x],0
inc [y]
lea di,[msg1]
push di
call string
xor ax,ax
call input ; вызов подпрограммы для ввода строки с клавиатуры
mov [num1], ax ; сохранение числа в текущей ячейке массива
mov [x],0
mov [y],8
xor ax,ax
lea di,[msg2]
push di
call string
mov ax,[num1]
test ax,1
jz @@next
push ax
call number
@@next:
sub ax,ax
int 16h
mov ax, 4c00h
int 21h
stack 1000
end start