Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
1

Сортировка пузырьком на VC++ с использованием директивы _asm

22.11.2015, 15:37. Просмотров 931. Ответов 12
Метки нет (Все метки)

Всем привет, надеюсь, разделом не ошибся. Дело в том, что у меня только вставка на ассемблере при помощи директивы _asm. Вроде всё написано, но почему-то ругается на обращение к элементам массива. Почему - не могу понять. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#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");
 
}
Все компилируется, ни на что не ругается, но при запуске прогарммы происходит вот это:
0
Миниатюры
Сортировка пузырьком на VC++ с использованием директивы _asm   Сортировка пузырьком на VC++ с использованием директивы _asm  
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2015, 15:37
Ответы с готовыми решениями:

Блок схема.Сортировка «Пузырьком», Сортировка методом «Последовательных перестановок», Сортировка «Вставками»
Помогите, нужны блок схемы Сортировка «Вставками» Program Vstavka; uses dos; Type mass=array ...

Можете дать пример кода с использованием директивы #line?
Можете дать пример кода с использованием директивы #line? А также практическое применение...

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

Сортировка пузырьком
Добрый вечер! Возникла проблема с кодом. public static void BubbleSortRange(int array, int left,...

Сортировка пузырьком
Есть сортировка пузырьком, элементы заносятся в ТStringGrid, отсортированный массив нужно вывести в...

12
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 16:44 2
А сколько байт занимает тип int в C++? У вас везде к ESI единичка прибавляется, как будто int занимает 1 байт.
0
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 17:10  [ТС] 3
Всё верно, 4. Там изначально оно и было, это уже прям такой "жест отчаяния", когда правишь всё, что под руку попадется =). Только вот даже если +4 прибавлять, всё равно та же ошибка.
0
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 18:11 4
Возможно, нужно сохранять и восстанавливать регистр ESI, когда делается asm-вставка. И, возможно, не требуется RET в конце.
0
22.11.2015, 18:11
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 18:17  [ТС] 5
А можно поподробнее? В каком месте сохранять и восстанавливать?
0
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 18:21 6
Я не уверен, как оно в C++ делается, а в Delphi работает так:
Assembler
1
2
3
4
push esi
// тут ваш код, использующий esi
pop esi
// тут никакого RET нет
0
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 18:30  [ТС] 7
Попытался вот так, результат тот же.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    mov ecx,N //записали размер
    dec ecx //уменьшили на 1
    push esi
L1:
    push ecx //сохранил внешний счетчик цикла
    mov esi, array //загружаем адрес первого
L2:
    mov eax,[esi] //загрузим значение элемента
    cmp [esi+4],eax //сравним его со следующим
 
    jge L3
 
    xchg eax,[esi+4] //меняем местами пару значений
    mov [esi],eax
L3:
    add esi,1 //берем следующую пару элементов
    loop L2  //повторяем цикл
 
    pop ecx //восстановим внешний счетчик цикла
    loop L1 //повторяем внешний цикл
    pop esi
0
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 18:31 8
Assembler
1
 add esi,4 //берем следующую пару элементов
0
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 18:38  [ТС] 9
Так стоп, получается в каждом цикле сохранять? Что-то я не понимаю. Я его пушаю в самом начале и в самом конце. Если в L3 указать, то надо и в L1-l2 так же сделать?
0
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 18:51 10
Цитата Сообщение от ShadowScarab Посмотреть сообщение
Так стоп, получается в каждом цикле сохранять?
нет, только в начале asm-вставки PUSH, а в конце POP

не думаю, что ошибка вызвана именно строкой
Assembler
1
add esi,1
но правильно прибавлять именно 4 - размер элемента массива. Если прибавлять 1, то у вас будут захватываться соседние элементы массива как будто это один элемент и сама сортировка работать не будет
0
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 18:58  [ТС] 11
А, это из той же оперы что и [esi+4]. К сожалению, проблема сохраняется.
0
Hadros
36 / 36 / 17
Регистрация: 12.04.2012
Сообщений: 167
22.11.2015, 22:04 12
Лучший ответ Сообщение было отмечено ShadowScarab как решение

Решение

Пока знатоков c++ в теме не появилось, попробую по рассуждать. Чем внутри асм-вставки считается переменная array?
Assembler
1
  mov esi, array //загружаем адрес первого
Если это указатель на нулевой элемент массива, то всё нормально.
Если это значение нулевого элемента, то следует заменить эту строку на
Assembler
1
   lea esi, array //загружаем адрес первого
1
ShadowScarab
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 10
22.11.2015, 22:18  [ТС] 13
Чем внутри асм-вставки считается переменная array?
Это массив:
C++
1
2
int  const N=9; //размер массива
    int array[N]; //сам массив
Во всех примерах вставок что смотрел (конкретно книга Р.Ирвина), массив так и передается. На lea сейчас попробую изменить, спасибо.
UPD: таки действительно оно! Большое вам спасибо, все заработало.
0
22.11.2015, 22:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2015, 22:18

Сортировка пузырьком
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #define M 10 void main() { int...

Сортировка Пузырьком
Здравствуйте! Пытался выполнить задание: Сортировка Пузырьком - один из простейших способов...

Сортировка пузырьком.
Приветствую, тех кто заглянул в топик. Помогите, пожалуйста, решить задачу на C пузырьковой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.