щоб команда маніпулювала послідовністю таких елементів, використовуються команди-префікси: повторювати, поки вміст ECX не вернувся в 0/REPZ-повторювати поки одно/нуль. Даний префікс змушує виконувати строковую команду доти, поки вміст ECX не вернувся в 0/REPZ-повторювати поки не одно/Не нуль. Даний префікс змушує виконувати строковую команду доти, поки вміст ECX не вернувся в 0
Строкові команди вважають, що рядок -источник знаходиться за адресою DS: ESI (для нас це просто ESI), а рядок-пріемнікпо адреси ES: EDI (для нас просто EDI). Всі строкові команди можна розділити на шість груп:
. Команди пересилкі- копіювання рядка байтов.- копіювання рядка слов.- копіювання рядка подвійних слів
Можливий також формат MOVS приймач, джерело-в цьому випадку
асемблер за типом операндів сам визначає, яку з трьох форм команд слід вибрати. Команда копіює елемент рядки з адреси, що визначається ESI, в адресу, яка визначається EDI. Після виконання такої команди вміст ESI і EDI збільшується (прапор DF=0) або зменшується (прапор DF=1) на розмірах елемента рядка
. Команди порівняння- порівняння рядків байтов.- порівняння рядків слов.- порівняння рядків подвійних слів
. Команди пошуку (сканування) - сканування рядки байтов.- сканування рядки слів- сканування рядки подвійних слів
. Команди читання з строкі- читання байта з строкі.- читання слова з строкі.- читання подвійного слова з рядка.
Можливий також формат LODS джерело-в цьому випадку асемблер за типом операндів сам визначає, яку з трьох форм команд слід вибрати. Команда здійснює копіювання з пам'яті, яка адресується ESI, елемента в AL, AX або EAX. Після виконання такої команди вміст EDI збільшується на розмір елемента рядка
. Команда записи в строку- запис байта в рядок.
Можливий також формат STOS приймач, джерело-в цьому випадку асемблер за типом операндів сам визначає, яку з трьох форм команд слід вибрати. Команда здійснює копіювання в пам'ять, дооторая адресується EDI, елементу з AL, AX або EAX. Після виконання такої команди вміст EDI збільшується на розмір елемента рядка.
Предикати порівняння являють собою функції, які порівнюють дві величини і повертають однобітовий результат, рівний 1, якщо проверяемое ставлення істинно, і 0, якщо помилково. У цьому розділі наводиться кілька методів обчислення результату порівняння з розміщенням його в бите знака (ці методи не використовують команд розгалуження). Щоб отримати значення 1 або 0, що використовується в деяких мовах (наприклад, в C), після обчислення слід використовувати команду зсуву вправо на 31 біт. Для отримання результату - 1/0, використовуваного в деяких інших мовах (наприклад, Basic), виконується команда знакового зсуву вправо на 31 біт.
На таких машинах, як MIPS, Compaq Alpha, і нашої моделі RISC є команди порівняння, які безпосередньо обчислюють більшість відносин і поміщають однобітовий результат 0/1 в регістр загального призначення.
3. ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ MASM
Компілятори мови Assembler дещо відрізняються один від одного т.к не існує єдиного стандарту. Зазвичай для Intel сумісних процесорів використовується синтаксис команд, зазначений у документації від Intel і AMD (званий Intel), самі ж команди та їх використання описані в документації з офіційних сайтів виробників процессоров.Но, крім команд, у вихідному коді програми також зустрічаються спеціальні символи і директиви, що вказують компілятору як потрібно компілювати програму. Зазвичай, саме ці елементи програми відрізняються для різних компіляторів. Сегментні регістри використовувалися для зберігання адреси початку сегменту коду (CS - code segment), сегмента даних (DS - data segment) і сегмента стека (SS - stack segment). Регістри ES, FS і GS були додані пізніше. Існувало кілька моделей пам'яті, кожна з яких мала на увазі виділення програмі одного або декількох сегментів коду і одного або декількох сегментів даних: tiny, small, medium, compact, large і huge. Для команд мови асемблера існували певні угоди: адреси переходу сегментувати по регістру CS, звернення до даних сегментувати по регістру DS, а звернення до стека - по регістру SS. Якщо програмою виділялося кілька сегментів для коду або даних, то доводилося міняти значення в регістрах CS і DS для звернення до іншого сегменту. Існували так звані «ближні» і «далекі» переходи. Якщо команда, на яку треба здійснити перехід, знаходилася в тому ж сегменті, то для переходу достатньо було змінити тільки значення регістра IP.
Такий перехід називався ближнім. Якщо ж команда, на яку треба здійснити перехід, знаходилася в іншому сегменті, то для переходу необхідно було змінити як значення...