Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите понять кусок программы (assembler) / 16 сообщений из 16, страница 1 из 1
19.03.2011, 23:43
    #37173980
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
Здравствуйте. Собственно код:
Код: plaintext
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
#include <iostream>
#include <time.h>
#include <conio.h>
#define size  10 
using namespace std;

void main() 
{

srand( (unsigned)time( NULL ) );
int mas[size], i , *a = mas, b[size],c,n;
cout<<"Massiv: "<<endl;
for (i= 0 ;i<size;i++) 
{
	mas[i]=rand()% 100 + 1 ;
	cout<<mas[i]<<" ";
}
cout<<endl;
cout<<endl;


_asm
{
cikl1:
     push ecx
     mov esi, a 
	 mov edi, a
     add edi,  4  
     mov ecx, size- 1 

cikl2:

mov eax, [esi]
mov edx, [edi]

cmp eax, edx
	
jnc _end_if 
mov [edi],eax
mov [esi],edx


_end_if:
        add esi, 4 
        add edi, 4 
        loop cikl2

		pop ecx
		loop cikl1


mov eax,a
mov ecx,size
cikl:
mov bx,[eax]
inc eax
loop cikl
}

cout<<endl<<endl<<"Massiv, asm: "<<endl;
for (i= 0 ;i<size;i++)
{
cout<<mas[i]<<" ";
}
getch();}

Программа сортирует массив по убыванию.
Не обращайте внимание на начало, программа писалась в си++, дальше идет вставка ассемблера. Не могу понять что идет после loop cikl1
Какое значение у нас в а, зачем его перемещать и т.д.
Спасибо.
...
Рейтинг: 0 / 0
20.03.2011, 10:30
    #37174064
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscsВот код:
int *a = mas

....................

Какое значение у нас в а?

Странный вопрос... Такое же как и перед сортировкой. Указатель на начало массива.


автор, зачем его перемещать и т.д.
Его никто и не перемещает.
В цикле элементы массива кладутся в bx. После чего, eax очевидно указывает на конец массива.
Не знаю зачем это нужно. Закоментируй блок, что изменится?
...
Рейтинг: 0 / 0
20.03.2011, 12:31
    #37174123
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
Хм, действительно без него все отлично работает. Спасибо)
У меня еще осталось пару непонятных вопросов. Точнее вопросы понятные, ответы непонятные)
pop ecx зачем это нужно?
И еще, как я понял сортировка заканчивает проходить заново тогда, когда у нас не остается элементов, за которыми идут больше элементы. Как оно понимает вообще это? И когда останавливаться...
...
Рейтинг: 0 / 0
20.03.2011, 19:16
    #37174399
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscspop ecx зачем это нужно?

ecx - счетчик цикла.

так-как циклы вложены, то одного счетчика не хватает.
поэтому, перед началом вложенного цикла, сохраняем старое значение счетчика командой push, заносим в ecx - необходимой кол-во шагов внутреннего цикла, а поле завершения внутреннего цикла - возвращаем старое значение командой pop.
...
Рейтинг: 0 / 0
21.03.2011, 14:46
    #37175483
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
ZyK_BotaN, что-то я не сильно понимаю. Можно тоже самое только с примером, там типа какое там сразу значение, как оно меняется во время цикла....плз
...
Рейтинг: 0 / 0
21.03.2011, 15:04
    #37175535
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscsZyK_BotaN, что-то я не сильно понимаю. Можно тоже самое только с примером, там типа какое там сразу значение, как оно меняется во время цикла....плз

можно.
вот цикл на 5 шагов:

mov ecx, 5
:l
;
loop :l

операция loop работает так, сначала делает декремент ecx, а потом, если ecx не равен нулю, то переходит на заданную метку.

чтобы сделать вложенный цилк, нужно юзать поп и пуш.
Пример:

mov ecx, 5
:l1
push ecx
mov ecx, 5
:l2
:
loop l2
pop ecx
loop l1
...
Рейтинг: 0 / 0
21.03.2011, 15:58
    #37175668
Автор:
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
ZyK_BotaNчтобы сделать вложенный цилк, нужно юзать поп и пуш.

Не так уж и нужно в данном случае. В циклах ebx свободен. Можно было использовать явный декремент и jnz.
А если вежливо попросить, то с ebp можно поиграть.

Я кстати не понял - а где ecx для первого цикла инициализируется? cikl2 выполняется size-1 раз, а cikl1?
...
Рейтинг: 0 / 0
21.03.2011, 17:29
    #37175895
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
Как я понял ecx это то, сколько будет выполняться цикл, написанный после него.
авторmov ecx, 5
:l1
push ecx
mov ecx, 5
:l2
:
loop l2
pop ecx
loop l1


Пуш сохраняет значение есх, что было до него, и затем записывает в него новое значение. А командой поп восстанавливается старое значение есх?
...
Рейтинг: 0 / 0
21.03.2011, 18:16
    #37176027
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscsКак я понял ecx это то, сколько будет выполняться цикл, написанный после него.
авторmov ecx, 5
:l1
push ecx
mov ecx, 5
:l2
:
loop l2
pop ecx
loop l1


Пуш сохраняет значение есх, что было до него, и затем записывает в него новое значение. А командой поп восстанавливается старое значение есх?
да.
...
Рейтинг: 0 / 0
21.03.2011, 18:20
    #37176034
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
push кладет в стек значение указанного регистра
pop вынимает из стека значение в указанный регистр

push ax
push bx
pop ax
pop bx

поменяли местами знчения в ax и bx

ну а в твоем коде да, "сохранение"/"востановление" ecx производится
...
Рейтинг: 0 / 0
21.03.2011, 23:37
    #37176349
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
push ax
push bx
pop ax
pop bx

Че это они поменялись?
Восстановилось ах а потом бх, как и сразу было...
...
Рейтинг: 0 / 0
21.03.2011, 23:42
    #37176358
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscspush ax
push bx
pop ax
pop bx

Че это они поменялись?
Восстановилось ах а потом бх, как и сразу было...как работает стек понимаем?
...
Рейтинг: 0 / 0
21.03.2011, 23:53
    #37176364
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscspush ax
push bx
pop ax
pop bx

Че это они поменялись?
Восстановилось ах а потом бх, как и сразу было...

учись студент : http://en.wikipedia.org/wiki/LIFO_%28computing%29
...
Рейтинг: 0 / 0
22.03.2011, 08:13
    #37176519
bosscs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
Всем еще раз спасибо.
...
Рейтинг: 0 / 0
22.03.2011, 12:50
    #37176998
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
Можно вообще не прибегать к pop и push для вложенных циклов (что достаточно сложно не только для начинающих программистов), а просто использовать переменные в памяти типа
inc count1
...
inc couint2
...
cmp count2,10
...
cmp count1,5
...
Рейтинг: 0 / 0
25.03.2011, 11:53
    #37182293
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять кусок программы (assembler)
bosscsЧе это они поменялись?
Ага, значит не зря такой пример привел ))))
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите понять кусок программы (assembler) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]