- •Nasm help v0.2
- •1. Основы
- •1.1 Секции
- •1.3 _Start
- •1.4 Регистры
- •1.5 Разыменование
- •2. Синтаксис nasm
- •2.1 Базовые команды
- •2.3 Организация подпрограмм
- •2.4 Метки в подпрограммах
- •2.5 Сохранение регистров
- •2.6 Передача аргументов подпрограмме
- •2.2 Вызовы ядра
- •3. Основные логические структуры в переложении на ассемблер.
- •3.1 Условие
- •3.2 Цикл
- •4. Заключение
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:
…
;какой-то код
…
