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

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

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

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

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

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

Доброе утро. Я в assembler'е новичок, поэтому хочется знать все тонкости программирования на этом языке. Честно скажу, что он мне очень нравится хочу изучить его как можно подробно. Мне в голову взбрела идея хранить счетчик цикла в переменной, причем разных размеров BYTE, WORD, DWORD и т.д. Написал код с вложенным циклом. Основной цикл получается бесконечным, а второй, т.к. используется стек - нет. В чем ошибка я даже представить не могу. Не буду затягивать, вот код:
Код:
include '%fasminc%\Win32ax.inc'
.data
i dw ?
j dw ?
.code
start:
mov ecx,0
push 2
pop [j]
push 2
pop [i]

chikl1:
invoke MessageBox, 0,'Это цикл номер 1' 1','Внимание',MB_OK
mov ecx,0
mov ecx,DWORD[j]

  chikl2:
  push ecx
  invoke MessageBox, 0,'Это цикл номер 1','Внимание',MB_OK
  pop ecx
  loop chikl2

mov ecx,0
mov eax,DWORD[i]
dec eax
mov ecx, eax
loop chikl1

invoke ExitProcess,0
.end start
Мне чувствуется, что после этого поста я узнаю все о себе
Заранее благодарю.

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

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 28.12.2011, 10:46   #2
Fedor666
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 71
Радость

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
push 2
pop [j]
Зачем такие сложности?
Код:
mov j,2
Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
invoke MessageBox, 0,'Это цикл номер 1' 1','Внимание',MB_OK
На мой взгляд слишком много кавычек.
Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
mov ecx,0
mov ecx,DWORD[j]
Вторая инструкция затирает результат первой.
И вообще ничего не понятно

Код:
	.586
	.model	flat,stdcall
	option	casemap:none
	include	\masm32\include\kernel32.inc
	include	\masm32\include\windows.inc
	include	\masm32\include\user32.inc
	includelib \masm32\lib\kernel32.lib
	includelib \masm32\lib\user32.lib
	.data?
j	dd	?
	.data
i	dd	2
Tit	db	'Внимание',0
Mes1	db	'Это цикл номер 1',0
Mes2	db	'Это цикл номер 2',0
	.code
chikl1:	invoke	MessageBox,0,offset Mes1,offset Tit,MB_OK
	mov	j,2
chikl2:	invoke	MessageBox,0,offset Mes2,offset Tit,MB_OK
	dec	j
	jnz	chikl2
	dec	i
	jnz	chikl1
	invoke	ExitProcess,0
	end	chikl1
Ну, с поправкой на фасм, конечно...
Fedor666 вне форума Ответить с цитированием
Старый 28.12.2011, 12:50   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Зачем такие сложности?
Да это я зачитался. Согласен с вами.
Цитата:
На мой взгляд слишком много кавычек.
Я просто копировал код из фасма, а кириллица не так отобразилась, и я второпях пере наставил кавычек.
Цитата:
Вторая инструкция затирает результат первой.
И вообще ничего не понятно
Когда Крупника читал, он говорил, что регистр не всегда пустой вот и поставил ноль. Убрать забыл.
Спасибо за код. Вопросы потом, думаю, появятся.

--
Вот и появился вопрос. jnz - это инструкция перехода. Она перестает выполнятся, когда флаг Z опущен. Как можно сделать аналогичное, с инструкцией loop.

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

Блог

Последний раз редактировалось _PROGRAMM_; 28.12.2011 в 13:16.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 28.12.2011, 13:30   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

_PROGRAMM_
Код:
   mov cx,N
a1: . . .
     dec cx
     jnz a1
аналог
Код:
   mov cx,N
a1: . . .
    loop a1
Mikl___ вне форума Ответить с цитированием
Старый 28.12.2011, 13:44   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
_PROGRAMM_
Код:
   mov cx,N
a1: . . .
     dec cx
     jnz a1
аналог
Код:
   mov cx,N
a1: . . .
    loop a1
Согласен, но есть MessageBox, который меняет регистр ecx. И плюс ко всему циклы должны быть вложеными.

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

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

_PROGRAMM_
И в чем проблемы? Сохраняй СХ в стеке или переменной, делай луп вложенным сколько душе угодно, вопрос-то был
Цитата:
Как можно сделать аналогичное, с инструкцией loop.
и я на него ответил
Mikl___ вне форума Ответить с цитированием
Старый 29.12.2011, 10:20   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо. Но все же. Тема называется "Циклы и переменные.". Как это организовать с переменными? Моя наработка в первом посте. Я думаю, получив ответ, отвечу на многие свои вопросы.
Цитата:
Сохраняй СХ в стеке или переменной,
Так вот в этом вся проблема. Посмотрите на мой первый пост. Там я пытаюсь это делать. но получается бесконечный цикл.
P.S. Мне jnz понравился.

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

Блог

Последний раз редактировалось _PROGRAMM_; 29.12.2011 в 10:23.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.12.2011, 10:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как это организовать с переменными?
да Хосподи то...

Код:
.data
  sch1    db      0
  sch2    db      0
.code
main    proc           
.....
        mov sch1,9   ; иницилизировали счётчик цикла внешнего (первого) цикла
M1:
        mov sch2, 9  ; иницилизировали счётчик цикла внутреннего (второго) цикла
M2:
       ... какие-то осмыслененные действия - тело цикла
 
        dec sch2
        cmp sch2,0
        jne M2

        ; ... действия, которые выполняются в первом цикле но не входят в тело второго цикла. ну, например, перевод строки, если выводим массив и т.д.

        dec sch1
        cmp sch1,0
        jne M1

        ; всё - конец!

Exit:
        mov ax,4c00h
        int 21h
просто цикл с регистром CX/EXC (как и любая работа с регистрами) выполняется намного быстрее, во-вторых, loop банально проще и короче, чем изменение ячейки памяти, сравнение её с константой и после уже переход. loop, грубо говоря, заложен в архитектуру самого процессора. Поэтому выполняется ОЧЕНЬ быстро..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.12.2011, 11:41   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
просто цикл с регистром CX/EXC (как и любая работа с регистрами) выполняется намного быстрее, во-вторых, loop банально проще и короче, чем изменение ячейки памяти, сравнение её с константой и после уже переход. loop, грубо говоря, заложен в архитектуру самого процессора. Поэтому выполняется ОЧЕНЬ быстро..
Эх. Это так новый год сказывается. Еще разок. Мне нужно сделать, пусть уже и не вложенный, цикл loop который управляется переменной. Т.е. Значение ECX в ней хранится, а в конце, перед командой loop, сохраняется обратно в ecx. Loop ее уменьшает и т.д. пока не дойдет до нуля. Как-то так. Код в первом посте есть, его только поправить. Скорее всего ошибки у меня в преобразовании типов. Главное. Ecx, внутри цикла, меняется командой messageBox. Не хочется использовать другие регистры для хранения ecx/cx(для тренировки). Вот как-то так. У меня появились некоторые решения, сейчас попробую их в жизнь внедрить.
Зачем мне все это? Для того, чтобы я уяснил некоторые нюансы и более углубленно понял язык..

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

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 30.12.2011, 21:46   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Вот! Я наконец додумался до решения своей проблемы. Правда немного не так получилось, но ведь получилось же.
Код:
include '%fasminc%\Win32ax.inc'
.data
  i dw ?
  j dw ?
  Caption db 'Внимание',0
  Text1   db 'Это цикл 1',0
  Text2   db 'Это цикл 2',0
.code
start:
      mov [i],2
      mov [j],2

      mov ecx,0
      mov cx,[i]

one:  mov [i],cx
      invoke MessageBox,0,Text1,Caption,MB_OK
      mov ecx,0
      mov cx,[j]

two:  mov [j],cx
      invoke MessageBox,0,Text2,Caption,MB_OK
      mov ecx,0
      mov cx,[j]
      loop two

      mov ecx,0
      mov cx,[i]
      loop one



invoke ExitProcess,0
.end start
Я думаю, что не разумно будет создавать новую тему. Я весь день ищу и никак не найду аналог инструкции movxz, чтобы заменить две эти строчики
Код:
      mov ecx,0
      mov cx,[i]
Есть ли такая вообще?

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

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменные Карен Помощь студентам 1 01.06.2011 17:16
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Переменные экземпляра,класса, константы и переменные cop08 Общие вопросы .NET 3 20.12.2010 21:56
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36