Слить два массива в третий - 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
Объяснение кода листинга программы
- pushad - в начале и конце программы, обычно используется для сохранения и восстановления регистра стека
- mov edi,[str2] - перенос адреса второго массива в регистр edi
- mov esi,[str] - перенос адреса первого массива в регистр esi
- mov ecx,[n] - перенос значения n в регистр ecx (смещение для второго массива)
- rep movsd - повторять блок команд до тех пор, пока ecx не станет равным нулю (копирование строки из памяти в память, при этом каждый байт будет заменен на два)
- mov esi,[str1] - перенос адреса первого массива в регистр esi
- mov ecx,[m] - перенос значения m в регистр ecx (смещение для первого массива)
- rep movsd - повторение блока команд до тех пор, пока ecx не станет равным нулю (копирование строки из памяти в память, при этом каждый байт будет заменен на два)
- popad - восстановление регистра стека Примечание: значения переменных str, str1, n и m должны быть установлены до выполнения этого кода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д