.stack 256h ; упрощенная директива для 256-байтного сегмента стека
.code ; упрощенная директива сегмента кода
keyin proc ; начало процедуры keyin
mov dx,offset buff ; инициализация dx адресом начала буфера ввода buff
mov ah,0Ah ; формирование функции буферизованного ввода с клавиатуры
int 21h ; программное прерывание типа 21h
mov dx,10 ; инициализация dx символом "Line Feed" ("Перевод Строки")
mov ah,02h ; формирование функции вывода единичного символа на экран
int 21h ; программное прерывание типа 21h
xor ax,ax ; очистка регистра ax
mov cl,buff[1] ; в младший байт регистра cx помещается число введенных символов
mov dl,buff[1] ; в младший байт регистра dx помещается число введенных символов
cmp buff[2],2Dh ; проверка наличия знака "минус" (2D) в первом символе буфера...
jne notneg ; ...если false, то переход на метку notneg
mov si,3 ; запись в индексный регистр si числа 3
dec cl ; декремент cl
dec dl ; декремент dl
mov negf,1 ; флаг отрицательности равен единице (true)
jmp beg ; безусловный переход на метку beg
notneg: ; пользовательская метка notneg
mov negf,0 ; флаг отрицательности равен нулю (false)
mov si,2 ; инициализация индексного регистра si двойкой
beg:
push 1 ; запись в стек числа 1
dec dl ; декремент dl
cmp dl,0 ; сравнение вида dl=0, и если true, то...
je stend ; ...переход на метку stend
push 10 ; запись в стек числа 10
dec dl ; декремент dl
cmp dl,0 ; сравнение вида dl=0, и если true, то...
je stend ; ...переход на метку stend
push 100 ; запись в стек числа 100
dec dl ; декремент dl
cmp dl,0 ; сравнение вида dl=0, и если true, то...
je stend ; ...переход на метку stend
push 1000 ; запись в стек числа 1000
dec dl ; декремент dl
cmp dl,0 ; сравнение вида dl=0, и если true, то...
je stend ; ...переход на метку stend
push 10000 ; запись в стек числа 10000
dec dl ; декремент dl
cmp dl,0 ; сравнение вида dl=0, и если true, то...
je stend ; ...переход на метку stend
stend: ; пользовательская метка stend
mov al,buff[si] ; запись в al si-ого символа буфера buff
sub al,30h ; разность вида ax:=al-30h
mov ah,0 ; обнуление ah
pop bx ; запись в регистр bx верхнего элемента стека
mul bx ; умножение вида (dx:ax):=ax*bx
add mass1[di],ax ; сумма вида mass1[di]:=mass1[di]+ax
inc si ; инкремент si
loop stend ; если cx еще не равно нулю, то cx:=cx-1 и переход к метке stend
cmp negf,1 ; проверка флага отрицательности, если false, то...
jne endscan ; ...переход к концу процедуры
neg mass1[di] ; в противном случае обращение знака у di-ого элемента массива mass1
endscan:
ret ; возврат в основную процедуру
keyin endp ; конец процедуры keyin
outnum proc ; начало процедуры outnum
mov ah,9 ; формирование функции вывода строки на экран
mov dx,offset mess2 ; инициализация dx адресом начала символьной цепочки mess2
int 21h ; программное прерывание типа 21h
mov si,0 ; инициализация индексного регистра si нулем
star0: ; пользовательская метка star0
mov cx,0 ; инициализация счетчика cx нулем
mov ax,mass2[si] ; запись в регистр ax si-ого элемента массива array2
star1: ; пользовательская метка star1
xor dx,dx ; очистка dx
mov bx,10 ; запись в регистр bx числа 10
div bx ; деление вида (dx.ax):=ax/bx
xor bx,bx ; очистка bx
mov bx,dx ; запись старшей части результата деления в bx
push bx ; запись содержимого bx в стек
inc cx ; инкремент cx
cmp ax,0 ; сравнение вида ax=0, и если false, то...
jne star1 ; ...переход на метку star1
star2: ; пользовательская метка star2
pop dx ; запись в dx верхнего элемента стека
add dx,30h ; сумма вида dx:=dx+30h
mov ah,02h ; формирование функции вывода символа на экран
int 21h ; программное прерывание типа 21h
dec cx ; декремент cx
cmp cx,0 ; сравнение вида cx=0, и если false, то...
jne star2 ; ...переход на метку star2
mov dx,0 ; очистка регистра dx
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.