Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Цикл


Автор: Hidalgo 29.12.2010, 23:42
Вот такой маленький вопрос хотел бы уточнить:
"Надо переписать цикл я языка паскаль, на язык Ассемблер"  - посмотрите правильно ли будет, и не будет ли зацикливания?

for  v1 := v2 downto v3 do
    v4 := v4 + 10

Код

   mov cx, [v2]
   sub  cx, [v3]
   inc   cx
@cycle:
   add [v4], 10
   loop @cycle



Автор: JAPH 30.12.2010, 00:12
Идейно верно, но не ловится ситуация, когда v2 < v3, плюс не учтено изменение значения v1.

Автор: Hidalgo 30.12.2010, 00:17
Цитата

Идейно верно, но не ловится ситуация, когда v2 < v3, плюс не учтено изменение значения v1.


а как это предусмотреть?

Автор: JAPH 30.12.2010, 00:24
Точно не уверен, но вроде бы:
- если v2 < v3, то цикл не выполняется, v1 не изменяется;
- иначе v1 после цикла оказывается равной v3.

В зависимости от типа переменных надо использовать знаковое или беззнаковое сравнение для выяснения, нужно ли выполнять цикл.

Автор: Hidalgo 30.12.2010, 00:28
Цитата

Точно не уверен...
 

а не количество шагов цикла: cx = v2-v3+1 

Автор: iff 30.12.2010, 17:22
И ещё, если CX будет равен 0 (т.е. v2 = v3), то козалось бы цикл должен выполняться 0 раз, иначе говоря не выполняться, но команда loop при нулевом значении CX всеравно БУДЕТ выполняться. А всё почему - потому что loop работает так: уменьшает CX на 1, а затем сравнивает CX с нулём, и если CX=0, то выполнение цикла прекращается. Когда же CX=0, то  всё происходит так: инструкция loop уменьшает его на 1, т.е. CX становится равным 0FFFFH, затем сравнивает CX (в данном случае 0FFFFH) с нулём, и т.к. 0FFFFH не равен 0, то выполнение цикла продолжается ещё 65535 раз.

Автор: JAPH 30.12.2010, 18:08
iff, inc cx там стоит - все нормально. cx = v3 - v2 + 1 = 1 при v2 = v3.


Код

v2 := 5;
v3 := 6;
for v1 := v3 downto v2 do v4 := v4 + 10;
writeln(v1);

выводит 5.

cx-то пусть себе будет количеством шагов цикла, а вот [v1] := [v2] в случае v2 <= v3.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)