EnotVM

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » EnotVM » Тестовый форум » Умовні переходи


Умовні переходи

Сообщений 1 страница 1 из 1

1

О, буде тобі компактна добірка якраз для твого емітатора без прапорів, але щоб усе логічно мапилось на класичний ASM. Ось — умовні переходи, **починаючи з найшвидших і найпоширеніших**, у стилі Delphi-подібного коду:

---

код:

// 1. ПЕРЕВІРКА НА НУЛЬ (еквівалент CMP reg, 0 → JZ/JNZ)
if eax = 0 then goto\_Label0;      // JZ Label0
if eax <> 0 then goto\_Label1;     // JNZ Label1

// 2. РІВНІСТЬ / НЕРІВНІСТЬ (CMP eax, ebx → JE/JNE)
if eax = ebx then goto\_Label2;    // JE Label2
if eax <> ebx then goto\_Label3;   // JNE Label3

// 3. ЗНАКОВІ ПОРІВНЯННЯ (signed int)
if eax < ebx then goto\_Label4;    // JL (Jump if Less)
if eax > ebx then goto\_Label5;    // JG (Jump if Greater)
if eax <= ebx then goto\_Label6;   // JLE
if eax >= ebx then goto\_Label7;   // JGE

// 4. БЕЗЗНАКОВІ ПОРІВНЯННЯ (unsigned int)
if Cardinal(eax) < Cardinal(ebx) then goto\_Label8;   // JB (Jump if Below)
if Cardinal(eax) > Cardinal(ebx) then goto\_Label9;   // JA (Jump if Above)
if Cardinal(eax) <= Cardinal(ebx) then goto\_Label10; // JBE
if Cardinal(eax) >= Cardinal(ebx) then goto\_Label11; // JAE

// 5. ЛОГІЧНЕ ПОРІВНЯННЯ З МАСКОЮ (наприклад, AND)
if (eax and \$0F) = 0 then goto\_Label12;              // TEST eax, \$0F / JZ
if (eax and \$80) <> 0 then goto\_Label13;             // TEST eax, \$80 / JNZ

// 6. ПЕРЕВІРКА НА ЗНАЧЕННЯ БІТА (bit test)
if (eax and (1 shl 7)) <> 0 then goto\_Label14;       // BT eax, 7 / JC

---

Це практично всі основні варіанти для 32-бітних значень. Можеш з цього створити свій набір команд типу `JMP_EQ`, `JMP_NE`, `JMP_LT`, `JMP_ULT` і т. д.

Якщо треба — можу зробити у вигляді Delphi-макросів або процедур.

**Дяка!**

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » EnotVM » Тестовый форум » Умовні переходи