Другие языки программирования и технологии

Нужна помощь с программой на ассемблере - комментирование каждой строки

Есть программа для вычисления факториала на ассемблере. Буду очень рад если кто нибудь сделает подробный коммент к каждой строке, что программа делает в ней.TITLE prog3.asm ;расчет факториалаstacksg segment stack dw 32 dup(32)stacksg endsdatasg segment vv db 'Введите аргумент M (не больше 7)$'viv db 13,10,'Значение факториала $'ii dw ?ir dw 1sr db 5 dup(0) db 13,10,'$'ft10 db 1 buf db 2,0,0,0,0datasg endscodesg segment assume cs:codesg,ds:datasg,ss:stacksg start proc far push ds sub ax,ax push ax mov ax,datasg mov ds,ax mov ah,9 mov dx,offset vv int 21h mov ah,0ah mov dx,offset buf int 21h call str2bin rach: mov ax,ii mul ir mov ir,ax dec ii cmp ii,2 jge rach mov ah,9 mov dx,offset viv int 21h call bin2str mov ah,9 mov dx,si int 21h ret bin2str proc mov cx,10 mov si,offset sr+4 mov ax,ir m1: sub dx,dx div cx or dl,30h mov [si],dl dec si cmp ax,0 jne m1 ret bin2str endp str2bin proc near mov cx,10 lea si,buf+1 xor bh,bh mov bl,[buf+1] m3: mov al,[si+bx] and ax,0fh mul ft10 add ii,ax mov al,ft10 mul cl mov ft10,al dec bx jnz m3 ret str2bin endp start endp codesg ends end start
TITLE prog3.asm ;расчет факториала
stacksg segment stack ‘установка сегмента стёка
dw 32 dup(32)‘ размером 32 байта заполненного «32»
stacksg ends‘ конец установки стека
datasg segment ‘ установка сегмента данных
vv db 'Введите аргумент M (не больше 7)$'‘ переменная VV
viv db 13,10,'Значение факториала $'
ii dw ?‘переменная ii не определена
ir dw 1
sr db 5 dup(0)‘5 байт=0
db 13,10,'$'‘ ещё 3 байта без определения адреса
ft10 db 1 переменная ft10=1
buf db 2,0,0,0,0
datasg ends‘конец сегмента данных
codesg segment ‘сегмент кода
assume cs:codesg,ds:datasg,ss:stacksg‘ установка регистров cs, ds, ss
start proc far‘начало программы
push ds‘ сохранить DS (или поместить его в стёк)
sub ax,ax‘AX=AX-AX=0 быстрее XOR AX,AX
push ax‘сохр. АХ
mov ax,datasg‘Установить сег-
mov ds,ax‘мент данных
mov ah,9 ‘ номер функции прерывания- вывод строки
mov dx,offset vv‘ dx= смещение строки
int 21h‘вызвать прерывание 21H
mov ah,0ah‘номер функции прерывания- ввод текста
mov dx,offset buf‘ dx= смещение буфера
int 21h‘вызвать прерывание 21H
call str2bin‘ переход в процедуру str2bin
rach: mov ax,ii‘Метка RACH, AX=ii
mul ir‘AX=AX*ir
mov ir,ax‘сохранить АХ в ir
dec ii‘ii=ii-1
cmp ii,2‘сравнить ii и 2
jge rach‘переход к метке RACH если ii >= 2
mov ah,9‘функции прерывания- вывод строки
mov dx,offset viv‘ dx= смещение данных
int 21h‘вызвать прерывание 21H
call bin2str‘переход в процедуру bin2str
mov ah,9‘номер функции прерывания- вывод строки
mov dx,si‘ dx= смещение данных
int 21h‘вызвать прерывание 21H
Ret‘Выход из программы
bin2str proc‘Объявление процедуры bin2str
mov cx,10 ‘поместить 10 в CX
mov si,offset sr+4 ‘поместить в SI смещение offset sr+4
mov ax,ir ‘AX= ir
m1: sub dx,dx ‘обнулить DX
div cx ‘DX:AX = AX / CX
or dl,30h ‘установить биты 5 и 6 в DL в единицу
mov [si],dl ‘сохр. DL по адресу DS:[SI]
dec si ‘SI=SI-1
cmp ax,0 ‘сравнить АХ и 0
jne m1 ‘если не равны иди к m1
ret ‘выход из процедуры
bin2str endp ‘директива конца проц.
str2bin proc near‘объявление проц. str2bin
mov cx,10‘счётчик=10
lea si,buf+1‘Вычисление Смещения
xor bh,bh‘обнулить BH
mov bl,[buf+1]‘установить BL
m3: mov al,[si+bx]‘поместить в AL переменную DS:[SI+BX]
and ax,0fh‘обнулить в AX все биты кроме первых 4
mul ft10‘AX=AX*ft10
add ii,ax‘и добавить к ii
mov al,ft10‘al = ft10
mul cl‘ax= al*cl
mov ft10,al‘сохранить AL
dec bx‘уменьшить BX на 1
jnz m3‘если BX не =0 перейти на метку m3
ret ‘иначе – выход из процедуры
str2bin endp ‘директива конца проц.
start endp‘директива конца процедуры start
codesg ends‘конец сегмента кода
end start‘конец программы

Не задавай больше таких длинных вопросов, ПОЖАЛУЙСТА.
Алеусандр Кузнецов
Алеусандр Кузнецов
2 503
Лучший ответ