Сортировка пузырьком на VC++ с использованием директивы _asm - Assembler
Формулировка задачи:
Всем привет, надеюсь, разделом не ошибся. Дело в том, что у меня только вставка на ассемблере при помощи директивы _asm. Вроде всё написано, но почему-то ругается на обращение к элементам массива. Почему - не могу понять. Вот код:
Все компилируется, ни на что не ругается, но при запуске прогарммы происходит вот это:
#include "stdafx.h" #include <iostream> #include <time.h> using namespace std; int main() { setlocale(LC_ALL, "Russian"); srand(time(NULL)); int const N=9; //размер массива int array[N]; //сам массив for (int i=0; i<9; i++)//его случайное заполнение { array[i]=rand()%9; } _asm //вставка на ассемблере { mov ecx, N //записали размер dec ecx //уменьшили на 1 L1: push ecx //сохранил внешний счетчик цикла mov esi, array //загружаем адрес первого L2: mov eax,[esi] //загрузим значение элемента cmp [esi+1],eax //сравним его со следующим jge L3 xchg eax,[esi+1] //меняем местами пару значений mov [esi],eax L3: add esi,1 //берем следующую пару элементов loop L2 //повторяем цикл pop ecx //восстановим внешний счетчик цикла loop L1 //повторяем внешний цикл L4: ret } for (int i=0; i<9; i++) { cout<<array[i]<<endl; } system("pause"); }
Решение задачи: «Сортировка пузырьком на VC++ с использованием директивы _asm»
textual
Листинг программы
mov esi, array //загружаем адрес первого
Объяснение кода листинга программы
mov esi, array
- Загружаем адрес первого элемента массива в регистр ESI.