Ассемблерные вставки в делфи (Найти сумму всех отрицательных элементов) - Assembler
Формулировка задачи:
Здравствуйте! Вот такая задача: Дан массив из 100 элементов, заполняем рандомно от -10 до 20. Найти сумму всех отрицательных элементов. Вот код на делфи:
Нужно сделать ассемблерную вставку вместо кода
Проблема возникает массивом. Заранее спасибо!
Решение задачи: «Ассемблерные вставки в делфи (Найти сумму всех отрицательных элементов)»
textual
Листинг программы
push esi ; сохранить всё кроме eax, ecx, edx push ebx xor ebx, ebx ; sum = 0 lea esi, [a] ; esi = @a[i] mov ecx, n ; ecx уменьшается от n do 1 @loop: mov eax, [esi] ; eax = a[i] cdq ; edx = знак eax and eax, edx ; если eax > 0, edx = 0, eax = 0; если eax < 0, edx = ffff, eax = eax add ebx, eax add esi, 4 dec ecx jnz @loop mov [sum], ebx pop ebx ; восстановить pop esi
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Сохранение регистров:
- Push esi (сохранение регистра esi)
- Push ebx (сохранение регистра ebx)
- Инициализация переменной sum:
- Xor ebx, ebx (sum = 0)
- Переход к циклу:
- Lea esi, [a] (esi = @a[i])
- Mov ecx, n (ecx уменьшается от n do 1)
- Цикл для обработки каждого элемента массива:
- Mov eax, [esi] (eax = a[i])
- Cdq (edx = знак eax)
- And eax, edx (если eax > 0, edx = 0, eax = 0; если eax < 0, edx = ffff, eax = eax)
- Add ebx, eax (sum += eax)
- Add esi, 4 (esi += 4)
- Dec ecx (ecx--)
- Jnz @loop (если ecx больше нуля, перейти к началу цикла)
- Запись значения sum в переменную sum:
- Mov [sum], ebx (sum = ebx)
- Восстановление регистров:
- Pop ebx (восстановление ebx)
- Pop esi (восстановление esi)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д