Сопроцессор, возведение в степень - Assembler
Формулировка задачи:
mov ax, @data
mov ds, ax
lea dx, m1
mov ah, 09 ; на ввод n
int 21h
mov ah, 10
lea dx, bf
int 21h
xor cx, cx ; очищаем результат
lea bx, bf+2 ; BX <- адрес начала строки
in_lp:
xor ah, ah ; AH <- 0;
mov al, [bx] ; AL <- код символа
sub al, '0' ; переводим код символа в цифру
jc ex_in ; если код не цирфра - конец перевода
cmp al, 10
jnc ex_in
xchg cx, ax
mov dx, 10 ; умножаем на 10 текущее
mul dx ; значение
add cx, ax ; и прибавляем цифру
inc bx ; переход к след. символу
jmp in_lp ; повторям перевод
ex_in:
cmp cx, 2 ; если n < 2 вычислять нечего
jl Exit ; переход к выходу
go:
dec cx ; уменьшаем счетчик на 1, т.к. счет начинается с 2
finit ; инициализация сопроцессора
fld1 ;
fstp f ; f = 1 - начальное значение произведения
mov x, 2 ; x = 2 - первый множитель
mn_lp:
call powx ; вызов подпрограммы вычисления степени
randk t, e ; округляем с заданной точностью
cmp word ptr t+6, 0 ; проверяем на 0
je exit ; если равно 0 - выход
test x, 1 ; проверка на четность
jnz no_xs ; если не четное смена знака не нужна
or byte ptr t+7, 80h ; иначе меняем знак числа
no_xs:
fld1
fadd t ; 1+t
fmul f ; f*(1+t)
fstp f ; f = f*(1+t)
randk f, e ; округляем с заданной точностью
inc x ; x = x + 1
loop mn_lp ; цикл вычисления пока CX>0
exit:
fld f ; перевод
fild e ; дробной части
fmul ; в целое представление
fistp rs
mov cx, 5 ; перевод 5 цифр
lea bx, m3+4
mov dx, word ptr rs+2 ; загрузка числа в
mov ax, word ptr rs ; DX:AX
mov di, 10
out_lp:
div di ; получаем цифру
add dl, '0' ; переводим ее в символ
mov [bx], dl ; сохраняем в буфер
xor dx, dx ; обнуляем dx
dec bx ; переход к предыдущ. позиции
loop out_lp ; и повторяем 5 раз
lea dx, m2 ; вывод результата
mov ah, 09
int 21h
xor ax, ax
int 16h
mov ax, 4c00h
int 21hРешение задачи: «Сопроцессор, возведение в степень»
textual
Листинг программы
or byte ptr t+7, 80h ; иначе меняем знак числа