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

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

31.03.2018, 20:35. Показов 4111. Ответов 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
15.04.2018, 21:22
А откуда уверенность, что результаты функций возвращаются в xmm0?
0
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
15.04.2018, 21:40  [ТС]
ФедосеевПавел, а что не так?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
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
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru