Ассемблерная вставка - Assembler (224549)
Формулировка задачи:
На Си создать с помощью датчика случайных чисел(random) файл F1 с целочисленными матрицами 2х3. Из файла F1 получить файл F2, содержащий транспонированные матрицы на ассемблере файла F1.
Если раскомментить кусок на си и закомментить ассемблер, то прекрасно все работает, а вот с асс у меня проблемы. Подскажите, пожалуйста, как вывести матрицу. Транспортировка взята из учебника по ассемблеру. Неуверенна, что я правильно ее использовала.
#include <stdio.h> #include <time.h> // Директива нужна для инициализации функции rand() #include <locale.h> #define N 2 #define M 3 void main() { setlocale(LC_ALL, "Russian"); int mas[N][M]; int z = 0, k = 0; int i, j, b, tmp; printf("Введите число матриц: "); scanf("%d", &z); while ((k<z) && (k<10)) { printf("\nИсходная матрица:\n"); k++; for (i = 0; i<N; i++) { for (j = 0; j<M; j++) { mas[i][j] = rand() % 10; printf("%d ", mas[i][j]); } printf("\n"); } // for (i = 0; i<N; i++) //транспонирование матрицы на Си // { // for (j = i; j < M; j++) // { // tmp = mas[j][i]; // mas[j][i] = mas[i][j]; // mas[i][j] = tmp; // } // } _asm //транспонирование матрицы на asm { mov ecx, N xor esi, esi m1 : push ecx mov ecx, M xor edi, edi m2 : mov eax, M mul esi add eax, edi mov ebx, eax mov al, mas[ebx] // mas входной mov temp, eax mov eax, N mul edi add eax, esi mov ebx, eax mov eax, temp mov _mas[ebx], eax // _mas исходный inc edi loop m2 inc esi pop ecx loop m1 } printf("\nТранспортированная матрица:\n"); // вот тут как сделать вывод нашей матрицы _mas for (i = 0; i<M; i++) { for (j = 0; j < N; j++) { printf("%d ", mas[i][j]); } printf("\n"); } } getchar(); getchar(); }
Решение задачи: «Ассемблерная вставка»
textual
Листинг программы
#include <stdio.h> #include <time.h> // Директива нужна для инициализации функции rand() #include <locale.h> #define N 2 #define M 3 void main() { setlocale(LC_ALL, "Russian"); int mas[N][M]; int z = 0, k = 0; int i, j, b, tmp; printf("Введите число матриц: "); scanf("%d", &z); while ((k<z) && (k<10)) { printf("\nИсходная матрица:\n"); k++; for (i = 0; i<N; i++) { for (j = 0; j<M; j++) { mas[i][j] = rand() % 10; printf("%d ", mas[i][j]); } printf("\n"); } __asm //транспонирование матрицы на asm { // for (i = 0; i<N; i++) xor ebx, ebx xor esi, esi mov dword ptr i, ebx // { // for (j = i; j < M; j++) m1: mov eax, dword ptr i mov dword ptr j, eax imul edx, dword ptr j, 0cH shl eax, 2 add eax, ebx add edx, esi m2 : cmp dword ptr j, 3 jge m3 // { // tmp = mas[j][i]; mov ecx, dword ptr mas[edx] inc dword ptr j mov dword ptr tmp, ecx mov ecx, dword ptr mas[eax] // mas[j][i] = mas[i][j]; // mas[i][j] = tmp; // } add eax, 4 mov dword ptr mas[edx], ecx mov ecx, dword ptr tmp add edx, 0cH mov dword ptr mas - 4[eax], ecx jmp m2 m3 : mov eax, dword ptr i // } add ebx, 0cH inc eax add esi, 4 mov dword ptr i, eax cmp ebp, eax jg } printf("\nТранспортированная матрица:\n"); for (i = 0; i<M; i++) { for (j = 0; j < N; j++) { printf("%d ", mas[i][j]); } printf("\n"); } } getchar(); getchar(); }