C++ to asm - Assembler

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

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

int Sum(int x[], int n, int nmin, int nmax) {
    int i;
    int s = 1;
 
    for (i = 0; i < n; i++)
         if (x[i] < nmin || x[i] >nmax) {
             s *= x[i]; }
    return s;
}
Как эту функцию перевести в асемблер?

Решение задачи: «C++ to asm»

textual
Листинг программы
int Sum(int arr[], int len, int nmin, int nmax) {
 __asm
    {
        mov edi, arr
        mov ecx, len
        mov eax, 01h
    loop_point: // if (arr[i] > nmax || nmin > arr[i]) L1
        mov edx, nmax                     
        cmp [edi], edx
        jg  L1
        mov edx, nmin
        cmp edx, [edi]
        jle   L2
    L1:
        mul [edi]
    L2:
        add edi, type arr
        loop loop_point
    }
}

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

  1. Передаются параметры функции: int arr[] — массив целых чисел int len — длина массива int nmin — минимальное значение для обработки int nmax — максимальное значение для обработки
  2. В блоке __asm происходит переназначение регистров: — EDI содержит адрес первого элемента массива arr — Ecx содержит длину массива len — Eax содержит 01h (неизвестное значение, возможно, это инициализация PUSHAD)
  3. Начинается цикл, который выполняется до тех пор, пока не будет выполнено условие arr[i] > nmax || nmin > arr[i]
  4. Внутри цикла выполняются следующие действия: — Edx содержит максимальное значение nmax — Cmp [edi], edx — сравнивается текущий элемент массива с максимальным значением nmax — Если текущий элемент больше nmax, то выполняется переход к метке L1 — Edx содержит минимальное значение nmin — Cmp edx, [edi] — сравнивается текущий элемент массива с минимальным значением nmin — Если текущий элемент меньше или равен nmin, то выполняется переход к метке L2
  5. Если условие arr[i] > nmax || nmin > arr[i] не выполняется, то выполняется действие mul [edi] (возможно, это умножение текущего элемента массива на какое-то значение)
  6. Если условие arr[i] > nmax || nmin > arr[i] выполняется, то выполняется действие add edi, type arr (возможно, это добавление к адресу текущего элемента массива некоторого значения, связанного с типом данных arr)
  7. Цикл продолжается до тех пор, пока не будет выполнено условие arr[i] > nmax || nmin > arr[i]

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


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

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

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