Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Novilit-v
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
1

Объясните принцип работы

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

Здравствуйте. При написании программы, которая должна выводить целые числа в интервале от 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2014, 06:51
Ответы с готовыми решениями:

Принцип работы EPI/IP
Добрый вечер! Вы бы не могли мне объяснить , принцип работы IP , я знаю как бы , но еще бы раз мне...

Пояснить принцип работы готовой программы
Ребята, добрый день. Есть программка по удалению пробелов из строки. Не могли бы вы...

Описать принцип работы
Здравствуйте. Есть программа на FASM'е, которая выводит частоту процессора. Может ли кто-нибудь,...

принцип работы команды Add Ax, pole.
Готовлюсь к экзаменам по информатике. Все вопросы проработал, а этот не получается. Пожалуйста,...

Комментарии к коду или общий принцип программы
Привет ребята! Не могу разобраться с кодом. Мог бы кто не будь прокомментировать его?...

2
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
24.02.2014, 06:58 2
Novilit-v,
тут две причины:
  1. printf изменяет значение ecx поэтому для правильной работы программы обрамляй эту функцию командами push ecx и pop ecx
  2. windows наверняка не нравится цикл, который будет выполняться -1=FFFFFFFF=4294967295 раз - возьми число поменьше
1
Novilit-v
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
24.02.2014, 07:09  [ТС] 3
Что-то такое на счёт printf подозревал.
Бесконечный цикл могу убрать, но в данном примере он роли не играет.
Спасибо за исчерпывающий ответ.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 07:09

Объясните принцип работы
Добрый день. Возник ряд вопросов: не могу понять, каким образом реализован на уровне BIOS механизм...

Объясните принцип работы if, else, for, while, repeat, until
Здравствуйте, объясните пожалуйста принцип работы if, else, for, while, repeat, until в Pascal...

Объясните принцип работы нейросетей
я понял, что в нейроне есть активационная функция и веса синапсов. Вопрос тольео в том, как...


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

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

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