С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12

Компилирование на си с испольнованием ассемблерной вставки

23.11.2012, 02:10. Показов 2292. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите, пожалуйста, как мне скомпилировать программу, написаную на си с использованием ассемблерной вставки. Используется функция multiplication на ассемблере для умножения матриц и главная программа на си для ввода/вывода. Использую visual studio 2010

Код функции multiplication.

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
.386
.MODEL FLAT
.CODE
 
public _multiplication
_multiplication PROC    NEAR
            PUSH EBP
            MOV EBP,ESP
            SUB ESP,8
            
            Matrix_1        EQU [EBP+8]     ; Первая матрица
            N1          EQU [EBP+12]    ; Число строк первой матрицы
            M1          EQU [EBP+16]    ; Число столбцов первой матрицы
            Matrix_2        EQU [EBP+20]    ; Вторая матрица
            N2          EQU [EBP+24]    ; Число строк второй матрицы
            M2          EQU [EBP+28]    ; Число столбцов второй матрицы
            Matrix_Result   EQU [EBP+32]    ; Матрица-результат
            
            ; Проверка возможности перемножения
            MOV ECX, M1
            MOV EBX, N2
            CMP ECX, EBX        ; if (M1==N2)
            JNE ERROR           ; M1!=N2
            
            MOV EAX, N1
            CMP EAX, 0
            JE  ERROR           ; N1=0
            
            MOV EAX, M1
            CMP EAX, 0
            JE  ERROR           ; M1=0, N2=0
            
            MOV EAX, M2
            CMP EAX, 0
            JE  ERROR           ; M2=0
 
            ; Загрузка адресов матриц в регистры 
            MOV EDI, Matrix_1
            MOV ESI, Matrix_2
            MOV EBX, Matrix_Result
            
            ; Вычисление результата перемножения матриц
            MOV EDX, N1 
MET1:           MOV ECX, M2
            PUSH EDX
            
            ; Получение строки матрицы-результата
MET2:           MOV EAX, 0
            MOV [EBX], EAX  ; Обнуление текущего элемента матрицы-результата
            PUSH ECX
            MOV ECX, M1
            
            ; Получение элемента строки матрицы-результата
MET3:           MOV EAX, [EDI]
            MOV EDX, [ESI]
            IMUL EDX
            ADD [EBX], EAX      ; Запись предварительного результата
            ADD EDI, 4          ; Переход к следующему элементу строки первой матрицы
            MOV EAX, 4
            MOV EDX, M2
            IMUL EDX
            ADD ESI, EAX        ; Переход к следующему элементу столбца второй матрицы
            LOOP MET3
            
            ADD EBX, 4          ; Переход к следующему элементу строки матрицы-результата
            
            MOV ECX, M1
            MOV EAX, 4
            IMUL ECX
            SUB EDI, EAX        ; Возвращение к началу строки первой матрицы
            MOV EAX, 4
            MOV EDX, M2
            IMUL EDX
            IMUL ECX
            SUB ESI, EAX
            ADD ESI, 4          ; Переход к следующему столбцу второй матрицы
            
            POP ECX
            LOOP MET2
            
            MOV EAX, 4
            MOV EDX, M1
            IMUL EDX
            ADD EDI, EAX        ; Переход к следующей строке первой матрицы
            MOV ESI, Matrix_2       ; Переход к началу первого столбца второй матрицы
            
            POP EDX
            DEC EDX
            JNZ MET1
            
            MOV EAX, 1          ; Возвращаемое значение = 1
            JMP EXIT
            
            ; Перемножение невозможно
ERROR:      MOV EAX, 0          ; Возвращаемое значение = 0
        
EXIT:           MOV ESP,EBP         
            POP EBP
            RET
_multiplication ENDP
END

Код главной программы:

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
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
#include "stdafx.h"
#include <stdlib.h>
#include <conio.h> 
#include <locale.h>
 
/*
Фунцкция перемножения матриц
Возвращаемое значение:
    0 - Перемножение матриц невозможно
    1 - Перемножение прошло успешно
*/
extern "C" int _cdecl multiplication (
            const int *matrix_1,    // Первая матрица
            const int N1,       // Число строк первой матрицы
            const int M1,       // Число столбцов второй матрицы
            const int *matrix_2,    // Вторая матрица
            const int N2,       // Число строк второй матрицы
            const int M2,       // Число столбцов второй матрицы
            int *matrix_result);    // Матрица-результат
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,".1251");      // Подключение русской кодировки
    int *matrix_1;              // Первая матрица
    int *matrix_2;              // Вторая матрица
    int N1,                 // Число строк первой матрицы
        M1;                 // Число столбцов первой матрицы
    int N2,                 // Число строк второй матрицы
        M2;                 // Число столбцов второй матрицы
    int *matrix_result;         // Матрица-результат
    
    // 1-2
    // Ввод первой матрицы
    printf ("Введите число строк первой матрицы: N1= ");
    scanf ("%d", &N1);
    printf ("Введите число столбцов первой матрицы: M1= ");
    scanf ("%d", &M1);
    matrix_1= (int*)malloc(N1*M1*sizeof(int));  // Выделение динамической памяти под первую матрицу
    printf ("Ввод элементов первой матрицы: \n");
    for (int i=0; i<N1; i++)
    {
        for (int j=0; j<M1; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_1[i*M1+j]);
        }
    }
    printf ("\n");
 
    // 2-3
    // Ввод второй матрицы
    printf ("Введите число строк второй матрицы: N2= ");
    scanf ("%d", &N2);
    printf ("Введите число столбцов второй матрицы: M2= ");
    scanf ("%d", &M2);
    matrix_2= (int*)malloc(N2*M2*sizeof(int));  // Выделение динамической памяти под вторую матрицу
    printf ("Ввод элементов второй матрицы: \n");
    for (int i=0; i<N2; i++)
    {
        for (int j=0; j<M2; j++)
        {
            printf ("[%d][%d]= ", i+1, j+1);
            scanf ("%d", &matrix_2[i*M2+j]);
        }
    }
    printf ("\n");
    
    // 3-4
    // Перемножение матриц
    matrix_result= (int*)malloc(N1*M2*sizeof(int)); // Выделение динамической памяти под матрицу-результат
    // Вызов функции multiplication
    if ( multiplication (matrix_1, N1, M1, matrix_2, N2, M2, matrix_result) ) 
// Если перемножение прошло успешно
    {   
        // 3.1-4.1
        //Вывод матрицы-результата
        printf ("Результат перемножения данных матриц:\n");
        for (int i=0; i<N1; i++)
        {
            for (int j=0; j<M2; j++)
            {
                printf ("%d\t", matrix_result[i*M2+j]);
            }
            printf ("\n");
        }
    }
    else    // Иначе перемножение невозможно
    {
        // Вывод сообщения о невозмножности перемножения
        printf ("Невозможно перемножить данные матрицы!!!");
    }
    
    // 4-5
    // Освобождение динамической памяти
    free (matrix_1);
    free (matrix_2);
    free (matrix_result);
    matrix_1= NULL;
    matrix_2= NULL;
    matrix_result= NULL;
 
    getch();
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2012, 02:10
Ответы с готовыми решениями:

Комментарий ассемблерной вставки
Прокомментируйте, пожалуйста, ассемблерную вставку, расположенную ниже. asm mov di,smesh add di,3+2*2 mov ax,k ...

Вывод чисел из ассемблерной вставки на С++
Задача: вывести все трёхзначные числа, большие квадрата суммы своих цифр. Но вопрос такой: если я нашла это число, то мне надо его вывести,...

Ошибка компиляции ассемблерной вставки
Добрый вечер. Захотелось мне сделать ассемблерную вставку в C++ код. Сделал. Но компилятору MinGW чето не нравится. Выдает следующие ошибки...

9
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.11.2012, 12:14
Емнип, стр. 2
Assembler
1
    .MODEL  FLAT, C
стр. 6
Assembler
1
multiplication PROC matrix_1:DWORD, N1:DWORD, M1:DWORD, matrix_2:DWORD, N2:DWORD, M2:DWORD, matrix_result:DWORD
а стр. 11-17 можно убрать.
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
23.11.2012, 18:25  [ТС]
Отредактировал как вы написали. Но вопрос в том, как мне скомпилировать все это? Т.е. сначала должен быть код ассемблера, а потом си. Или как то организовать ассемблеровскую вставку командой _asm? Или сначала скомпилировать ассемблеровский код в тасме а потом путь к этому файлу?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.11.2012, 18:37
Цитата Сообщение от zenkov Посмотреть сообщение
сначала скомпилировать ассемблеровский код в тасме
Лучше в МАСМе. А потом скормить объектный файл линкеру вместе с объектником из-под Си или включить в проект. Не знаю как это звучит в visual studio, но в Ваткоме добавление в проект .asm-файла вызывает его автоматическую трансляцию заданным ассемблером и компоновку.
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
23.11.2012, 19:51  [ТС]
Вы могли бы поподробнее расписать?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.11.2012, 20:12
Что расписать? У меня нет VS2010. Я даже понятия не имею, что это...

Добавлено через 15 минут
И да, на резонный вопрос "А тогда какого...?" отвечаю сразу - есть стандарт ANSI, ваши исходники у меня спокойно транслируются с помощью WASM и компилируются wpp386/wlink. Нюансы реализации интересны только пользователю конкретного компилятора. ВотЪ.
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
23.11.2012, 20:16  [ТС]
Как добавить в проект .asm-файл хотя бы в том же Ваткоме
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.11.2012, 20:23
В окошечке со списком файлов проекта нажать <Ins>. Появится диалог Add File(s)
Выбрать в "Files of type"->.asm, выбрать файл нажать Add, а не Add all.
После того как файл появится в списке - ПКМ по нему ->Source options-> Assembler switches
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
23.11.2012, 20:49
Вобщем, в аттаче поправленые исходники и батник. Сначала запускаете wasm mux.asm , потом bld.cmd mx.c mux.obj
Вложения
Тип файла: zip MUX.ZIP (2.2 Кб, 9 просмотров)
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
23.11.2012, 22:13
Ассемблер для Windows используя Visual Studio
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2012, 22:13
Помогаю со студенческими работами здесь

Из ассемблерной вставки в локальную переменную
Нужно из ассемблерной вставки передать содержимое стека st(0) из указанного места в локальную переменную процедуры из которой запущена...

Выполнить с использованием ассемблерной вставки
Нужно подсчитать кол-во цифр в троке из 10 символов. Реализовать в виде ассемблерной вставки. Подскажите пожалуйста как сделать!

Вывести числа от 1 до х из ассемблерной вставки в С
Всем добрый вечер,я очень надеюсь что найдётся добрый человек который сможет объяснить мне следующее (работаю с асемблерными вставками в...

Тестирование стека методом ассемблерной вставки
Здравствуйте! Как можно протестировать исполняемый код с помощью ассемблерной вставки на заполнение стека? Ну или распечатать...

Ошибка при компилировании ассемблерной вставки
При попытки добавить ассемблерную вставку выдается ошибка: unit1.pas(31,3) Fatal: Selected assembler reader not supported.. независимо...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru