Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 15:58   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Простейший цикл

Моя тема немного отличается от соседней. Я где-то допустил ошибку в простейшем цикле. Не могу ее найти и все! Ошибка вот в чем. Цикл бесконечный, хотя я установил регистр ecx в 3.
Код:
include '%fasminc%/win32ax.inc'

.data
Caption db 'Цикл'
Text db 'Пусто'

.code
start:

mov ecx, 3
metka: invoke MessageBox,0,Caption,Text,MB_OK
loop metka
invoke ExitProcess,0
.end start
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.12.2011, 16:26   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Я подозреваю, что Вы где-нибудь прочитали фразу "регистр ecx как используется для счетчика цикла", но вряд ли команда loop сама вычитает из него единицу)
Поставьте перед loop уменьшение ecx на 1
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 24.12.2011, 16:31   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Ничего не происходит. Все равно так же - бесконечный цикл. Даже mov ecx, 0 делал.
Код:
include '%fasminc%/win32ax.inc'

.data
Caption db 'Öèêë'
Text db 'Ïóñòî'

.code
start:

mov ecx, 0
metka:
invoke MessageBox,0,Caption,Text,MB_OK
dec ecx
loop metka
invoke ExitProcess,0
.end start

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.12.2011, 16:33   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну естественно нужно еще поставить условие, loop должен выполняться только если ecx больше нуля
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 24.12.2011, 16:37   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитирую статью
Цитата:
Для организации цикла предназначена команда LOOP. У этой команды один операнд – имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде
Код:
use16                 ;Генерировать 16-битный код
org 100h              ;Программа начинается с адреса 100h
 
    mov ah,02h        ;Для вызова функции DOS 02h - вывод символа
    mov dl,'A'        ;Первый выводимый символ
    mov cx,26         ;Счётчик повторений цикла
metka:
    int 21h           ;Обращение к функции DOS
    inc dl            ;Следующий символ
    loop metka        ;Команда цикла
 
    mov ah,09h        ;Функция DOS 09h - вывод строки
    mov dx,press      ;В DX адрес строки
    int 21h           ;Обращение к функции DOS
 
    mov ah,08h        ;Функция DOS 08h - ввод символа без эха
    int 21h           ;Обращение к функции DOS
 
    mov ax,4C00h      ;\
    int 21h           ;/ Завершение программы
;-------------------------------------------------------
press:
    db 13,10,'Press any key...$'

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.12.2011, 16:41   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

_PROGRAMM_, Перед вызовом MessageBox сохраняй ecx в стеке, после того, как функция отработает, извлекай.
vadimych вне форума Ответить с цитированием
Старый 24.12.2011, 16:47   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо большое. Я догадывался, но не верил сам себе. Думал: "На что MessageBox ecx?"
Может кому понадобится
Код:
include '%fasminc%/win32ax.inc'

.data
Caption db 'Öèêë'
Text db 'Ïóñòî'

.code
start:

mov ecx, 10
metka:
push ecx
invoke MessageBox,0,Caption,Text,MB_OK
pop ecx
loop metka
invoke ExitProcess,0
.end start

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.12.2011, 11:52   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от _PROGRAMM_
Спасибо большое. Я догадывался, но не верил сам себе.
А стоило посмотреть в учебники по программированию в Виндовз,
Цитата:
АРI-функции не изменяют значения в регистрах EDI, EBP, ESP, ESI, EBX
как видим, регистры EAX, ECX, EDX к этим регистрам не относятся
Mikl___ вне форума Ответить с цитированием
Старый 28.12.2011, 07:02   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
А стоило посмотреть в учебники по программированию в Виндовз,
Спасибо. А вы в каком это учебнике отыскали?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 28.12.2011, 10:58   #10
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

_PROGRAMM_
Об этом есть в любом учебнике, в котором затрагиваются вопросы программирования в Виндовз на ассемблере, Зубков, Пирогов, Юров, Ирвинг, первый урок Iczelion'a и т.п.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простейший фильтр. KrPr БД в Delphi 3 31.08.2010 09:47
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34