1

Тема: Переповнення стеку FPU -1.#iND

Хайо.  Тре, використовуючи команди FPU, обчислити такий от вираз
http://puu.sh/dgAgM/adbea46f3a.png
Ну я спочатку зробив все окремо, ну типу верхній вираз, потім ділення ,котре внизу, і логарифм отой.
А потім думаю - треба це все об'єднати, і от взявся то все робити, а воно мені повертає http://puu.sh/dgAiA/891a5a1267.png
Ну я то почитав шось в інтернетах, але там шось воно не дуже зрозуміло.

Окремо ці два вирази обчислюються файно, але коли вони разом, то виникає переповнення.
Як мені зробити так, аби зберегти в перший регістр значення першого виразу, потім завантажити змінні для другого виразу, і розв'язати другий вираз, а потім щось робити з розв'язком першого і другого виразів?

float a = 2, c = 3, d = 4;
    int two = 2, twentyThree = 23, four = 4, one = 1;
    __asm {
            
            fld c
            fild two
            fmul st(0), st(1)
            fild twentyThree
            fld d
            fdiv st(0), st(1)
            fsub st(2), st(0)
            fld st(2)

            fild four
            fld a
            fdiv st(0), st(1)
            fild one
            fsub st(0), st(1)

            fst a
    }

    cout << a;

2 Востаннє редагувалося 0x9111A (04.12.2014 15:08:29)

Re: Переповнення стеку FPU -1.#iND

Незнаю чому, але

printf("%f", a);

виводить норм.
Мені не було чого робити і я зробив весь приклад

finit
fld c
fild two
fmul
fld d
fild twentyThree
fdiv
fsub

fldln2
fld1
fld a
fild four
fdiv
fsub
fyl2x
fdiv
fstp a

+ Якщо ви порівняєте результати на для різних вхідних даних свого коду і того що згенерує компілятор то помітите деяку різницю, то тому що компілятор замість fpu використвує SSE

Подякували: FakiNyan, 0xDADA11C72

3 Востаннє редагувалося FakiNyan (04.12.2014 16:12:22)

Re: Переповнення стеку FPU -1.#iND

0x9111A написав:

Незнаю чому, але

printf("%f", a);

виводить норм.
Мені не було чого робити і я зробив весь приклад

finit
fld c
fild two
fmul
fld d
fild twentyThree
fdiv
fsub

fldln2
fld1
fld a
fild four
fdiv
fsub
fyl2x
fdiv
fstp a

+ Якщо ви порівняєте результати на для різних вхідних даних свого коду і того що згенерує компілятор то помітите деяку різницю, то тому що компілятор замість fpu використвує SSE

sse - то наступна лаба

p.s. printf виводить нулі, хоча їх там бути не має
p.s.s. то я просто не так змінну в printf передав
p.s.s.s закумунтувати не хочете? ну щоб зрозуміло все було, от мій варіант, виправте, що невірно
*********************************************
Я так пойняв, що коли ми не вказуємо операнди команди, ну типу не

fmul st(0),st(1)

а просто

fmul

то st(0),st(1) підставляється типу автоматично, ага?

finit //переходимо в режим fpu
fld c //заносимо змінну c в регістр st(0)
fild two // тут заносимо змінну two в регістр st(0), при цьому змінна "c" переміщується в регістр st(1)
fmul // множимо st(0) на st(1), результат заносимо в st(0)
fld d // пхаємо d в st(0), результат множення рухається в st(1)
fild twentyThree // пхаємо 23 в st(0), d лізе в st(1)
fdiv // ділимо st(0) на st(1)? чи як? майбуть що st(1) на st(0), але чо так?
fsub // віднімаємо хз вже що

fldln2 // ну а тут лабуда з тими логарифмами, котру я не розумію, бо не вчив математику в школі
fld1
fld a
fild four
fdiv
fsub
fyl2x
fdiv
fstp a

4

Re: Переповнення стеку FPU -1.#iND

Ліл, здається, той вираз, що я скинув, не вираз. То так викладач вирішив розділити вираз і функцію. Зверху вираз, а знизу функція.
Бо друге завдання до тої лаби - табулюванням знайти наближені корені рівняння y=F(a), ну і ця F - отой логарифм

5

Re: Переповнення стеку FPU -1.#iND

Ну от, знову ця штука
http://puu.sh/dgIQJ/ec05d7faf9.png

6 Востаннє редагувалося 0x9111A (04.12.2014 16:53:33)

Re: Переповнення стеку FPU -1.#iND

FakiNyan написав:

Я так пойняв, що коли ми не вказуємо операнди команди, ну типу не

fmul st(0),st(1)

а просто

fmul

то st(0),st(1) підставляється типу автоматично, ага?

Більше вірно було б сказати що st(1), st(0). Щоб узагальнити і для віднімання з діленням

FakiNyan написав:

переходимо в режим fpu

не те щоб переходимо, швидше готуємо fpu до роботи, скидаємо всі регістри на дефолтні значення

FakiNyan написав:

fdiv // ділимо st(0) на st(1)? чи як? майбуть що st(1) на st(0), але чо так?

st(1) на st(0), а чому то інженерів інтеля, чи хто це придумав, треба питати.

FakiNyan написав:

fsub // віднімаємо хз вже що

віднімання в чисельнику тільки одне
Логарифми на fpu то одна з найзручніших речей.
Якщо вам геть не зрозуміло то поясню.
+ Найкраща на мій погляд довідка по fpu.

Виводьте printf-ом тай усе

Подякували: FakiNyan1

7

Re: Переповнення стеку FPU -1.#iND

0x9111A написав:
FakiNyan написав:

Я так пойняв, що коли ми не вказуємо операнди команди, ну типу не

fmul st(0),st(1)

а просто

fmul

то st(0),st(1) підставляється типу автоматично, ага?

Більше вірно було б сказати що st(1), st(0). Щоб узагальнити і для віднімання з діленням

FakiNyan написав:

переходимо в режим fpu

не те щоб переходимо, швидше готуємо fpu до роботи, скидаємо всі регістри на дефолтні значення

FakiNyan написав:

fdiv // ділимо st(0) на st(1)? чи як? майбуть що st(1) на st(0), але чо так?

st(1) на st(0), а чому то інженерів інтеля, чи хто це придумав, треба питати.

FakiNyan написав:

fsub // віднімаємо хз вже що

віднімання в чисельнику тільки одне
Логарифми на fpu то одна з найзручніших речей.
Якщо вам геть не зрозуміло то поясню.
+ Найкраща на мій погляд довідка по fpu.

Виводьте printf-ом тай усе

Проблема не в виводі, а в самій функції, просто вона там ламається, от я зробив менший крок, і все чітко
http://puu.sh/dgJV2/13b8a40cea.png