Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89

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

04.04.2018, 19:41. Показов 3766. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2018, 19:41
Ответы с готовыми решениями:

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

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

Команды сопроцессора.
Подскажите, пожайлуста, как выполнить умножение при помощи сопроцессора и еще, как вводить числа с запятой (например, 2.5). Заранее спасибо

12
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
04.04.2018, 22:37
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо большое!

Добавлено через 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
05.04.2018, 21:20
У программы нет кода возврата управления операционной системе (ExitProcess), нет переменной y.
Исходник не компилируется, да и сама ошибка неясна.
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
06.04.2018, 17:11  [ТС]
Извиняюсь за невнимательность.
Фрагмент кода, представленный ниже, рассчитывает(неверно) значение y, при известном 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
        .   
        .
        .
        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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
06.04.2018, 22:56
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо большое! Я разобрался) Код написал правильно. Действительно ошибка была в том, что извлекался кв. корень из отриц. числа.
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 89
13.04.2018, 14:24  [ТС]
Имеется массив чисел, в котором дробные и целые числа. Все они используются для расчета.
Т.е. нужно сделать универсальный код, чтобы он мог считать при вещественном числе и целом.
Для каждого случая отдельно написать код не составило труда.
Но мне нужно, чтобы программа могла определить какое это число(дробное или целое), после чего продолжить расчет по одному из способов.
Подскажите, пожалуйста, как определить имеет ли число дробную часть?
Придумал способ, но он не подходит, т.к. для загрузки целого числа в стэк используется fild, а дробного fld.
Assembler
1
2
3
4
5
6
     finit
     fld x
     fld x
     frndint
     fstsw ax
     jne nint
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
13.04.2018, 14:48
Добавьте переменную, которая принимает значения:
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  [ТС]
Спасибо. А можно как-то преобразовать целые числа в вещественные?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
14.04.2018, 11:51
В смысле преобразовать? Записать в массиве?
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  [ТС]
Значения вводятся с клавиатуры. 3,1,5 и т.д.. Можно ли как-то уже внутри их сделать 3.0,1.0,5.0 и т.д.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
14.04.2018, 12:21
Сразу преобразуйте строку во float.
Пример с использованием библиотечной функции из masm32 (подобное есть и в msvcrt):
https://www.cyberforum.ru/asse... 21026.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2018, 12:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru