Произвести слияние массивов А и В, чтобы массив С был упорядочен по возрастанию - 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

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


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

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

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