Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
1
GAS/AT&T

[SSE] Сложение матриц

14.12.2021, 17:23. Показов 1212. Ответов 1

Author24 — интернет-сервис помощи студентам
Привет форум.


Задача: Переписать код с "С" в "Ассемблер АТ&T"

C
1
2
3
4
5
6
7
8
9
10
11
12
double* sum(double* matrixA, int N1, int M1, double* matrixB, int N2, int M2)
{
    if ((N1 == N2) && (M1 == M2)) {
        double* matrixC = (double*)malloc(N1 * M2 * sizeof(double));
        for (int i = 0; i < N1*M1; i++) {
            matrixC[i] = (matrixA[i] + matrixB[i]);
        }
        return matrixC;
    }
    else printf("Sum: Matrix not equels\n");
    return 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
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
.globl sumAs
 
.data
    format: .string "%s\n"  
    mess: .string "Sum: Matrix not equals\n"
    
/* Для передачи параметров в 64-х битовых операционных системах Linux 
последовательно используют шесть регистров: 
rdi, matrixA 
rsi, N1
rdx, M1
rcx, matrixB
r8,  N2
r9.  M2
*/
 
.text
 
.func
sumAs:
    sub $8, %rsp // %rsp = 16x
    
permission_check:
    push %rsi // -8 
    push %rdx // -16 запомнили стороны матрицы
    
    cmp %rsi, %r8
    JNE print_end_message
    cmp %rdx, %r9
    JNE print_end_message
    
    pop %rdx // -8 
    pop %rsi // 16x стек пуст значения извлечены
    
init_memory:
    push %rdi // -8  освободили регистр %rdi для malloc 
    push %rcx // -16 сохранили matrixB
    imul %rsi, %rdx // результат умножения в %rdx
    push %rdx // -24 сохранили результат умножения 
    sub $8, %rsp // -32 стек кратен 16
    
    mov %rdx, %rdi
    lea (, %rdi, 8), %rdi // умножили %rdi на 8
    call malloc // кушает %rdi возвращает %rax
    
    add $8, %rsp // -24
    pop %rdx // -16
    pop %rcx // -8 
    pop %rdi // 16x 
 
    xor %rsi, %rsi // создали счетчик равный 0
    and $-2, %rdx // Это выравнивание на четное количество элементов массива?
    
/*
rax, matrixC ссылка на выделенную память malloc
rdi, matrixA 
rsi, 0
rdx, size (N1*M1)
rcx, matrixB
r8,  ???
r9.  ???
*/
 
a_start_sum:
    cmp %rdx, %rsi  // (i - size)
    jge end_loop  // if (i - size)0 goto end_loop
    
    movapd (%rdi, %rsi, 8), %xmm0         
    addpd  (%rcx, %rsi, 8), %xmm0         
    movapd %xmm0, (%rax, %rsi, 8)     
    
    add $2, %rsi    
    jmp a_start_sum
    
    // здесь нужно сложить оставшийся кусочек если он есть
 
end_loop:
    add $8, %rsp
    ret // выход с выводом matrixC //
    
print_end_message:
    add $16, %rsp // очистка
    
    lea format(%rip), %rdi // сюда передаем первый аргумент для принта. Строковый тип данных
    lea mess(%rip), %rsi // ссылка на место хранения строки 
    mov $0, %al
    call printf
    
    xor %eax, %eax
    add $8, %rsp
    ret
    
.endfunc


Проблема заключается в том, как сложить последний элемент матриц, если количество элементов не четное?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2021, 17:23
Ответы с готовыми решениями:

MMX Сложение матриц
Помогите пожалуйста написать программу на ассемблер сложения двух матриц с применением инструкций...

Сложение двух матриц
Кто сможет написать код программы на TASM , в которой две матрицы(заданные в коде) будут...

Сложение элементов двух матриц
необходимо сложить елементы двух массивов. VS выдаёт ошибку на строку mov sum, bl :improper operand...

Структура с полями. Реализовать сложение, умножение матриц, а также нахождение определителя
Здравствуйте, дорогие форумчане. Необходимо представить матрицу 3х3 как структуру с полями,...

Сложение двух одномерных массивов SSE
Дорого времени суток! Сравниваю быстродействие двух методов: 1й сложение массивов с...

1
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
16.12.2021, 19:32  [ТС] 2
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
.globl sumAs
 
.data
    format: .string "%s\n"  
    mess: .string "Sum: Matrix not equals\n"
    
/* Для передачи параметров в 64-х битовых операционных системах Linux 
последовательно используют шесть регистров: 
rdi, matrixA 
rsi, N1
rdx, M1
rcx, matrixB
r8,  N2
r9.  M2
*/
 
.text
 
.func
sumAs:
    sub $8, %rsp // %rsp = 16x
    
permission_check:    
    cmp %rsi, %r8
    JNE print_end_message
    cmp %rdx, %r9
    JNE print_end_message
    
init_memory:
    push %rdi       // -8  освободили регистр %rdi для malloc 
    push %rcx       // -16 сохранили matrixB
    imul %rsi, %rdx // результат умножения в %rdx
    push %rdx       // -24 сохранили результат умножения 
    sub $8, %rsp    // -32 стек кратен 16
    
    mov %rdx, %rdi
    lea (, %rdi, 8), %rdi // умножили %rdi на 8
    call malloc           // кушает %rdi возвращает %rax
    
    add $8, %rsp    // -24
    pop %rdx        // -16
    pop %rcx        // -8 
    pop %rdi        // 16x 
 
    xor %rsi, %rsi  // создали счетчик равный 0
    mov %rdx, %r10   // сохранили размер
    and $-2, %rdx   // Это выравнивание на четное количество элементов массива?
    
/*
rax, matrixC ссылка на выделенную память malloc
rdi, matrixA 
rsi, 0
rdx, size (N1*M1) четное
rcx, matrixB
r8,  ???
r9.  ???
r10  size (N1*M1) 
*/
 
a_start_sum:
    cmp %rdx, %rsi  // (i - size) 
    jge b_start_sum // if (i - size)0 goto end_loop
    
    movapd (%rdi, %rsi, 8), %xmm0         
    addpd  (%rcx, %rsi, 8), %xmm0         
    movapd %xmm0, (%rax, %rsi, 8)     
    
    add $2, %rsi
    jmp a_start_sum
    
b_start_sum:
    cmp %rdx, %r10
    JE end_loop 
    
    movsd (%rdi, %rsi, 8), %xmm0
    addsd (%rcx, %rsi, 8), %xmm0         
    movsd %xmm0, (%rax, %rsi, 8)   
    
end_loop:
    add $8, %rsp
    ret // выход с выводом matrixC
    
print_end_message:
    lea format(%rip), %rdi  // сюда передаем первый аргумент для принта. Строковый тип данных
    lea mess(%rip), %rsi    // ссылка на место хранения строки 
    mov $0, %al
    call printf
    
    xor %eax, %eax
    add $8, %rsp
    ret
    
.endfunc
0
16.12.2021, 19:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2021, 19:32
Помогаю со студенческими работами здесь

Реализовать процедуру умножения квадратных матриц (SSE)
Реализовать процедуру умножения квадратных матриц (размером кратным четырём) без использования...

Перемножение матриц, умножение матриц на вектор, сложение матриц
Помогите пожалуйста написать программу, которая производит основные действия с матрицами...

Транспонирование, умножение матриц, сложение матриц Реализовать в одной программере
транспонирование, умножение матриц, сложение матриц; B^3-A^T Реализовать в одной программере....

Скалярное произведение векторов, сложение матриц, транспонирование матриц
Необходимо составить что то вроде калькулятора с процедурами, что бы вычислял скалярное...

Параллельное программирование.Сложение матриц. Для задания значений элементов матриц используется рандом чисел
Посмотрев несколько книг,я не нашел или не понял как мне получить результат. PROGRAM RAND REAL A,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru