Сопроцессор, возведение в степень - 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    ; иначе меняем знак числа

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5