powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите понять кусок программы (assembler)
16 сообщений из 16, страница 1 из 1
Помогите понять кусок программы (assembler)
    #37173980
bosscs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Собственно код:
Код: 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
Помогите понять кусок программы (assembler)
    #37174064
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bosscsВот код:
int *a = mas

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

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

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


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

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

так-как циклы вложены, то одного счетчика не хватает.
поэтому, перед началом вложенного цикла, сохраняем старое значение счетчика командой push, заносим в ecx - необходимой кол-во шагов внутреннего цикла, а поле завершения внутреннего цикла - возвращаем старое значение командой pop.
...
Рейтинг: 0 / 0
Помогите понять кусок программы (assembler)
    #37175483
bosscs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN, что-то я не сильно понимаю. Можно тоже самое только с примером, там типа какое там сразу значение, как оно меняется во время цикла....плз
...
Рейтинг: 0 / 0
Помогите понять кусок программы (assembler)
    #37175535
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите понять кусок программы (assembler)
    #37175668
Автор:
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaNчтобы сделать вложенный цилк, нужно юзать поп и пуш.

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

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


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


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

push ax
push bx
pop ax
pop bx

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

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

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

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

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

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


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