Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
1
C/C++

Зависает программа при вызове printf в цикле

24.02.2014, 06:51. Показов 1070. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. При написании программы, которая должна выводить целые числа в интервале от 1 до n, у меня получилось что-то странное:
вот такая программа не работает - при n>0 начинает перечислять числа до бесконечности
Кликните здесь для просмотра всего текста
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
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
#include <conio.h>
#include <stdio.h>
int main()
{
    int n = 0;
    char* fmt = "%d";
    char* fmt1 = "\n%d";
    char* str = "Oshibka. Otritsatelnoe chislo";
    __asm
        {
            
 
            lea eax, n;
            push eax;
            push fmt;
            call scanf;
            add esp,8;
 
            cmp n, 0;
            jle l2;
 
            mov ebx,1;
            mov ecx,n;
            dec ecx;
            dec ecx;
l1:
            inc ebx;
 
 
 
 
            push ebx;
            push fmt1;
            call printf;
            add esp,8;
 
 
 
 
            loop l1;
            jmp l3;
 
l2:         mov ecx, -1;
            mov ebx, n;
l4:         add ebx, 1;
 
            cmp ebx, 0;
            je l3;
 
            push ebx;
            push fmt1;
            call printf;
            add esp,8;
 
            loop l4;
 
        l3:}
    getch();
    return 0;
}


А вот такая - работает:
Кликните здесь для просмотра всего текста
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
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
#include <conio.h>
#include <stdio.h>
int main()
{
    int n = 0;
    char* fmt = "%d";
    char* fmt1 = "\n%d";
    char* str = "Oshibka. Otritsatelnoe chislo";
    __asm
        {
            
 
            lea eax, n;
            push eax;
            push fmt;
            call scanf;
            add esp,8;
 
            cmp n, 0;
            jle l2;
 
            mov ebx,1;
            mov ecx,n;
            dec ecx;
            dec ecx;
l1:
            inc ebx;
 
 
            push ecx;
 
 
            push ebx;
            push fmt1;
            call printf;
            add esp,8;
 
 
            pop ecx;
 
 
            loop l1;
            jmp l3;
 
l2:         
            mov ecx, -1;
            mov ebx, n;
l4:         add ebx, 1;
 
            cmp ebx, 0;
            je l3;
 
            push ebx;
            push fmt1;
            call printf;
            add esp,8;
 
            loop l4;
 
        l3:}
    getch();
    return 0;
}


Решение, позволяющее наладить работу, было скопированно с похожей задачи в интернете, но не до конца понято. Отличие всего в 2 строчки, которые, при этом, не должны менять никаких значений в регистрах. По идее, цикл должен уменьшать ecx каждый шаг, пока он не станет равен 0. Почему тогда некорректен 1 случай? Опять-таки, по идее push должен помещать значение в стек, pop - извлекать. Сам ecx от помещения/извлечения меняться не должен. Однако...
Как же всё-таки оно работает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2014, 06:51
Ответы с готовыми решениями:

При вызове второго раза функции, зависает программа
Программа сначала с помощью клавиатуры выбирает куда мы будем записывать данные. При первом вызове...

Почему зависает программа при бесконечном цикле Do - Loop
Вот собственно программа которую я делал. Но почему-то зависает при старте действий. Public Class...

VCL Forms Application, программа зависает при вечном цикле
Здравствуйте, мне надо в программе выполнять функции пока она работает, в консольной программе я...

В цикле while программа зависает
Начал писать код.Ввел формулу,сумму которой мне нужно считать,но тут появляется &quot;Выражение перед...

Почему зависает форма при вызове метода?
Здравствуйте. При вызове нижеприведённого метода зависает форма. Подскажите, пожалуйста, в чём...

2
Ушел с форума
Автор FAQ
16339 / 7659 / 1076
Регистрация: 11.11.2010
Сообщений: 13,702
24.02.2014, 06:58 2
Novilit-v,
тут две причины:
  1. printf изменяет значение ecx поэтому для правильной работы программы обрамляй эту функцию командами push ecx и pop ecx
  2. windows наверняка не нравится цикл, который будет выполняться -1=FFFFFFFF=4294967295 раз - возьми число поменьше
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
24.02.2014, 07:09  [ТС] 3
Что-то такое на счёт printf подозревал.
Бесконечный цикл могу убрать, но в данном примере он роли не играет.
Спасибо за исчерпывающий ответ.
0
24.02.2014, 07:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2014, 07:09
Помогаю со студенческими работами здесь

При вызове контекстного меню ворд зависает
Когда выделяю в ворде 2007 (windows 7) текст потом нажимаю на правую кнопку мыши, появляются...

Зависает билдер при вызове всплывающей подсказки
Не давно столкнулся с такой проблемой: Переустановил винду скопировал все свои старые проекты...

Приложение зависает при вызове команды протокола SSH
Всем здравствуйте! Срочно нужно решить проблему: Пытаюсь наладить ssh подключение к удалённому...

Каждый раз при вызове метода в цикле все, что было в ptr затирается
имеется такой метод public void SetBit() { int b = new int; ...

Ошибка компиляции на вызове printf
Прошу не судить строго, новичок в программировании, при старте выдаёт ошибку на printf format PE...

Если запускать метод Method1 из нового потока, то при первом вызове MoveTheShell (в цикле) не меняется значение Shell.Y
В общем: В методе Method1 есть цикл while (Possible) { ...


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

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