Алгоритм Юрова. Assembler.

NagarD

Участник
Сообщения
411
Реакции
184
Кто шарит Асм подскажите где ошибка.
Я знаю точно что она где то в самом начале, ибо прога с ошибкой в каждой строке и не компилируется)) Это алгоритм Юрова: поднесение числа в произвольную степень тупо переписан точ-в-точ с книги... в чём проблема я не шарю

C-подобный:
.586p
masm
model user16 small
.stack 100h
.data            ;сегмент данных
flag db 0
p1 dd 0
y dt 2.0         ;основание степини
x dt -2.0        ;показатель степени

.code
main proc      ;начало процедуры main
    mov ax, @data
    mov ds, ax
    finit
    fld y
    fld x
    ftst
    fstsw ax
    sahf
    jnc m1            ;перход если х >=0
    jnx flag        ;взведем флаг, если х <0
    fabs            ; |x|
m1: fxch
    fy12x
    fst st(1)
    fabs            ;|z|
;сравним !z! с единицей
    fld1
    fcom
    fstsw ax
    sahf
    jp exit            ;операнды не сравнимы
    jnc m2            ;если !Z!<1 то переходим на м2
    jz m3            ;если !з!=1 то переходим на м3
;если "з">1 то приводим к формуле z=z1+z2 ,z1 - целое, z2 - дробное
    or ecx,ecx    ;счетчик вычитаний
m12:inc cx
    fsub st(1), st(0)
    fcom
    fstsw ax
    sahf
    jp exit        ;операнды не сравнимы
    jz m12
    jnc m2        ;если !z! <1, то переходим на m2
    jmp m12        ;если !z! >1, то переходим на m12
m3:mov p1, ecx
    jmp $+7
m2:mov p1, ecx
    fxch
    f2xm1
    fadd        ;компенсируем 1
    fild p1        ;показатель степенидля fscale
    fld1
    fscale
    fxch
    fincstp
    fmul
;проверка на отрицательную степень
    cmp flag, 1
    jnz exit
    fld1
    fxch
    fdiv
exit:
    mov ax, 4c00h
    int 21h

main endp
end main
 
Последнее редактирование:

Andrey

пишу код за еду
Сообщения
3,386
Реакции
4,023
  • Команда форума
  • #2
Перепечатывая примеры из книг программировать не научишься.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
C-подобный:
.586p
masm
model user16 small
.stack 100h
.data            ;сегмент данных
flag db 0
p1 dd 0
y dt 2.0        ;основание степини
x dt -2.0        ;показатель степени

.code
main:
main proc
;начало процедуры main
    mov ax, @data
    mov ds, ax
    finit
    fld y
    fld x
    ftst
    fstsw ax
    sahf
    jnc m1            ;перход если х >=0
    jnx flag        ;взведем флаг, если х <0
    fabs            ; |x|
m1: fxch
    fy12x
    fst st(1)
    fabs            ;|z|
;сравним !z! с единицей
    fld1
    fcom
    fstsw ax
    sahf
    jp exit            ;операнды не сравнимы
    jnc m2            ;если !Z!<1 то переходим на м2
    jz m3            ;если !з!=1 то переходим на м3
;если "з">1 то приводим к формуле z=z1+z2 ,z1 - целое, z2 - дробное
    or ecx,ecx    ;счетчик вычитаний
m12:inc cx
    fsub st(1), st(0)
    fcom
    fstsw ax
    sahf
    jp exit        ;операнды не сравнимы
    jz m12
    jnc m2        ;если !z! <1, то переходим на m2
    jmp m12        ;если !z! >1, то переходим на m12
m3:mov p1, ecx
    jmp $+7
m2:mov p1, ecx
    fxch
    f2xm1
    fadd        ;компенсируем 1
    fild p1        ;показатель степенидля fscale
    fld1
    fscale
    fxch
    fincstp
    fmul
;проверка на отрицательную степень
    cmp flag, 1
    jnz exit
    fld1
    fxch
    fdiv
exit:
    mov ax, 4c00h
    int 21h

main endp
end main

Оффтоп
 

NagarD

Участник
Сообщения
411
Реакции
184
Перепечатывая примеры из книг программировать не научишься
Да мне это раз в жизни надо, для курсовой, а тут такая засада - Юров прогу некорректно написал, или у меня большие проблемы со зрением!

слабо сказано, тут без мата никак!)
 
Сверху Снизу