| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Цикл |
| Автор: Hidalgo 29.12.2010, 23:42 | ||
| Вот такой маленький вопрос хотел бы уточнить: "Надо переписать цикл я языка паскаль, на язык Ассемблер" - посмотрите правильно ли будет, и не будет ли зацикливания? for v1 := v2 downto v3 do v4 := v4 + 10
|
| Автор: JAPH 30.12.2010, 00:12 |
| Идейно верно, но не ловится ситуация, когда v2 < v3, плюс не учтено изменение значения v1. |
| Автор: Hidalgo 30.12.2010, 00:17 | ||
а как это предусмотреть? |
| Автор: 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.
выводит 5. cx-то пусть себе будет количеством шагов цикла, а вот [v1] := [v2] в случае v2 <= v3. |