0

Вопрос по calculus, x86-64, nasm – серия гармоник со сборкой x86-64

Попытка вычислить гармонический ряд.

Сейчас я ввожу номер, на который я хочу добавить дополнение.

Когда я ввожу небольшое число, например 1.2, программа просто останавливается, не падает, похоже, она выполняет вычисления.

Но она никогда не заканчивает программу

вот мой код

denominator:
xor r14,r14             ;zero out r14 register
add r14, 2              ;start counter at 2
fld1                    ;load 1 into st0
fxch    st2
denomLoop:
fld1    
mov [divisor], r14              ;put 1 into st0
fidiv   dword [divisor]         ;divide st0 by r14
inc r14             ;increment r14
fst qword [currentSum]      ;pop current sum value into currentSum
jmp addParts
addParts:
fld qword [currentSum]
fadd    st2     ;add result of first division to 1
fxch    st2             ;place result of addition into st2
fld qword [realNumber]          ;place real number into st0
;compare to see if greater than inputed value
fcom    st2             ;compare st0 with st2
fstsw   ax              ;needed to do floating point comparisons on FPU
sahf                    ;needed to do floating point comaprisons on FPU
jg  done                ;jump if greater than
jmp denomLoop           ;jump if less than 

Код в основном вычисляет 1/2 или 1/3 или 1/4 и добавляет его к текущей сумме, а затем сравнивает, чтобы увидеть, достигло ли я значения выше того, что я ввел, после того, как оно получилось, оно должно выйти из цикла.

ребята, вы видите мою ошибку?

  • Финалjmp есть (логично)jump if less than OR equal, Нет веской причины использовать код 387 на x86-64. SSE является более ортогональным, чем неуклюжий, основанный на стеке ISA - и делает такие вещи, как сравнение и т. Д., Намного проще.

    от Brett Hale
  • возможный дубликатsummation in assembly language

    от Oliver Charlesworth
  • 1

    Эта строка кажется подозрительной:

    fst qword [currentSum]      ;pop current sum value into currentSum
    

    вопреки комментарию,fst хранит вершину стека в памяти БЕЗ выталкивания. Ты хочешьfstp если ты хочешь это высунуть.

    В целом, поведение стека в вашей программе кажется подозрительным - она помещает различные вещи в стек fp, но никогда ничего не выскакивает. После нескольких итераций стек переполнится и обернется. В зависимости от ваших настроек вы либо получите исключение, либо получите поддельные значения, если у вас не включены исключения.