Как работает макрос .FOR? FOR parameter[:REQ|:=default], <argument [,argument]...> statements ENDM Как с помощью него создать цикл: for (int i = 0; i < a; i++)?
.FOR - разве есть такой? Есть FOR - но он выполняется на стадии компиляции. Если хочется высокоуровневости, то есть .while и .repeat.
Цикл получается вроде такого ........ mov ebx, a ; В ebx помещаем значение a xor eax, eax ; Это, типа, i=0 loop: inc eax ; i++ cmp eax,ebx ; Сравниваем i с a или можно так: cmp eax, a jne loop ; Если не равно, то прыгаем на метку loop .......... При таком написании переменная i в любом случае один раз инкриментируется. Если этого быть не должно, то можно чуть по другому написать, добавив еще один условный переход.
asmic для asm стараются заменить for (int i = 0; i < a; i++) на for (int i = a; i > 0; i--) и тогда если нужна компактность Код (Text): mov ecx,a a1: ........ loop a1 а если хочется скорости Код (Text): mov ebx,a ; содержимое ebx,edi,esi,ebp функции WinAPI не изменяют a1: ........ dec ebx jnz a1
Вообще-то если совсем корректно, то Код (Text): mov eax, a or eax, eax jmp z1_c z1: ... sub eax, 1 z1_c: jnz z1
Ustus В #9 были показаны два варианта: компактный и скорострельный, jecxz к компактному or reg,reg (варианты and reg,reg /test reg,reg) и jnz ко второму варианту
Mikl__ Я имел ввиду, что в #9 не учитывается случай a = 0. А если в #12 разбить сложные инструкции на простые, то получится #11 с точностью до одного перехода Это уже вопрос контекстной оптимизации, что выбрать, в зависимости от наиболее вероятного значения a и вложенности цикла более эффективным может получится тот или другой вариант... ИМХО... вот если бы пришел leo, он бы это уже разобрал по косточкам но, к сожалению, его не привлекают темы, в названии которых нет слова "оптимизация"