0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
1

Команда сопроцессора - fy12x

04.04.2018, 19:41. Показов 3098. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Будьте добры, пожалуйста, укажите на ошибку.
Код:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.386p
.model flat, stdcall
.
.
.
start:
.
.
.
;вычисляем e^-|a|
    fld a
    fabs
    fchs
    fld e
    fy12x   ;error A2008 : syntax error: fy12x
    fld     st(0)
    frndint
    fld     st(0)
    fsub    st(2)   ;error A2152: coprocessor register cannot be first operand
    fxch
    f2xm1
    fld1
    fadd
    fscale
    fstp    st(1)
 
.
.
.
end start
;error A2008 : syntax error: fy12x
;error A2152: coprocessor register cannot be first operand


fy12x — команда вычисления значения функции z=ylog2(x). Исходное значение х размещается в вершине стека сопроцессора, а исходное значение y – в регистре st(1).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2018, 19:41
Ответы с готовыми решениями:

Добрый день. Вероятность того что команда а и команда б забьет 2,3,4,5 голов
Команда а, сыграла дома 12 матчей забила 17 мячей и пропустила 7 Команда б, сыграла в гостях 12...

Константы сопроцессора
Зачем в сопроцессоре команды загрузки констант? С ПИ понятно, например, а вот зачем загружать как...

Команды сопроцессора.
Подскажите, пожайлуста, как выполнить умножение при помощи сопроцессора и еще, как вводить числа с...

Стек сопроцессора
Друзья, не могу до конца разобраться с работой стека. В стек загружаются данные последовательно,...

12
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
04.04.2018, 22:37 2
Лучший ответ Сообщение было отмечено Marihuana как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
;Значение натурального логарифма
;на входе:
;  st(0) - значение аргумента
;на выходе:
;  st(0) - значение натурального логарифма
Ln      proc
        fldln2                  ; st(0)=ln(2) st(1)=x
        fxch    st(1)           ; st(0)=x st(1)=ln(2)
        fyl2x                   ; st(0)=log2(x)*ln(2)=ln(x)
        ret
Ln      endp
L - fyL2x

Добавлено через 3 минуты
Указывайте оба операнда fsub st(2), st(0)
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
05.04.2018, 20:53  [ТС] 3
Спасибо большое!

Добавлено через 12 часов 48 минут
Посмотрите, пожалуйста.
Отрицательные числа рассчитывает, а с плюсом нет(начиная с 0).
Код:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
.386P
.model flat, stdcall
.data
Pi      dd  3.14
e       dd  2.71828
a       dd  3.4
const2      dd  2
cntx        dd  -2
.code
start:
    finit
    fld cntx
    fsin    
    fld cntx
    fsqrt
    fdiv
    fld a
    fld cntx
    fmul    
    fsin
    fld a
    fld cntx
    fmul
    fsin
    fmul
    fld cntx
    fld cntx
    fmul
    fdiv
    fadd
    fsqrt
    fld cntx
    fld Pi
    fld const2  
    fdiv    
;вычисляем e^-|a|
    fld a
    fabs
    fchs
    fld e
    fyl2x
    fld st(0)
    frndint
    fld st(0)
    fsub    st(0),st(2)
    fxch
    f2xm1
    fld1
    fadd
    fscale
    fstp    st(1)
;-------------------
    fmul
    fadd
    fsqrt
    fadd
    fstp    y       
end start
0
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
05.04.2018, 21:20 4
У программы нет кода возврата управления операционной системе (ExitProcess), нет переменной y.
Исходник не компилируется, да и сама ошибка неясна.
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
06.04.2018, 17:11  [ТС] 5
Извиняюсь за невнимательность.
Фрагмент кода, представленный ниже, рассчитывает(неверно) значение y, при известном x.
Выражение:
Кликните здесь для просмотра всего текста
Команда сопроцессора - fy12x

Код:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
        .   
        .
        .
        a       dd  3.4
        const2  dd  2
        y       dd  0
        cntx          dd     -2
        .
        .
        .
       finit            ;обнуляем стэк
    fild    cntx             ;х в стэк
    fsin                     ;sin(x)
    fild    cntx             ;x в стэк
    fsqrt                    ;sqrt(x)
    fdiv                     ;sin(x)/sqrt(x)
    fld a                ;a=3.4 в стэк
    fimul   cntx             ;x*a
    fsin                     ;sin(xa)
    fld a                ;а в стэк
    fimul   cntx             ;x*a
    fsin                     ;sin(a*x)
    fmul                     ;sin(a*x)*sin(a*x)
    fild    cntx             ;х в стэк
    fimul   cntx             ;х^2
    fdiv                     ;sin^2(ax)/x^2
    fadd                     ;(sin(x)/sqrt(x))+(sin^2(xa)/x^2)
    fsqrt                    ;sqrt
    fild    cntx             ;x в стэк
    fldpi                    ;пи в стэк
    fidiv   const2                   ;pi/2
 
;вычисляе e^-|a|
    fld     a
       fabs
    fchs
    fldl2e
    fmul
    fld     st
    frndint
    fsub    st(1), st
    fxch    st(1)
    f2xm1
    fld1
    fadd
    fscale
    fstp    st(1)
    fmul        ;e^-|x|*pi/2
    fadd            ;x+e^-|x|*pi/2
    fsqrt           ;sqrt
    fadd            ;sqrt(sin(x)/sqrt(x))+(sin^2(xa)/x^2))+sqrt(x+e^-|x|*pi/2))
    fstp    y
        .
        .
        .

Посмотрите, пожалуйста.
0
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
06.04.2018, 22:56 6
Лучший ответ Сообщение было отмечено Marihuana как решение

Решение

Не по теме:

Marihuana, вы как не для себя спрашиваете - чтобы проверить ваш код нужно сделать минимальную тестовую программу, вставить ваш фрагмент, выловить ошибки компиляции и затем приступить к отладке. Как думаете - много желающих?



Добавлено через 5 часов 11 минут
Смотрите, все ваши вычисления с целочисленными результатами, отсюда и ошибки округлений.
Без ввода X.
Если нужен ввод - посмотрите в соседних темах подраздела - там есть применение библиотечных функций
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        promptUserInputNumber       DB 10, 13, 'Please enter your number: ', 0
        promptUserInputOperator     DB 'Please enter your operator: ', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        sum_string      db      10, 13, "Result of your equation is %d", 0
    X       dq  1.0
    a       dq  3.4
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        Result          dq      ?
 
.code
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
    finit               ;обнуляем стэк
    ;sin(x)/sqrt(x)
    fld [X]
    fld st(0)
    fsin
    fxch    st(1)
    fsqrt
    fdivp   st(1),  st(0)
    ;((sin(3.4x))^2)/x^2
    fld [X]
    fld st(0)
    fmul    [a]
    fsin
    fmul    st(0),  st(0)
    fxch    st(1)
    fmul    st(0),  st(0)
    fdivp   st(1),  st(0)
    ;
    faddp   st(1),  st(0)
    fsqrt
    ;x+(Pi/2)*exp(-abs(3.4))
    fld [X]
    fldpi           ;pi/2
    fld1
    fadd    st(0),  st(0)
    fdivp   st(1),  st(0)
    fld [a]     ;-abs(3.4)
    fabs
    fchs
    ;вычисление exp(st(0))
        fldl2e                  ;st(0)=1/ln(2)=log2(e)
        fmulp   st(1),  st(0)   ;st(0)=x/ln(2)=x*log2(e)
        fld     st(0)
        frndint
        fsub    st(1), st(0)
        fxch    st(1)
        f2xm1           ;st(0)=2^(mantissa)-1
        fld1            ;st(0)=2^(mantissa)-1+1=2^(mantissa)
        faddp   st(1), st(0)
        fscale
        fstp    st(1)
    ;
    fmulp   st(1),  st(0)   ;(Pi/2)*exp(-abs(3.4))
    faddp   st(1),  st(0)   ;x+(Pi/2)*exp(-abs(3.4))
    fsqrt
 
    faddp   st(1),  st(0)
 
    fstp    [Result]
 
ResultShow:
        ;вывод результата
    invoke  FloatToStr2, [Result], ADDR Buffer
    invoke  StrLen, ADDR Buffer
    mov     [BufLen],   eax
    invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
        BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
Добавлено через 2 минуты
А с отрицательными X будет ошибка, т.к. корень квадратный из отрицательного числа не определён на множестве действительных чисел.
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
07.04.2018, 08:57  [ТС] 7
Спасибо большое! Я разобрался) Код написал правильно. Действительно ошибка была в том, что извлекался кв. корень из отриц. числа.
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
13.04.2018, 14:24  [ТС] 8
Имеется массив чисел, в котором дробные и целые числа. Все они используются для расчета.
Т.е. нужно сделать универсальный код, чтобы он мог считать при вещественном числе и целом.
Для каждого случая отдельно написать код не составило труда.
Но мне нужно, чтобы программа могла определить какое это число(дробное или целое), после чего продолжить расчет по одному из способов.
Подскажите, пожалуйста, как определить имеет ли число дробную часть?
Придумал способ, но он не подходит, т.к. для загрузки целого числа в стэк используется fild, а дробного fld.
Assembler
1
2
3
4
5
6
     finit
     fld x
     fld x
     frndint
     fstsw ax
     jne nint
0
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
13.04.2018, 14:48 9
Добавьте переменную, которая принимает значения:
0 - для 8 битного целого
1 - для 16 битного целого
2 - для 32 битного целого
3 - для 64 битного целого
10 - для 32 битного float
11 - для 64 битного float
12 - для 80 битного float
Потом исходя из этой переменной читайте значение из памяти. А универсальных команд - нет, процессор их не имеет.
Или же вызывайте разные процедуры, которые имеют общую часть.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ISome proc
  fild [X]
  jmp Common
ISome endp
 
FSome proc
  fld [X]
  jmp Common
FSome endp
 
Common proc
  fadd [Y]
  ret
Common endp
И посмотрите по организации переходов в теме
Прыжок внутрь процедуры (masm)

Добавлено через 1 минуту
Но не должно такого быть - смешение разнородных элементов в одном массиве. Т.к. нарушится сам смысл термина "массив".
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
14.04.2018, 09:00  [ТС] 10
Спасибо. А можно как-то преобразовать целые числа в вещественные?
0
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
14.04.2018, 11:51 11
В смысле преобразовать? Записать в массиве?
Assembler
1
A dq 1.0, 2.0, 3.0
Добавлено через 1 минуту
Кажется, ещё можно
Assembler
1
A dq 1f, 2f, 3f
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
14.04.2018, 12:00  [ТС] 12
Значения вводятся с клавиатуры. 3,1,5 и т.д.. Можно ли как-то уже внутри их сделать 3.0,1.0,5.0 и т.д.
0
Модератор
Эксперт по электронике
8316 / 4215 / 1602
Регистрация: 01.02.2015
Сообщений: 13,121
Записей в блоге: 4
14.04.2018, 12:21 13
Сразу преобразуйте строку во float.
Пример с использованием библиотечной функции из masm32 (подобное есть и в msvcrt):
https://www.cyberforum.ru/asse... 21026.html
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2018, 12:21
Помогаю со студенческими работами здесь

Работа сопроцессора
Помогите найти ошибку mov a,ax fldpi fxch fild a fmul st,st(1) mov...

Обновление сопроцессора
Вчера переустановил винду, с 7 на 7, и когда винда установилась в разделе звука был только HDMI...

SASM-вывод из сопроцессора
Нужно вывести с регистра st0 значение которое туда записывается в ходе математических операций. Сам...

Программа с задеиствованием сопроцессора
Добрыи день.Я тут новенькии,частенько читаю этот форум и он мне интересен,так как учусь на...

Включение/отключение сопроцессора
Доброго времени суток. Подскажите, как можно выполнить включение и выключение арифметического...

Обработка исключений сопроцессора
Добрый день. Кто подскажет как передать управление своему обработчику исключений сопроцессора? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru