Произвести слияние массивов А и В, чтобы массив С был упорядочен по возрастанию - Assembler/MASM
Формулировка задачи:
Создать 2 массива: А[0..N-1], отсортированный по возрастанию и В[1..M], отсортированный по убыванию. Произвести слияние массивов А и В в массив С[0..N- 1+M] таким образом, чтобы массив С был упорядочен по возрастанию. Слияние производить в соответствии с упорядоченностью А и В, но сортировку не делать.
Я для своего удобства сделал её на Си, но мне нужно перевести это на Ассемблер с чем у меня возникают проблемы. Без сортировки сделать не получается.
#include#include #include int main() { setlocale(LC_ALL, "RUSSIAN"); const int n = 10, m = 5; int a[n], b[m], c[n + m], i, j, k; printf("Введите %d элементов массива 'a' по возрастанию: ", n); for (i = 0; i < n; i++) scanf("%d", &a[i]); printf("Введите %d элементов массива 'b' по убыванию: ", m); for (i = 0; i < m; i++) scanf("%d", &b[i]); i = k = 0; j = m - 1; while (i != n && j != -1) { if (a[i] <= b[j]) { c[k] = a[i]; i++; } else { c[k] = b[j]; j--; } k++; } while (i <= n) { c[k] = a[i]; i++; k++; } while (j >= 0) { c[k] = b[j]; j--; k++; } printf("\nМассив c: "); for (i = 0; i < n + m; i++) printf("%d ", c[i]); _getch(); return 0;
Решение задачи: «Произвести слияние массивов А и В, чтобы массив С был упорядочен по возрастанию»
textual
Листинг программы
.686 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data arrA dd 10, 51, 87, 93, 98, 123, 160, 168, 176, 251, 271, 295, 297, 298, 315, 325 LenA dd ($-arrA)/4 arrB dd 181, 179, 168, 167, 113, 93, 83, 82, 53, 6 LenB dd ($-arrB)/4 aszMsgArrayA db 0Dh, 0Ah, 'Array A:', 0Dh, 0Ah, 0 aszMsgArrayB db 0Dh, 0Ah, 'Array B:', 0Dh, 0Ah, 0 aszMsgResult db 0Dh, 0Ah, 'Result C:', 0Dh, 0Ah, 0 aszInteger db '%4d', 0 aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0 .data? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Buffer db 1024 dup(?) BufLen dd ? arrC dd 1024 dup(?) LenC dd ? .code ShowArray proc lpArray:DWORD, uiAmount:DWORD pushad mov ecx, [uiAmount] mov esi, [lpArray] @@ForI: push ecx lodsd invoke wsprintf, ADDR Buffer, ADDR aszInteger, eax invoke StrLen, ADDR Buffer mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL pop ecx loop @@ForI popad ret ShowArray endp main proc ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax invoke ClearScreen ;вывод исходных данных invoke WriteConsole, hConsoleOutput, ADDR aszMsgArrayA,\ LENGTHOF aszMsgArrayA - 1, ADDR BufLen, NULL invoke ShowArray, ADDR arrA, [LenA] invoke WriteConsole, hConsoleOutput, ADDR aszMsgArrayB,\ LENGTHOF aszMsgArrayB - 1, ADDR BufLen, NULL invoke ShowArray, ADDR arrB, [LenB] ; mov eax, [LenA] add eax, [LenB] mov [LenC], eax ;слияние массивов, пока присутствуют элементы в обоих lea esi, [arrA] lea ebx, [arrB] lea edi, [arrC] mov ecx, [LenA] mov edx, [LenB] lea ebx, [ebx+4*edx-4] jmp @@TestIndxs @@whileIJ: mov eax, [esi] cmp eax, [ebx] cmovg eax, [ebx] mov ebp, 0 stosd mov eax, 1 cmovg eax, ebp lea esi, [esi+4*eax] sub ecx, eax xor eax, 1 neg eax lea ebx, [ebx+4*eax] neg eax sub edx, eax @@TestIndxs: mov eax, 0 cmp ecx, 1 adc eax, eax cmp edx, 1 adc eax, eax cmp eax, 0 je @@whileIJ @@breakIJ: @@AddArrA: jecxz @@AddArrB rep movsd @@AddArrB: mov ecx, edx mov esi, ebx jecxz @@StopMerge rep movsd @@StopMerge: ;вывод результата invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\ LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL invoke ShowArray, ADDR arrC, [LenC] ;ожидание нажатия ENTER invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\ LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL invoke ExitProcess, 0 main endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д