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

0

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

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

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

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

вот мой код

<code>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 
</code>

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

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

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

Ваш Ответ

1   ответ
1

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

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

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

Похожие вопросы