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

64 Реализация if-then-else

Конструкция IF-THEN-ELSE в ассемблере реализуется c помощью условных переходов

Код команды

Реальное условие

Условие для CMP

Код команды

Реальное условие

Условие для CMP

JA

CF=0 и ZF=0

если выше

JG

ZF=0 и SF=OF

если больше

JAE JNC

CF=0

если выше или равно если нет переноса

JGE

SF=OF

если больше или равно

JB JC

CF=1

если ниже если перенос

JL

SF<>OF

если меньше

JBE

CF=1 | ZF=1

если ниже или равно

JLE

ZF=1 | SF<>OF

если меньше или равно

JE JZ

ZF=1

если равно если ноль

JNE JNZ

ZF=0

если не равно если не ноль

JO

OF=1

если есть переполнение

JNO

OF=0

если нет переполнения

JS

SF=1

если есть знак

JNS

SF=0

если нет знака

JP

PF=1

если есть четность

JNP

PF=0

если нет четности

К примеру мы должны сравнить ах и bx

Конструкция в ПАСКАЛЕ

If(условие1)then Какие то действия 1

goto Какие то действия 2

Соответствие в Ассемблере

cmp ax,bх;

jz/js/jo/… @label1; – не условие1 (потому что по условию один мы перейдем, а нам это не нужно)

;Какие то действия 1

@label1

;Какие то действия 2

Если мы хотим реализовать классическую IF-THEN-ELSE типа

If(условие)then begin Какие то действия 1

end else begin Какие то действия 2

end

Вот лично мое решение

…

Jnz @if ; безусловный переход – как к примеру goto в Паскале

@then

;Какие то действия1

Jnz @ifend; безусловный переход – как к примеру goto в Паскале

@if

Cmp ax,bx

Jz/jo/… @then; - условие (то же что и в примере на паскале)

;Какие то действия 2

@ifend

…

65, 66 Програмування циклів на асемблері?

Нехай потрібно щось виконати 10 разів. Це "щось" будемо називати "тілом циклу". Тіло циклу може містити деяку множину рядків програмного коду на асемблері. Розглянемо варіант алгоритму циклу з постумовою (рис. 2)

На асемблері такий цикл можна запрограмувати наступним чином:

mov ecx, 0 ; обнулюємо лічильник – регістр ECX

cycle:

. . . ; тіло циклу

inc ecx ; збільшуємо лічильник на 1

cmp ecx, 10 ; порівнюємо лічильник з 10

jl cycle ; якщо лічильник менше – перехід на мітку cycle

Необхідно відзначити, що такий варіант організації циклу є неприйнятний для послідовної обробки груп бітів з розповсюдженням переносу, оскільки команда CMP сама записує біт CF.

Інший варіант циклу – у лічильник спочатку записується потрібна кількість повторень, а на кожній ітерації значення лічильника зменшується на одиницю:

mov ecx, 10 ; у регістр ECX записуємо кількість повторень

cycle:

. . . ; тіло циклу

dec ecx ; зменшуємо лічильник на 1

jnz cycle ; якщо лічильник не 0, то перехід на мітку cycle

Джерело: лекції Порєва

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