Слить два массива в третий - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день! Помогите написать часть программы на встроенном asm,а именно произвести слияние двух массивов в третий(т.е. по коду это str и str1 слить в str2).Сейчас я написал программу полностью на Си. Задание:
"/* Создать два целочисленных файла с положительными,упорядоченными по возрастанию * элементами,вводя данные с клавиатуры.Признак конца ввода данных в файл-набор нуля. * Слить созданные файлы в третий,упорядоченный по возрастанию файл.Сохранив все * элементы исходных файлов*/"

Листинг main:

 /* Создать два целочисленных файла с положительными,упорядоченными по возрастанию
  * элементами,вводя данные с клавиатуры.Признак конца ввода данных в файл-набор нуля.
  * Слить созданные файлы в третий,упорядоченный по возрастанию файл.Сохранив все
  * элементы исходных файлов*/
 
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include "func.h"
 #define N 128
 
extern void bubblesort(int *a, int n);
extern int delite_files(void);
extern void output_massiv(int *arr,int n,FILE *file,int z);
 
int main(void)
{
  int i=0,g=0,n,m,z=0;
  int *str,*str1,*str2;
//open files  
  FILE *file1,*file2,*file3;
     if((file1=fopen("/home/bladzher/study/C/files/file1.txt","w")) == 0){printf("ERROR");}
         if((file2=fopen("/home/bladzher/study/C/files/file2.txt","w")) == 0){printf("ERROR");}
             if((file3=fopen("/home/bladzher/study/C/files/file3.txt","w")) == 0){printf("ERROR");} 
 
 //end
 //malloc
    str=(int *)malloc(N*sizeof(int));
    if(str == NULL) {printf("Error:malloc str");}
        str1=(int *)malloc(N*sizeof(int));
    if(str1 == NULL) {printf("Error:malloc str1");}
 //end
 //------program------
               printf("Enter the massiv #file1:\n>");
        for(i = 0;i < N;i++) {
           scanf("%d",&str[i]);
           if(str[i]==0){n=i;break;} else 
           if(str[i] < 0){printf("Error: Ввод только положительных чисел!Попробуйте снова.\n>");i--;} 
           }
               printf("Enter the massiv #file2:\n>");
        for(i = 0;i < N;i++) {
           scanf("%d",&str1[i]);
           
           if(str1[i]==0){m=i;break;} else 
           if(str1[i] < 0){printf("Error: Ввод только положительных чисел!Попробуйте снова.\n>");i--;} 
           }           
           printf("massiv #file1:\n>");
  output_massiv(str,n,file1,z=0);
                      printf("\nmassiv #file2:\n>");
  output_massiv(str1,m,file2,0);
 //sort
 bubblesort(str,n);
 bubblesort(str1,m);
 //end
 printf("\n\nSort massiv #file1:\n>");
 output_massiv(str,n,file1,1);
 printf("\nSort massiv #file2:\n>");
  output_massiv(str1,m,file2,1);
//file3
      g=n+m;
    str2=(int *)malloc(g*sizeof(int));
    if(str2 == NULL) {printf("Error:malloc str1");}
      memcpy(str2,str,n*sizeof(int)); //Копирование в итог данных из первого массива
      memcpy(str2+n,str1,m*sizeof(int)); //Копирование в конец итогового данных второго массива
      
           printf("\n\nmassiv #file3:\n>");
  output_massiv(str2,g,file3,0);
       bubblesort(str2,g);
      printf("\nSort massiv #file3:\n>");
  output_massiv(str2,g,file3,1);
//end             
//------end------
//close files          
    fclose(file1);
    fclose(file2);
    fclose(file3);
//end  
//in
if((delite_files())==0){printf("Файлы успешно удалены!");}else{printf("Файлы не удалены!");}
//out
free(str);
free(str1);
free(str2);
  printf("\n\nРабота программы успешно завершена!\n");
  return 0;
}

Листинг func.h:

  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
  #define SWAP(A, B) { int t = A; A = B; B = t; }

void bubblesort(int *a, int n)
{
  int i, j;
 
  for (i = n - 1; i > 0; i--)
  {
    for (j = 0; j < i; j++)
    {
      if (a[j] > a[j + 1])
        SWAP( a[j], a[j + 1] );
    }
  }
}
 
void output_massiv(int *arr,int n,FILE *file,int z)
{
    int i=0;
 
  for(i = 0;i < n;i++) {
           printf("%d ",arr[i]);
           if(z==1){
         fprintf(file,"%d ",arr[i]);
     }
           }    
}
 
int delite_files(void){
      int tmp=-1;
         printf("\nУдалить файлы?(1|0):\n>");
         scanf("%d",&tmp);
   while(tmp!=1 && tmp!=0){
       printf("Ошибка ввода!Попробуйте снова:0 оставить файлы.1 удалить файлы.\n>");
   scanf("%d",&tmp);
 }
 
  //  if(tmp!=1 && tmp!=0){printf("Ошибка ввода!Попробуйте снова:0 оставить файлы.1 удалить файлы.\n");}else{
  if (tmp==1){
       remove("/home/bladzher/study/C/files/file1.txt");
       remove("/home/bladzher/study/C/files/file2.txt");
       remove("/home/bladzher/study/C/files/file3.txt");
       return 0;
    }else{
        return -1;
        }
}

Решение задачи: «Слить два массива в третий»

textual
Листинг программы
pushad
mov edi,[str2]
mov esi,[str]
mov ecx,[n]
rep movsd
mov esi,[str1]
mov ecx,[m]
rep movsd
popad

Объяснение кода листинга программы

  1. pushad - в начале и конце программы, обычно используется для сохранения и восстановления регистра стека
  2. mov edi,[str2] - перенос адреса второго массива в регистр edi
  3. mov esi,[str] - перенос адреса первого массива в регистр esi
  4. mov ecx,[n] - перенос значения n в регистр ecx (смещение для второго массива)
  5. rep movsd - повторять блок команд до тех пор, пока ecx не станет равным нулю (копирование строки из памяти в память, при этом каждый байт будет заменен на два)
  6. mov esi,[str1] - перенос адреса первого массива в регистр esi
  7. mov ecx,[m] - перенос значения m в регистр ecx (смещение для первого массива)
  8. rep movsd - повторение блока команд до тех пор, пока ecx не станет равным нулю (копирование строки из памяти в память, при этом каждый байт будет заменен на два)
  9. popad - восстановление регистра стека Примечание: значения переменных str, str1, n и m должны быть установлены до выполнения этого кода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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