ввод числа с клавиатуры и вывод, если нечетное

вводится строка, затем эта строка должна преобразоваться в число и если это число нечетное оно выводится на экран. Число не выводится, совсем не понимаю в чем проблема(мне необходим именно такой алгоритм, поскольку это будет частью другого кода)

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

Ответы (0 шт):