Ассемблерная вставка - 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();
}

Оцени полезность:

13   голосов , оценка 4.385 из 5
Похожие ответы