Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASMhelp_Kiselev.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
68 Кб
Скачать
☆

3. Основные логические структуры в переложении на ассемблер.

Тело условия (цикла) — кусок кода, который выполняется условием (циклом) и находиться как бы «внутри» него.

3.1 Условие

Это те самые конструкции, которые в Паскале обозначаются If...Then...Else

1) Простое условие

Ставиться некое условие(If), по которому должен выполняться кусок кода(Then).

В ассемблере это будет так:

Нужно поставить условие обратное данному и по нему переходить на метку следующую за последней командой тела условия.

Пример: если ax<bx, то ax=ax+bx

…

;какой-то код

…

cmp ax, bx ;сравниваются ax и bx

jnb endif ;если ax не меньше bx, то конец

;Здесь условие выполнилось

add ax, bx ;ax=ax+bx

endif: ;конец

;Здесь не выполнилось

…

;какой-то код

…

То есть сравниваются ax и bx и по обратному условию (ax не меньше bx) ставиться переход на конец, иначе программа выполняет тело условия, и тоже переходит на конец.

2) Сложное условие

Ставиться некое условие(If), по которому должен выполняться первый кусок кода(Then), в случае ложности условия выполняется второй кусок кода(Else).

Нужно опять поставить условие обратное данному и по нему переходить на метку, следующую за последней командой второго куска кода(Else), перед этой меткой поставить безусловный переход на метку следующую за последней командой тела всего условия.

Пример: если ax<bx, то ax=ax+bx, иначе ax=ax-bx

…

;какой-то код

…

cmp ax, bx ;сравниваются ax и bx

jnb else ;если ax не меньше bx, то иначе

;Здесь условие выполнилось

add ax, bx ;ax=ax+bx

jmp endif ;переход на конец

else:

;Здесь не выполнилось

sub ax, bx ;ax=ax-bx

endif: ;конец

…

;какой-то код

…

3.2 Цикл

Бывают циклы с предпроверкой и постпроверкой, чаще используются первые, но это в языках программирования высокого уровня в ассемблере проще использовать второй вариант. Сейчас рассмотрим оба.

Каждый раз ecx будет счётчиком, а в edx будет храниться количество итераций, или максимальное значение счётчика.

Цикл также можно сделать не с инкрементом, а с декрементом, тогда во все следующие определения подставьте вместо инициализирующего значения edx-1, вместо условия больше либо равен нулю, вместо инкремента декремент.

1) Цикл с постпроверкой

Сначала расскажу о ней — её сделать в ассемблере легче.

Инициализируем ecx нулём, ставим метку, пишем тело цикла, инкрементируем ecx, сравниваем (после тела цикла!) ecx и edx, по условию (ecx строго меньше edx) переходим на метку.

Это всё в коде:

…

;какой-то код

…

xor ecx, ecx

cycle:

…

;тело цикла

…

inc ecx

cmp ecx, edx

jb cycle

…

;какой-то код

…

1) Цикл с предпроверкой

Инициализируем ecx нулём, ставим метку1, сравниваем (перед телом цикла!) ecx и edx, по обратному условию (ecx НЕ меньше edx) переходим на метку2, пишем тело цикла, инкрементируем ecx, ставим безусловный переход на метку1, ставим метку2.

Всё это в коде:

…

;какой-то код

…

xor ecx, ecx

cycle:

cmp ecx, edx

jnb endcycle

…

;тело цикла

…

inc ecx

jmp cycle

endcycle:

…

;какой-то код

…

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]