Как умножить две матрицы размера при использовании встроенной сборки в C++ ⇐ C++
-
Anonymous
Как умножить две матрицы размера при использовании встроенной сборки в C++
I wrote this code in C++ with inline assembly _asm for square matrix multiplication.
#include using namespace std; int main() { int n = 2; int A[2][2] = { {1, 2}, {3, 4} }; int B[2][2] = { {5, 6}, {7, 8} }; int C[2][2] = { {0, 0}, {0, 0} }; _asm { mov ecx, n lea esi, A lea edi, B lea edx, C outer_loop : push ecx mov ecx, n inner_loop : push ecx mov eax, [esi] ; load A[k] mov ebx, [edi] ; load B[k][j] imul eax, ebx ; compute A[k] * B[k][j] add [edx], eax ; accumulate result in C[j] add esi, 4 ; increment A pointer add edi, 4 ; increment B pointer add edx, 4 ; increment C pointer pop ecx loop inner_loop ; repeat for all k add esi, 400 ; jump to next row of A sub esi, ecx ; adjust A pointer mov eax, ecx imul eax, 4 sub eax, n imul eax, 4 lea edi, [edi + eax] ; jump to next column of B pop ecx loop outer_loop ; repeat for all i } cout
Источник: https://stackoverflow.com/questions/780 ... embly-in-c
I wrote this code in C++ with inline assembly _asm for square matrix multiplication.
#include using namespace std; int main() { int n = 2; int A[2][2] = { {1, 2}, {3, 4} }; int B[2][2] = { {5, 6}, {7, 8} }; int C[2][2] = { {0, 0}, {0, 0} }; _asm { mov ecx, n lea esi, A lea edi, B lea edx, C outer_loop : push ecx mov ecx, n inner_loop : push ecx mov eax, [esi] ; load A[k] mov ebx, [edi] ; load B[k][j] imul eax, ebx ; compute A[k] * B[k][j] add [edx], eax ; accumulate result in C[j] add esi, 4 ; increment A pointer add edi, 4 ; increment B pointer add edx, 4 ; increment C pointer pop ecx loop inner_loop ; repeat for all k add esi, 400 ; jump to next row of A sub esi, ecx ; adjust A pointer mov eax, ecx imul eax, 4 sub eax, n imul eax, 4 lea edi, [edi + eax] ; jump to next column of B pop ecx loop outer_loop ; repeat for all i } cout
Источник: https://stackoverflow.com/questions/780 ... embly-in-c
Мобильная версия