С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114

При использовании процедур ошибка сегментации (связь си и асм)

31.03.2018, 20:35. Показов 4060. Ответов 29
Метки с, си (Все метки)

Студворк — интернет-сервис помощи студентам
В общем такая проблемка нужно передать мат. выражения с помощью процедур.
Написал модуль на Си вроде бы правильно, скомпилировал gcc -c main.c.
Написал модуль на ассемблере командой nasm -f elf32 asm.asm -o asm.obj.
Cкомпоновал модуль на Си и асм командой gcc -o start main.o a.obj -lm.
При запуске исполняемого файла start вылазит ошибка: "Ошибка сегментирования (core dumped)".
Пока новичок в этом деле, может где-то не так понял. Компиляция под Linux. Подскажите кто знает где эта ошибка?
Файл main.c:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>
 
extern __attribute__((cdecl)) int x(int _a, int _b, int _c)
{
    return (sin(_a-_b)*_c);
}
 
extern __attribute__((stdcall)) int y(int _a, int _b, int _c, int _d)
{
    return ((_a+_b)*_c-cos(_d));
}
 
extern __attribute__((fastcall)) int xy(int _a, int _b, int _c, int _d);
 
void main()
{
    int a=1;
    int b=2;
    int c=3;
    int d=4;
    printf("x:%d\ny:%d\nxy:%d\n",x(a,b,c),y(a,b,c,d),xy(a,b,c,d));
}
Файл asm.asm:
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
global xy
extern x
extern y
 
section .text
 
    xy:
 
        ;fastcall
        push ebp
        mov ebp, esp
        mov ecx, [ebp+8]    ;a
        mov edx, [ebp+12]   ;b
        mov eax, [ebp+20]   ;d
        mov eax, [ebp+16]   ;c
        add esp, 8
        mov esp, ebp
 
        ;cdecl
        call x
        mov eax, [ebp+16]   ;c
        mov eax, [ebp+12]   ;b
        mov eax, [ebp+8]    ;a
 
        ;stdcall
        call y
        mov eax, [ebp+20]   ;d
        mov eax, [ebp+16]   ;c
        mov eax, [ebp+12]   ;b
        mov eax, [ebp+8]    ;a
        add esp, 16
        mov esp, ebp
        pop ebp
 
    ret
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2018, 20:35
Ответы с готовыми решениями:

Проблема с кодировкой при использовании процедур
Здравствуйте. Возникла проблема с кодировкой при использовании процедур. Сама база в utf8 и там уже есть записи с разной кодировкой, но при...

Ошибка сегментации при срабатывании деструктора
Всем привет. Помогите, пожалуйста, разобраться с деструкторами. Суть проблемы заключается вот в чем: есть класс MyClass1 и AnotherClass,...

Ошибка сегментации при выводе графа
Вечер добрый, г-да программисты! Ниже приведены фрагменты из программы, описывающей и выводящей граф. В начале программы динамически...

29
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
05.04.2018, 10:50  [ТС]
Студворк — интернет-сервис помощи студентам
Попробуйте скомпилировать через командную строку Unix компилятором gcc. Я в первом посте писал свои действия как я собирал. Только там последняя команда такая будет я опечатался gcc -o start main.o asm.obj -lm
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
08.04.2018, 00:17  [ТС]
Дописал код чтобы можно было с числами с плавающей точкой складывать результат.
Считает немного лучше, но где-то всё ещё есть ошибка результата.
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
global xy
extern x
extern y
 
section .text
 
    xy:
        ;fastcall
        push ebp
        mov ebp, esp
        ;cdecl
        push ecx
        push edx
        mov eax, [ebp+8]    ;c
        push eax
        push edx
        push ecx
        call x
        pop edx         ;b
        pop ecx         ;a
        push eax
        fstp st1
        ;stdcall
        push ecx
        push edx
        mov eax, [ebp+8]    ;c
        push eax
        mov eax, [ebp+12]   ;d
        push eax
        call y
        fadd st1, st0
        mov esp, ebp
        pop ebp
    ret
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
10.04.2018, 17:39  [ТС]
Как правильно нужно сложить эти функции чтобы xy верно посчитало?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
10.04.2018, 20:41
Alexis_777, я действительно не могу собрать нужный пример.
Попробовал зайти с другой стороны - функцию xy сделал на C и после компиляции посмотрел в дизассемблере.
Не могу сообразить, какие смещения для извлечения аргументов из стека, но в целом программа похожа на вашу.
"Поиграйтесь" смещениями.
C
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
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
__attribute__((cdecl)) double x(int _a, int _b, int _c)
{
    return (sin(_a-_b)*_c);
}
 
__attribute__((stdcall)) double y(int _a, int _b, int _c, int _d)
{
    return ((_a+_b)*_c-cos(_d));
}
 
__attribute__((fastcall)) double xy(int _a, int _b, int _c, int _d)
{
    return x(_a,_b,_c)+y(_a,_b,_c,_d);
};
 
void main(int argc, char **argv)
{
    int a, b, c, d;
    if (argc != 5)
    {
        printf("Ошибка, количество аргументов %d. Нужно ввести 4 агрумента", argc-1);
        exit(1);
    }
    a = 1;//atoi(argv[1]);
    b = 2;//atoi(argv[2]);
    c = 3;//atoi(argv[3]);
    d = 4;//atoi(argv[4]);
    printf("Параметры функций a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    printf("Результат функции x = sin(a-b)*c = %f\n", x(a,b,c));
    printf("Результат функции y = (a+b)*c-cos(d) = %f\n", y(a,b,c,d));
    printf("Результат функций xy = x+y = %f\n", xy(a,b,c,d));
}
Code
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
CPU Disasm
Address   Hex dump          Command                                  Comments
00401388  /$  55            PUSH EBP                                 ; c_0014.00401388(guessed Arg1,Arg2)
00401389  |.  89E5          MOV EBP,ESP
0040138B  |.  83EC 28       SUB ESP,28
0040138E  |.  894D F4       MOV DWORD PTR SS:[LOCAL.3],ECX
00401391  |.  8955 F0       MOV DWORD PTR SS:[LOCAL.4],EDX
00401394  |.  8B45 08       MOV EAX,DWORD PTR SS:[ARG.1]
00401397  |.  894424 08     MOV DWORD PTR SS:[LOCAL.8],EAX
0040139B  |.  8B45 F0       MOV EAX,DWORD PTR SS:[LOCAL.4]
0040139E  |.  894424 04     MOV DWORD PTR SS:[LOCAL.9],EAX
004013A2  |.  8B45 F4       MOV EAX,DWORD PTR SS:[LOCAL.3]
004013A5  |.  890424        MOV DWORD PTR SS:[LOCAL.10],EAX
004013A8  |.  E8 87FFFFFF   CALL 00401334
004013AD  |.  DD5D E8       FSTP QWORD PTR SS:[LOCAL.6]
004013B0  |.  8B45 0C       MOV EAX,DWORD PTR SS:[ARG.2]
004013B3  |.  894424 0C     MOV DWORD PTR SS:[LOCAL.7],EAX           ; /Arg4 => [ARG.2]
004013B7  |.  8B45 08       MOV EAX,DWORD PTR SS:[ARG.1]             ; |
004013BA  |.  894424 08     MOV DWORD PTR SS:[LOCAL.8],EAX           ; |Arg3 => [ARG.1]
004013BE  |.  8B45 F0       MOV EAX,DWORD PTR SS:[LOCAL.4]           ; |
004013C1  |.  894424 04     MOV DWORD PTR SS:[LOCAL.9],EAX           ; |Arg2 => ARG.EDX
004013C5  |.  8B45 F4       MOV EAX,DWORD PTR SS:[LOCAL.3]           ; |
004013C8  |.  890424        MOV DWORD PTR SS:[LOCAL.10],EAX          ; |Arg1 => ARG.ECX
004013CB  |.  E8 8BFFFFFF   CALL 0040135B                            ; \c_0014.0040135B
004013D0  |.  83EC 10       SUB ESP,10
004013D3  |.  DC45 E8       FADD QWORD PTR SS:[LOCAL.6]
004013D6  |.  C9            LEAVE
004013D7  \.  C2 0800       RETN 8
Добавлено через 12 минут
Видно, что два первых аргумента поступают в ecx, edx.
Компилятор выделил под локальные переменные 0x28 (40) байт в которых сохранил ecx, edx и результат вызова x(...), кроме того, вместо нескольких push - простое копирование, но смысл всё равно виден.
Для вызова x(...) используются Local8, Local9, Local10.
Для сохранения ecx, edx - Local3, Local4.
Для сохранения результата вызова x(...) из вершины стека FPU записывается в Local6 и Local5.

Потом аналогичная работа с процедурой y(...).
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
10.04.2018, 22:59  [ТС]
Как можно ретранслировать его в ассемблер, понятны только сами функции, а что дальше написано не очень(
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
15.04.2018, 20:23  [ТС]
По вашему примеру написал, всё равно не считает как надо. Через fadd и fstp было намного лучше, но я не пойму где я ошибся
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
global xy
extern x
extern y
 
section .text
 
xy:
        push    ebp
        mov     ebp, esp
        push    ebx
        sub     esp, 40
        mov     [ebp-20], edi
        mov     [ebp-24], esi
        mov     [ebp-28], edx
        mov     [ebp-32], ecx
        mov     edx, [ebp-28]
        mov     ecx, [ebp-24]
        mov     eax, [ebp-20]
        mov     esi, ecx
        mov     edi, eax
        call    x
        movsd   [ebp-40], xmm0
        mov     ecx, [ebp-32]
        mov     edx, [ebp-28]
        mov     ebx, [ebp-24]
        mov     eax, [ebp-20]
    mov esi, ebx       
    mov     edi, eax
        call    y
        addsd   xmm0, [ebp-40]
        add     esp, 40
        pop     ebx
        leave
        ret
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
15.04.2018, 21:22
А откуда уверенность, что результаты функций возвращаются в xmm0?
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
15.04.2018, 21:40  [ТС]
ФедосеевПавел, а что не так?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
15.04.2018, 21:47
Результат возвращается в вершине стека FPU. А почему у вас в xmm0?
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
15.04.2018, 21:57  [ТС]
ФедосеевПавел, можете написать как правильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2018, 21:57
Помогаю со студенческими работами здесь

Ошибка сегментации при создании списка
Здрасти))) Вот такая небольшая проблема со списком)))) список читаем из файла и сортируем его)) список из целых чисел)) и прост на экран...

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

При отладке выдается ошибка сегментации
Всем привет! :) У меня такая проблема: программа по численным методам (кусок кода - дифференциальная прогонка), pu - массив 101 на 101,...

Ошибка сегментации при записи строки
Доброго времени суток уважаемые форумчане!Помогоите исправить ошибку. Начну с условия задания, которое я пытаюсь исполнить: 270....

Ошибка сегментации при работе со строками
Задача: Дан файл содержащий строки вещественных чисел. Вычислить минимум и максимум в каждой строке. Результат записать в файл. ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru