Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Команды условного перехода
Все команды условного перехода выполняются по схеме if < условие перехода> then goto L и производят близкий короткий относительный переход, если выполнено некоторое условие перехода, в противном случае продолжается последовательное выполнение команд программы. На Паскале условие перехода чаще всего задают в виде условного оператора if op1 < отношение> op2 then goto L где отношение – один из знаков операции отношения = (равно), < > (не равно), > (больше), < (меньше), < = (меньше или равно), > = (больше или равно). Если обозначить rez=op1–op2, то оператор условного перехода можно записать в эквивалентном виде сравнения с нулём if rez < отношение> 0 then goto L Все машинные команды условного перехода, кроме одной, вычисляют условие перехода, анализируя один, два или три флага из регистра флагов, и лишь одна команда условного перехода вычисляет условие перехода, анализируя значение регистра CX. Команда условного перехода в языке Ассемблер имеет вид j< мнемоника перехода> i8; IP: = (IP + i8)mod 216 Мнемоника перехода (это от одной до трёх букв) связана со значением анализируемых флагов (или регистра CX), либо со способом формирования этих флагов. Чаще всего программисты формируют флаги, проверяя отношение между двумя операндами op1 < отношение> op2, для чего выполняется команда вычитания или команда сравнения. Команда сравнения имеет мнемонический код операции cmp и такой же формат, как и команда вычитания: cmp op1, op2 Она и выполняется точно так же, как команда вычитания за исключением того, что разность не записывается на место первого операнда. Таким образом, единственным результатом команды сравнения является формирование флагов, которые устанавливаются так же, как и при выполнении команды вычитания. Вспомним, что программист может трактовать результат вычитания (сравнения) как производимый над знаковыми или же беззнаковыми числами. Как мы уже знаем, от этой трактовки зависит и то, будет ли один операнд больше другого или же нет. Так, например, рассмотрим два коротких целых числа 0FFh и 01h. Как знаковые числа 0FFh = -1 < 01h = 1, а как беззнаковые числа 0FFh = 255 > 01h = 1. Исходя из этого, принята следующая терминология: при сравнении знаковых целых чисел первый операнд может быть больше (greater) или меньше (less) второго операнда. При сравнении же беззнаковых чисел будем говорить, что первый операнд выше (above) или ниже (below) второго. Ясно, что действию " выполнить переход, если первый операнд больше второго" будут соответствовать разные машинные команды, если трактовать операнды как знаковые или же беззнаковые целые числа. Это учитывается в различных мнемониках этих команд. Ниже в Таблице 7.1 приведены мнемоники команд условного перехода. Некоторые команды имеют разную мнемонику, но выполняются одинаково (переводятся программой Ассемблера в одну и ту же машинную команду), такие команды указаны в одной строке таблицы.
В качестве примера рассмотрим, почему условному переходу jl/jnge соответствует логическое условие перехода SF< > OF. При выполнении команды сравнения cmp op1, op2 или команды вычитания sub op1, op2 нас будет интересовать трактовка операндов как знаковых целых чисел, поэтому возможны два случая, когда первый операнд меньше второго. Во-первых, если при выполнении операции вычитания op1-op2 результат получился правильным, т.е. не было переполнения (OF=0), то бит знака у правильного результата равен единице (SF=1). Во-вторых, при вычитании мог получиться неправильный результат, т.е. было переполнение (OF=0), но в этом случае знаковый бит результата будет неправильным, т.е. равным нулю. Видно, что в обоих случаях эти два флага не равны друг другу, т.е. должно выполняться условие SF< > OF, что и указано в нашей таблице. Для тренировки разберите правила формирования и других условий переходов. Как видим, команд условного перехода достаточно много, поэтому понятно, почему для них реализован только один формат – близкий короткий относительный переход. Реализация других форматов команд условного перехода привела бы к резкому увеличению числа команд в языке машины и, как следствие, к усложнению центрального процессора и росту объёма программ. В то же время наличие только одного формата команд условного перехода может приводить к плохому стилю программирования. Пусть, например, надо реализовать на Ассемблере условный оператор языка Паскаль if X> Y then goto L; Соответствующий фрагмент на языке Ассемблера, реализующий этот оператор для знаковых X, Y mov ax, X cmp ax, Y jg L ... L: может быть неверным, если расстояние между меткой и командой условного перехода велико (не помещается в байт). В таком случае придётся использовать такой фрагмент на Ассемблере со вспомогательной меткой L1 и вспомогательной командой безусловного перехода: mov ax, X cmp ax, Y jle L1 jmp L L1: ... L: Таким образом, на самом деле мы вынуждены реализовывать такой фрагмент программы на языке Паскаль: if X< =Y then goto L1; goto L; L1:; Это, конечно, по необходимости, прививает плохой стиль программирования. В качестве примера использования команд условного перехода рассмотрим программу, которая вводит знаковое число A в формате слова и вычисляет значение X по формуле include io.asm ; файл с макроопределениями для макрокоманд ввода-вывода data segment A dw? X dw? Diagn db ′ Ошибка – большое значение! $′ Data ends Stack segment stack db 128 dup (?) stack ends code segment assume cs: code, ds: data, ss: stack start: mov ax, data; это команда формата r16, i16 mov ds, ax; загрузка сегментного регистра DS inint A; ввод целого числа mov ax, A; ax: = A mov bx, ax; bx: = A inc ax; ax: = A+1 jo Error cmp bx, 2; Сравнение A и 2 jle L1; Вниз по первой ветви вычисления X dec bx; bx: = A-1 jo Error imul bx; (dx, ax): =(A+1)*(A-1) jo Error; Произведение (A+1)*(A-1) не помещается в ax L: mov X, ax; Результат берётся только из ax outint X; Вывод результата
|