обьясните пожалуйста код программы
Добавлено: 24 май 2007, 01:11
Здраствуйте, помогите разобраться кодом данной программы, нашел исходник, но не совсем могу понять как он работает. если не сложно, напишите коментарий после каждой строки, очень хочу разобраться. особенно не понятно как работает прерывания int 21h, int 29h; Заранее спасибо
TITLE program.asm
DAN SEGMENT
num_size equ 10
dataArray dw num_size dup(?)
error_input db 13,10,'very big number please input again',13,10,'$'
mess_big db 13,10,'maximum:$'
mess_low db 13,10,'minimum:$'
mess_one db 13,10,'quotient:$'
mess_two db 13,10,'remainder:$'
dan ends
code segment
ASSUME CS:CODE,DS
AN
start: MOV AX,DAN
mov ds,ax
mov es,ax
mov cx,num_size
mov di,offset dataArray
cld
input_Loop: push cx
xor dx,dx
mov [di],dx
mov al,':'
int 29h
input_numb: mov ah,07h
int 21h
cmp al,13
jz input_stop
cmp al,'0'
jl input_numb
cmp al,'9'
jg input_numb
push ax
int 29h
mov ax,[di]
mov bx,10
mul bx
pop bx
or dx,dx
jnz input_error
and bx,0fh
add ax,bx
mov [di],ax
jmp short input_numb
input_error: mov ah,9
mov dx,offset error_input
int 21h
pop cx
jmp short input_Loop
input_stop: inc di
inc di
call next_line
pop cx
loop input_Loop
mov si,offset dataArray
mov cx,num_size-1
lodsw
mov bx,ax;
mov dx,ax;
;check
check_numb: lodsw
cmp ax,bx
ja check_big
mov bx,ax;
jmp short check_next
check_big: cmp ax,dx
jb check_next
mov dx,ax;
check_next: loop check_numb
push bx;
push dx
mov ah,9
mov dx,offset mess_big
int 21h
pop ax
push ax
call out_dec
mov ah,9
mov dx,offset mess_low
int 21h
pop bx
pop ax
push ax
push bx
call out_dec
pop ax
pop bx
xor dx,dx
div bx
push dx
push ax
mov ah,9
mov dx,offset mess_one
int 21h
pop ax
call out_dec
mov ah,9
mov dx,offset mess_two
int 21h
pop ax
call out_dec
mov ah,4ch
int 21h
next_line: mov al,13
int 29h
mov al,10
int 29h
ret
out_dec: xor cx,cx
mov bx,10
out_dec_div: xor dx,dx
div bx
or dx,30h;
push dx;
inc cx;
or ax,ax;
jnz out_dec_div
out_dec_out: pop ax;
int 29h;
loop out_dec_out
ret
MOV AX, 4C00H
INT 21H
code ENDS
END start
TITLE program.asm
DAN SEGMENT
num_size equ 10
dataArray dw num_size dup(?)
error_input db 13,10,'very big number please input again',13,10,'$'
mess_big db 13,10,'maximum:$'
mess_low db 13,10,'minimum:$'
mess_one db 13,10,'quotient:$'
mess_two db 13,10,'remainder:$'
dan ends
code segment
ASSUME CS:CODE,DS

start: MOV AX,DAN
mov ds,ax
mov es,ax
mov cx,num_size
mov di,offset dataArray
cld
input_Loop: push cx
xor dx,dx
mov [di],dx
mov al,':'
int 29h
input_numb: mov ah,07h
int 21h
cmp al,13
jz input_stop
cmp al,'0'
jl input_numb
cmp al,'9'
jg input_numb
push ax
int 29h
mov ax,[di]
mov bx,10
mul bx
pop bx
or dx,dx
jnz input_error
and bx,0fh
add ax,bx
mov [di],ax
jmp short input_numb
input_error: mov ah,9
mov dx,offset error_input
int 21h
pop cx
jmp short input_Loop
input_stop: inc di
inc di
call next_line
pop cx
loop input_Loop
mov si,offset dataArray
mov cx,num_size-1
lodsw
mov bx,ax;
mov dx,ax;
;check
check_numb: lodsw
cmp ax,bx
ja check_big
mov bx,ax;
jmp short check_next
check_big: cmp ax,dx
jb check_next
mov dx,ax;
check_next: loop check_numb
push bx;
push dx
mov ah,9
mov dx,offset mess_big
int 21h
pop ax
push ax
call out_dec
mov ah,9
mov dx,offset mess_low
int 21h
pop bx
pop ax
push ax
push bx
call out_dec
pop ax
pop bx
xor dx,dx
div bx
push dx
push ax
mov ah,9
mov dx,offset mess_one
int 21h
pop ax
call out_dec
mov ah,9
mov dx,offset mess_two
int 21h
pop ax
call out_dec
mov ah,4ch
int 21h
next_line: mov al,13
int 29h
mov al,10
int 29h
ret
out_dec: xor cx,cx
mov bx,10
out_dec_div: xor dx,dx
div bx
or dx,30h;
push dx;
inc cx;
or ax,ax;
jnz out_dec_div
out_dec_out: pop ax;
int 29h;
loop out_dec_out
ret
MOV AX, 4C00H
INT 21H
code ENDS
END start