Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
1

Не работает цикл

15.09.2013, 19:36. Показов 1365. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mov esi,0
.WHILE esi<num     
            mov eax, clX
            div num
            mul esi
            mov MyRect.left,eax
            mov eax, clX
            div num
            inc esi
            mul esi
            dec esi
            mov MyRect.right,eax
            mov eax, clY
            div ten
            mov ebx, 10
            sub ebx, values[esi*4] 
            mul ebx 
            mov MyRect.top,eax
            push esi
            invoke FillRect,hDC,addr MyRect,brushes[esi*4] 
            pop esi     
            inc esi
        .ENDW
Выполняется только первый заход, т.е. рисует только один прямоугольник.
Если перед циклом поставить esi, например, равным два или три, тоже выполняется только первый заход - рисуется один прямоугольник, уже в другом месте и другого цвета, т.е. все правильно.

Так почему же цикл не выполняется num раз?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 19:36
Ответы с готовыми решениями:

Цикл: как работает цикл в цикле
Не могу понять как работает цикл в цикле например: repeat begin lalalala if что-то1&lt;&gt;100 then...

На Главной странице не работает правильно вывод (неккоректно работает цикл)
Я создал тему с нуля. И мне нужно было чтоб на главной странице(Главная)...

Цикл работает неправильно, в то время как POST работает
Всем привет! Я хотел написать под php скрипт с авторизацией, брут, на своем сайте(подбор пароля)....

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

7
Ab
76 / 76 / 2
Регистрация: 03.05.2012
Сообщений: 161
15.09.2013, 20:31 2
На первый взгляд, всё правильно. Попробуйте вместо макроинструкций сделать обычное "cmp esi, num" с условным переходом. Или в исполняемом файле этот фрагмент посмотрите, что за код там по факту получился.
0
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
15.09.2013, 20:39  [ТС] 3
Ab, пробовал, тоже самое..
я так подозреваю, может тело цикла слишком большое? не соблюдается ограничение длины перехода JMP?
0
Ab
76 / 76 / 2
Регистрация: 03.05.2012
Сообщений: 161
15.09.2013, 20:48 4
Ограничение только у JMP SHORT есть, если бы дело было в этом - компилятор либо написал бы ошибку, либо сам бы вместо SHORT обычный переход подставил. Причина в чем-то еще.
0
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
15.09.2013, 23:37 5
ArtVgd, проверку сделай функции на возвращаемое значение, мобыть рисовать рисует, а что либо не нравится и улетает.

Добавлено через 35 секунд
Цитата Сообщение от ArtVgd Посмотреть сообщение
не соблюдается ограничение длины перехода JMP
обычно компилятор сам считает и ругает за это
0
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
16.09.2013, 00:02  [ТС] 6
Проверку поставил, вроде все норм.

Странно очень, после цикла написал messageBox, не работает! И вообще ничего не хочет работать. Вот пример:

Вот полностью код из WM_PAINT:
Assembler
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
invoke  BeginPaint, hWnd, addr ps 
        mov hDC, eax
        push clY
        pop MyRect.bottom
        mov esi,0
        .WHILE esi<num     
            mov eax, clX
            div num
            mul esi
            mov MyRect.left,eax
            mov eax, clX
            div num
            inc esi
            mul esi
            dec esi
            mov MyRect.right,eax
            mov eax, clY
            div ten
            mov ebx, 10
            sub ebx, values[esi*4] 
            mul ebx 
            mov MyRect.top,eax
            push esi
            invoke FillRect,hDC,addr MyRect,brushes[esi*4] 
            pop esi     
            inc esi
        .ENDW
        invoke MessageBox,hWnd,0,0,0 ; - Ничего не открывается!
        invoke  EndPaint, hWnd, addr ps
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
16.09.2013, 06:48 7
ArtVgd,
странно, что перед делением нет обнуления edx. Можно только догадываться, что переменные num и ten имеют тип dword? Хотя вот num сравнивается с содержимым esi
1
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
16.09.2013, 08:11  [ТС] 8
Mikl___, спасибо, забыл чистить edx.)
0
16.09.2013, 08:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 08:11
Помогаю со студенческими работами здесь

Не работает цикл
Почему не работает цикл do while? Например при x_nach=-0.5, x_konech=0.5, eps+0.1, delta_x=0.1 цикл...

Не работает цикл.
var myStr =&quot;&quot;; var winCount = 0; function initWindow(){ myStr += &quot;&lt;div...

Не работает цикл for
использую обычную конструкцию // так не работает for(var i=1; i&gt;5; i++){ test(i); } //...

Не работает цикл for
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int x; for(x=0;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru