Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
MASM

Передать значение двойной точности (double) из программы на "С" в функцию на ассемблере

04.10.2020, 20:23. Показов 4218. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно передать 5 параметров из программы, написанной на C, в функцию, написанную на ассемблере. Вся передача должна производиться через стек. Если бы это были все параметры типа REAL4, то проблем не было бы, но я не понимаю, как извлекать параметры типа REAL8 из стека и как записывать их в память (попутно переводя все другие переменные (REAL4) в тип REAL8) для последующего использования в математическом сопроцессоре.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
extern "C" float calculation(double A, float B, float C, double D, float E);
extern "C" void  print_res(float Res);
int main(void)
{
  float B, C, E;
  double fRes,A,D;
  printf("X= A2-B1-K-D2/E1+F1*B1    (K= 614h (1556))\n");
  printf("A = ");    scanf("%lf", &A);
  printf("B = ");    scanf("%f", &B);
  printf("C = ");    scanf("%f", &C);
  printf("D = ");    scanf("%lf",&D);
  printf("E = ");    scanf("%f", &E);
  fRes = calculation(A, B, C, D, E);
  print_res(fRes);
  _getch();
}
extern "C" void  print_res(float Res)
{
  printf("Result is : %f\n", Res);
}
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
586
.model flat,c
PUBLIC calculation
.data
  A  REAL8 ?
  B  REAL8 ?
  _C REAL8 ?
  D  REAL8 ?
  E  REAL8 ?
  K  REAL8 41.
.code
  calculation proc
  push ebp
  mov ebp,esp
 
                          ; будь это переменные типы REAL4 сделал бы как-то так :
  ;mov eax,[ebp+8]                   ;
  ;mov A, eax                        ;
  ;mov eax,[ebp+12]                  ;
  ;mov B, eax                        ;
  ;mov eax,[ebp+16]                  ;
  ;mov _C, eax                       ;
  ;mov eax,[ebp+20]                  ;
  ;mov D, eax                        ;
  ;mov eax,[ebp+24]                  ;
  ;mov E, eax                        ;
 
  ;fld A                             ; 
  ;fmul B                            ; 
  ;fld A 
  ;fmul _C
  ;fsubr ST(0),ST(1)
 
  ;fld E
  ;fadd K
  ;fld D
  ;fdivr
  ;fadd ST(0),ST(1)
 
pop ebp
ret
 
calculation endp
end
В памяти эти переменные мне нужны дабы напрямую их ипользовать в сопроцессоре. Помогите пожалуйста, спасибо заранее.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2020, 20:23
Ответы с готовыми решениями:

Реализовать на ассемблере функцию для работы с числами половинной точности
Реализовать на ассемблере функцию для работы с так называемыми числами половинной точности (формат binary16 стандарта IEEE 754-2008. В...

Написать функцию int Search ( double A[], int n , double x), которая находит в массиве double A[n] элемент, значение которого равно x
Написать функцию int Search ( double A, int n , double x), которая находит в массиве double A элемент, значение которого равно x. Функция...

Напишите функцию double power(double a, int n), вычисляющую значение a^n
Чем мой код отличается от библиотечной функции pow()? #include &lt;stdio.h&gt; double power(double a, unsigned n) { int i; double...

6
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
04.10.2020, 20:43
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

Думаю, что вы всё правильно начали
Assembler
1
2
fld qword ptr [ebp+8] ;fld [A]
fld qword ptr[ebp+16] ;fld [B]
и так далее

Добавлено через 9 минут
Смотрите, в теме
Вызов функции с REAL8 параметром
показан вариант описания функции на masm (masm32)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func proc a: dword, b: real8, d: dword, g: real8
        
    Local res: real8
    fld b
    fld g
    fadd
    fstp res
    
    printf("%d\n", a) ; 123
    printf("%f\n", b) ; 1.230000
    printf("%d\n", d) ; 321
    printf("%f\n", g) ; 5.554000
    printf("res: %f\n", res) ; 6.784000
    ret
func endp
и описание параметров и их символьное использование
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 21:03
Цитата Сообщение от plzvtl Посмотреть сообщение
будь это переменные типы REAL4 сделал бы как-то так
Не совсем понимаю. Просто вызвать
fld размер[адрес на стеке]
0
E=m*c^2
 Аватар для K_ILYA_V
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
06.10.2020, 20:18
Ответ на твой вопрос очень сильно зависит от настроек проекта которые ты применяешь. самая важная делаешь ты x86 или х64, второе какое соглашение вызова стоит у тебя по умолчанию и третье какие настройки стоят относительно векторизации кода. все эти моменты приводят к совершенно различным способам передачи параметров.

поступи проще поставь точку остановки на месте вызова asmфункции и перейди к дизассемблированному коду скопируй кусок кода относящийся к вызову и опубликуй его здесь, после этого можно будет говорить дальше.

Добавлено через 13 минут
но если рассматривать вариант, а такой есть, то есть можно установить настройки так что все будет запихиваться в стек, то тогда в asm коде тебе нужна буферная переменная размером qd в нее поочередно ты будешь извлекать переменные из стека и загружать их в сопроцессор
0
E=m*c^2
 Аватар для K_ILYA_V
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
07.10.2020, 19:38
Цитата Сообщение от Vourhey Посмотреть сообщение
Не совсем понимаю. Просто вызвать
fld размер[адрес на стеке]
использовать стек не получиться

Assembler
1
2
3
4
5
6
7
8
9
10
.data
f_buf real8 0.0
 
.code
mov eax,[esp + 4]
mov f_buf,eax
mov eax,[esp + 8]
mov [f_buf + 4],eax
 
fld f_buf
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
07.10.2020, 19:56
А что мешает сразу перечислить параметры при описании процедуры и в символьном виде загружать их в стек FPU?
Assembler
1
2
3
func proc a: dword, b: real8, d: dword, g: real8
    fld b
    fld g
0
E=m*c^2
 Аватар для K_ILYA_V
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
07.10.2020, 20:05
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А что мешает сразу перечислить параметры при описании процедуры и в символьном виде загружать их в стек FPU?
Assembler
1
2
3
func proc a: dword, b: real8, d: dword, g: real8
    fld b
    fld g
моя глупость.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2020, 20:05
Помогаю со студенческими работами здесь

Как передать двойной указатель в функцию и вернуть его
Как передать двойной указатель в функция и вернуть его? В данном случае выдает ошибку :error C2440: =: невозможно преобразовать...

Передать строку символов из Pascal программы в подпрограмму на ассемблере
имеется код программы на паскале, и подпрограмма на ассемблере. {$L poisk.obj} var str:string; dlinna, pos:integer; ...

Написать функцию, которая могла бы передать значение в другую функцию
как сделать функцию которая бы могла передать значеие в другую функцию ну к примеру a=4*b; где b=sin(fi);

Потеря точности у double
Салют! Ситуация следующая - есть необходимость работать с изображением, а точнее - с его градиентом/направлением градиента. Для...

Потеря точности с double
Всем привет, есть простой код: double t = 100*double.Epsilon; double t1 = (100 * double.Epsilon) / 3.2808; double t2 = t1 *...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru