обьясните пожалуйста код программы

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
geret
Сообщения: 2
Зарегистрирован: 08 май 2007, 13:40

Здраствуйте, помогите разобраться кодом данной программы, нашел исходник, но не совсем могу понять как он работает. если не сложно, напишите коментарий после каждой строки, очень хочу разобраться. особенно не понятно как работает прерывания 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 :D 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
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Int 29h - Fast character output - быстрый вывод символа на экран из регистра AL через драйвер консоли. Данная функция может не является обязательной и может не поддерживаться MS-DOS.
Int 21h func 07 - Character read without echo - чтение символа без отображения на экране. Символ попадает в регистр AL.
Int 21h func 09 - Вывод строки символов с завершающим нулем по адресу DS :D X.
Int 21h func 4C - завершение работы программы с кодом завершения в регистре AL
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere писал(а):Int 21h func 09 - Вывод строки символов с завершающим нулем по адресу DS :D X.
по адресу DS : DX, конечно же имелось в виду :LOL:
(вот подобную "шутку" форума я, в частности, и называю чрезмерным интеллектом программы :) )
Ответить