Сопроцессор, возведение в степень - 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 ; иначе меняем знак числа
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д