WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Pages:     | 1 | 2 || 4 | 5 |

«(Учебное пособие) Иркутск 2007 УДК 681.3.6 С50 Смоленцев М.Ю. Программирование на языке Ассемблера для микропроцессоров i80x86: Учебное пособие.— Иркутск: ИрИИТ, 2007.— 600с. Ил. Табл. Библиогр.: назв. Рекомендовано ...»

-- [ Страница 3 ] --

;поменять порядок следования байт в ячейке памяти H1 DW 0F85Ch ;напрямую командой XCHG нельзя, но MOV AX,H1 ;можно для этой цели использовать XCHG AH,AL ;промежуточный регистр AX Exchange Register/Memory with Register register1 with register2 1000 011w:11 reg1 reg memory with register 1000 011w:mod reg r/m Синтаксис команды: BSWAP Семантика команды: Команда BSWAP изменяет порядок следования байтов в 32-разрядных регистрах, конвертируя значения из вида машинного представления (младшая часть, старшая часть) в обычное представление (старшая часть, младшая часть) и наоборот. Можно использовать для примитивного шифрования MOV EAX,12345678h По команде MOV можно переслать как байт и слово, так и двойное слово. А как узнать, что именно — байт или слово — пересылает команда?

Не может ли получиться так, что мы хотели переслать слово, а оказалось, что команда пересылает байт? Размер пересылаемой величины обычно определяется по типу операндов, указанных в команде MOV.

Пример:

MOV BH,0 ;пересылка байта (BH байтовый регистр) MOV X,0 ;пересылка байта (X описан как имя битовой ;переменной) MOV ESI,0 ;пересылка двойного слова (ESI регистр ;размером в двойное слово) MOV Y,0 ;пересылка слова (Y описан как имя ;переменной-слова) Обратите внимание, что по второму операнду (0) нельзя определить, какого он размера: ноль может быть и байтом (00h), и словом (0000h), и двойным словом (00000000h).

Если можно определить размеры обоих операторов, тогда эти размеры должны совпадать (либо байты, либо слова, либо двойные слова) иначе ассемблер зафиксирует ошибку Пример:

MOV DI,ES ;пересылка слова MOV CH,X ;пересылка байта MOV ESI,AX ;ошибка (ESI регистр размером в двойное ;слово, AX регистр размером в слово) MOV BH,300 ;ошибка — BH байтовый регистр, а 300 не ;может байтом Оператор переопределения типа PTR (от pointer, указатель) применяется для переопределения или уточнения типа метки или переменной, определяемой выражением. Оператор переопределения типа PTR записывается следующим образом: PTR Тип может принимать одно из следующих значений: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR, а выражение может быть константным или адресным. Оператор PTR используется с атрибутами BYTE, WORD, DWORD и т.д. для локальной отмены определенных типов (DB, DW и т.д.) или с атрибутами NEAR, FAR для отмены значения дистанции по умолчанию.

Если указано константное выражение, то оператор говорит о том, что значение этого выражения (число) должно рассматриваться языком ассемблера как величина указанного типа (размера); например, BYTE PTR 0 — это ноль как байт, а WORD PTR 0 — это ноль как слово.

Если же указано адресное выражение, то оператор показывает, что адрес, являющийся значением выражения, должен восприниматься языком ассемблера как адрес ячейки указанного типа (размера); например, WORD PTR A — адрес A обозначает слово (байты с адресами A и A+1). В данном случае оператор PTR относится к адресным выражениям.

Сущность цифровой электроники состоит в том, чтобы в соответствии с входными цифровыми сигналами вырабатывать выходные цифровые сигналы. Например, сумматор может принять на свои входы два 16разрядных числа и сформировать на выходе 16-разрядную сумму (плюс перенос). Можно также сделать схему для умножения двух чисел. Операции такого типа должен выполнять микропроцессор. Другой задачей может быть сравнение двух чисел с целью удостовериться в том, что все системы действуют нормально. Или, возможно, вам потребуется дополнить паритетным битом число, подлежащее передаче по каналу связи, так, чтобы общее количество «единиц» в нем стало четным: проверка паритета на приемной стороне обеспечивает простейший контроль правильности передачи. Еще одна типичная задача состоит в том, чтобы взять какие-либо числа, выраженные в двоичном коде, а затем воспроизвести их на экране или отпечатать на принтере в виде десятичных знаков. Во всех этих задачах состояние выхода (или выходов) является предопределенной функцией состояния входа или входов. Задачи, относящиеся к этому классу, называются «комбинационными» и решаются с помощью вентилей — устройств, которые выполняют операции булевой алгебры в системах с двумя состояниями (двоичных).

Вентили и комбинационная логика служат основой для построения любых цифровых схем. Для описания комбинационной схемы используют таблицу истинности — табличное представление, где перечислены все возможные состояния входных переменных вместе с соответствующими состояниями выходных переменных.

Инвертор (функция НЕ). Часто бывает нужно получить дополнение (инверсию) логического сигнала.

Эту функцию выполняет инвертор — вентиль, имеющий только один вход. На его выходе которого появляется уровень логической 1 если на входе присутствует уровень логического 0 и наоборот.

Вентиль ИЛИ. Электронный логический элемент, на выходе которого появляется уровень логического только в том случае, если на всех его входах (два или более) присутствует уровень логического 0; в противном случае на выходе этого элемента будет логическая 1. Таким образом, вентиль ИЛИ реализует логическую операцию ИЛИ, вследствие чего имеет точно такую же таблицу истинности. Иногда называется вентилем «включающее ИЛИ», поскольку при наличии на всех его входах значения логическая 1 на выходе тоже появляется логическая 1. Операция «ИЛИ» идентична логическому сложению 2 бит.

Вентиль И. Электронный логический элемент, на выходе которого появляется уровень логической только в том случае, если на всех его входах (два или более) присутствует уровень логической 1; в противном случае на выходе этого элемента будет логический 0. Таким образом, вентиль И реализует логическую операцию И, вследствие чего имеет точно такую же таблицу истинности. Символическое изображение вентиля И и его таблица истинности показаны на рисунке 5. Операция «И» идентична логическому умножению 2 бит.



И-НЕ и ИЛИ-НЕ. Вентили могут совмещать инвертирование с выполнением функций И и ИЛИ.

Исключающее ИЛИ. Электронный логический элемент, на выходе которого появляется уровень логической 1 только в тех случаях, когда на одном его входе присутствует уровень логической 1, а на остальных уровень логического 0. Поэтому он реализует логическую операцию «исключающее ИЛИ», имеет такую же таблицу истинности. Иногда называется вентилем отрицания эквивалентности. Операция «Исключающее ИЛИ» идентична сложению бит по модулю 2.

Булева алгебра располагала тремя основными операциями — И, ИЛИ, НЕ, которые позволяли производить сложение, вычитание, умножение, деление и сравнение символов и чисел. Любые функции, которые Вы только пожелаете реализовать, можно осуществить, комбинируя вентили названных типов. Для всех функции, реализуемых в компьютере, имеется свое схемное представление, которое вступает в действие каждый раз когда в регистр команд попадает соответствующая команда.

Логические команды выполняют логические операции известные вам по языкам высокого уровня — инверсию, конъюнкцию и дизъюнкцию.

Логические команды реализуют поразрядные операции: i-ый разряд результата зависит только от i-ых разрядов операндов. Логическая операция выполняется сразу над всеми разрядами операндов одновременно, параллельно.

Операндами логических команд должны быть либо байты, либо слова, либо двойные слова, но не то и другое одновременно. В качестве второго операнда, как правило, используют так называемую маску, записанную не в шестнадцатеричном, а в двоичном коде.

У вас в бите находится переменная x, которая может принимать значение 0 или 1. После применения операции логическое НЕ значение x изменится на противоположное (таблица 9). Выполняется одновременно над байтом, словом или двойным словом.

У вас есть две переменные x и y, которые могут принимать значение 0 или 1. При перемножении x и y Вы получите результат действия операции логическое И (таблица 9). Размер переменных x и y байт, слово или двойное слово.

8.1.3. Логическое сложение (включающее ИЛИ) При сложении двух переменных x и y, которые могут принимать значение 0 или 1, Вы получите результат действия операции Логическое ИЛИ.

От обычного сложения логическое ИЛИ отличается тем, что 1+1=1, а не 2, так как результат логических операций может принимать только значение 0 или 1 (таблица 9.). Размер переменных x и y байт, слово или двойное слово.

При сложении двух переменных x и y, которые могут принимать значение 0 или 1, Вы получите результат действия операции исключающее ИЛИ. От обычного сложения исключающее ИЛИ отличается тем, что 1+1=0 (таблица 9). Размер переменных x и y байт, слово или двойное слово.

В реальных программах на языке ассемблера логические команды в основном используются для работы с упакованными данными.

Синтаксис команды: NOT Семантика команды: операция логического отрицания для операнда1 размерностью байт, слово или двойное слово.

Алгоритм работы:

• изменить значение каждого бит операнда1 на противоположное: 0 на • записать результат операции в операнд1;

• установить флаг нуля ZF, если получился нулевой результат.

Применение: Команда NOT используется для работы с операндами на уровне битов.

Синтаксис команды: AND, Семантика команды: операция логического умножения над битами операнда1 размерностью байт, слово или двойное слово.

Алгоритм работы:

• выполнить операцию логического умножения над битами операнда1, используя операнд маску. При этом бит результата равен 1, если соответствующие биты операнд1 и маска равны 1, в противном случае записать результат операции в операнд1 (операнд маска остается неизменным);

• установить флаги.

Применение:

Команда AND используется для работы с операндами на уровне битов.

Удобно использовать для принудительного сброса определенных битов операнда. Например, преобразуем двузначное упакованное BCD-число в его символьный эквивалент.

U_BCD DB 25h ;упакованное BCD-число MOV AL,U_BCD MOV AL,U_BCD ;AX= ;преобразование в символьное представление:

MOV S_CH,AX Можно использовать эту команду для сравнения значения регистра с нулевым или ненулевым значением. Например, надо проверить регистр AX, чтобы выяснить равен ли он нулю. Для этого можно было бы применить команду CMP AX,0, но вместо этого используют AND AX,AX и после этой инструкции помещают условный переход JZ или JNZ. Логическая операция AND, выполненная по отношению к одному и тому же числу, дает в результате это же число. Инструкция AND, как и любая другая математическая инструкция, устанавливает флаги, включая флаг нуля. Результат выполнения AND будет равен нулю только в том случае, если число в регистре нулевое.

Команда CMP AX,0 занимает 3 байта и выполняется за 4 такта синхронизации, команда AND AX,AX занимает 2 байта и выполняется на такт быстрее.

(Логическое включающее ИЛИ = logical OR) Синтаксис команды: OR, Семантика команды: операция логического ИЛИ над битами операнда1.

Алгоритм работы:

выполнить операцию логического ИЛИ над битами операнда1, используя операнд маска. При этом бит результата равен 0, если соответствующие биты операнда1 и маска равны 0, в противном случае бит результата равен 1;

записать результат операции в операнд1 (операнд маска остается неизменным);

• установить флаги.

Применение:

Команду OR можно использовать для работы с операндами на уровне битов. Типичное использование команды — установка определенных разрядов первого операнда в единицу.

MOV AL,00000001h Эту команду можно использовать для сравнения значения регистра с нулевым или ненулевым значением.

Например, надо проверить регистр AX, чтобы выяснить равен ли он нулю. Можно было бы применить команду CMP AX,0, но используют OR AX,AX и после этой команду помещают условный переход JZ или JNZ. Логическая операция OR, выполненная по отношению к одному и тому же числу, дает в результате это же число. Инструкция OR, как и любая другая математическая инструкция, устанавливает флаги, включая флаг нуля. Но результат выполнения OR будет равен нулю только в том случае, если число в регистре равно нулю.

Команда CMP AX,0 занимает 3 байта и выполняется за 4 такта синхронизации, команда OR AX,AX занимает 2 байта и выполняется на 1 такт быстрее.

(Логическое исключающее ИЛИ = LOGICAL EXCLUSIVE OR) Синтаксис команды: XOR, Семантика команды: операция логического исключающего ИЛИ над операндом1 размерностью байт, слово или двойное слово.

Алгоритм работы:

выполнить операцию логического исключающего ИЛИ над битами операнда1, используя операнд маска. При этом бит результата равен 1, если соответствующие биты операнда1 и маска различны, в остальных случаях бит результата равен 0;

записать результат операции в операнд1 (операнд маска остается неизменным);

• установить флаги.

Применение:

Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов. Используется для простейшего шифрования и дешифровки:

;изменить значение бита 0 регистра AL на обратное XOR AL,00000001b Но наиболее часто используют эту команду для обнуления значения регистра. Результат выполнения XOR над двумя битами будет равен единице только в том случае, когда один бит установлен в ноль, а другой в единицу. Логическая операция XOR, выполненная по отношению к одному и тому же числу, даст в результате ноль. Команда MOV AX,0 занимает байта и выполняется за 4 такта синхронизации, а команда XOR AX,AX — 2 байта и выполняется на 1 такт быстрее.

(Логическое сравнение = TEST OPERANDS) Синтаксис команды: TEST, Семантика команды: операция логического сравнения операнда1 и маски размерностью байт, слово или двойное слово. Аналог операции логического умножения AND, но результат умножения никуда не записывается.

Главное в команде — установка флагов.

Алгоритм работы:

• выполнить операцию логического умножения над операндом1 и маской: бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;

• установить флаги.

Применение:

Эту команду удобно использовать для получения информации о том, являются ли заданные биты операнда1 нулевыми. Для анализа результата используется флаг ZF, который равен 1, если результат логического умножения равен нулю:

MOV BH,1100b TEST BH,0011b ;BH=1100b ZF= TEST BH,1100b ;BH=1100b ZF= (Побитное сканирование вперед = BIT SCAN FORWARD) Синтаксис команды: BSF, Семантика команды: для проверки наличия единичных битов в операнде2.

Алгоритм работы:

• просмотр битов операнда2, начиная с бита 0 и заканчивая битом 15/31, до тех пор, пока не встретится единичный бит;

• если встретился единичный бит, то флаг ZF устанавливается в 0 и в регистр операнда1 записывается номер позиции, где встретился единичный бит. Диапазон значений зависит от разрядности операнда2: для 16разрядного операнда — это 0...15; для 32-разрядного — это 0...31;

• если единичных битов нет, то флаг ZF устанавливается в 1.

Применение:

Команду BSF используют при работе на битовом уровне для определения позиции в операнде2 крайних справа единичных битов.

;сдвинем содержимое регистра BX вправо таким образом, MOV BX,0002h ; чтобы нулевой бит стал единичным BSF CX,BX ;CX=0001h

JZ NULL

SHR BX,CL ;BX=0000 0001b NULL:

(Побитное сканирование назад = Bit Scan Reverse) Синтаксис команды: BSR, Семантика команды: проверка наличия единичных битов в операнде2.

Алгоритм работы:

• просмотр битов операнда2, начиная со старшего бита 15/31 и заканчивая битом 0, до тех пор, пока не встретится единичный бит;

• если встретился единичный бит, флаг ZF устанавливается в 0 и в регистр операнда1 записывается номер позиции (отсчет осуществляется относительно нулевой позиции), где встретился самый старший единичный бит. Диапазон значений зависит от разрядности операнда2: для 16разрядного операнда это 0...15; для 32-разрядного — 0...31;

• если единичных битов нет, флаг ZF устанавливается в 1.

Применение:

Команду BSR используют при работе на битовом уровне для определения позиции крайних слева единичных битов.

;сдвинем содержимое регистра BX вправо таким MOV BX,41h ;образом,чтобы старший единичный бит ;исходного значения в BX переместился в нулевую ;позицию (BX=01000001h) старший единичный BSR CX,BX ; бит шестой, поэтому CX=06h

JZ NULL

SHR BX,AX ;BX=0001h NULL:

8.3.2. Команды проверки и модификации бит Синтаксис команды: BT, Семантика команды: извлечение значения заданного бита в флаг CF.

Алгоритм работы:

• получить бит по указанному номеру позиции в операнде1;

• установить флаг CF согласно значению этого бита.

Применение:

Команду BT используют для определения значения конкретного бита в операнде1. Номер проверяемого бита задается содержимым операнда (значение числом из диапазона 0...31). После выполнения команды, флаг CF устанавливается в соответствии со значением проверяемого бита.

MOV EBX,01001100h BT EBX,8 ;проверка состояния бита 8 и установка CF= JC M1 ;перейти на M1, если проверяемый бит равен (Проверка бита с инверсией (дополнением) = Bit Test and Complement) Синтаксис команды: BTC, Семантика команды: извлечение значения заданного бита в флаг CF и изменение его значения в операнде1 на обратное.

Алгоритм работы:

• получить значение бита с номером позиции индекс в операнде1;

• инвертировать значение выбранного бита в операнде1;

• установить флаг СF исходным значением бита.

Применение:

Команда BTС используется для определения и инвертирования значения конкретного бита в операнде1. Номер проверяемого бита задается содержимым операнда2 (значение из диапазона 0...31). После выполнения команды флаг CF устанавливается в соответствии с исходным значением бита, то есть тем, которое было до выполнения команды.

;проверка состояния бита 8 EBX и его обращение MOV EBX,01001100h BTC EBX,8 ;CF=1 и EBX=01001000h (Проверка бита с его сбросом в 0 = Bit Test and Reset) Синтаксис команды: BTR, Семантика команды: извлечение значения заданного бита в флаг CF и изменение его значения на нулевое.

Алгоритм работы:

• получить значение бита с указанным номером позиции в операнде1;

• установить флаг CF значением выбранного бита;

• установить значение исходного бита в операнде1 в 0.

Применение:

Команда BTR используется для определения значения конкретного бита в операнде источник и его сброса в 0. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). В результате выполнения команды флаг CF устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.

;проверка состояния бита 8 регистра EBX и его сброс MOV EBX,01001100h BTR EBX,8 ;CF=1 и EBX=01001000h (Проверка бита с его установкой в 1 = Bit Test and Set) Синтаксис команды: BTS,< операнд2> Семантика команды: извлечение значения заданного бита операнда1 в флаг CF и установка этого бита в единицу.

Алгоритм работы:

• получить значение бита с указанным номером позиции в операнде1;

• установить флаг CF значением выбранного бита;

• установить значение исходного бита в операнде1 в 1.

Применение:

Команда BTS используется для определения значения конкретного бита в операнде1 и установки проверяемого бита в 1. Номер проверяемого бита задается содержимым операнда2 (значение из диапазона 0...31). После выполнения команды флаг CF устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.

;проверка состояния бита 0 и его установка в MOV EBX,01001100h 8.3.2.5.Команды управления флагами микропроцессора Синтаксис команды: STC (SeT Carry flag) Семантика команды: установка флага переноса CF в единицу.

Синтаксис команды: CLC (CLear Carry flag) Семантика команды: установка флага переноса CF в ноль.

Синтаксис команды: CMC (CoMplement Carry flag) Семантика команды: инвертирование флага переноса CF Алгоритм работы: Если CF=1, то после команды CMC флага переноса CF сбросится в ноль, если CF=0, то после команды CMC флага переноса CF установится в Применение: команды STC, CLC, CMC применяют, как правило, для установления признака успешного или не успешного выполнения подпрограмм.

Синтаксис команды: SALC (Set registr AL according to Carry flag) Семантика команды: установить регистр AL в соответствии с Алгоритм работы: Если CF=1, то в AL установится значение 0FFh, если CF=0, то AL установится в Применение: SALC недокументированная команда, имеет машинный код 0D6h. Эквивалентна команде SBB AL,AL но без изменения флагов CF, AF, PF, ZF DB 0D6h;код команды SALC ;после выполнения команды SALC AL=0FFh MOV AX,0FFFFh CLC;сбросим флаг CF в DB 0D6h; код команды SALC ;после выполнения команды SALC AL= Синтаксис команды: STD (SeT Direct flag) Семантика команды: установка флага направления DF в единицу.

Синтаксис команды: CLD (CLear Interrupt flag) Семантика команды: сброс флага направления DF в ноль.

Алгоритм работы:

Применение: в процессе циклического выполнения команд значения в регистрах SI и DI автоматически модифицируются (уменьшаются или увеличиваются) в зависимости от длины элемента строки и значения флага направления DF. Если DF=0, значения в регистрах SI и DI увеличиваются (строка символов обрабатывается со стороны меньших адресов в сторону больших адресов). Если DF=1, значения в регистрах SI и DI уменьшаются (строка символов обрабатывается со стороны больших адресов в сторону меньших адресов).

Синтаксис команды: STI (SeT Interrupt flag) Семантика команды: установка флага разрешения прерывания IF в единицу, разрешая процессору распознавать маскированные прерывания. Немаскированные прерывания распознаются процессором всегда, независимо от значения флага прерывания IF.

Синтаксис команды: CLI (CLear Direct flag) Семантика команды: установка флага разрешения прерывания IF в ноль.

Применение: организация обработки критических участков программы, в которых прервать работу микропроцессора невозможно. Однако этим не стоит злоупотреблять, так как аппаратные прерывания использует и операционная систама Синтаксис команды: XOR AX,AX, или SUB AX, AX, либо любая другая команда, которая даст нулевой результат Семантика команды: установка флага ZF в ноль Синтаксис команды: INT Семантика команды: установка флага TF в единицу Применение: внезапное зависание программы, а если повезет,то и операционной системы Синтаксис команды: CLTS (CLear Task Select) Семантика команды: сброс флага переключения задачи в управляющем регистре 0.

Применение: команда CLTS сбрасывает флаг TS в регистре CR Если необходимо изменить значения других флагов или одновременно изменить значения нескольких флагов используют следующующие схемы:

а) для первых 8 флагов (SF, ZF, AF, PF, CF) LAHF загрузить значения младшего байта флагового регистра AND AH, маска или OR AH, маска сбросить или установить SAHF загрузить младший байт флагового регистра значениями б) для первых 16 флагов (вышеперечисленные и NT, IOPL, OF, PUSHF передать содержимое регистра флагов на вершину POP AX прочесть слово, находящееся на вершине стека в один AND AX, маска или OR AX, маска установить или сбросить PUSH AX вновь передать содержимое регистра или ячейки памяти на вершину стека POPF прочитать слово с вершины стека в регистр флагов в) для всех 32 флагов (все вышеперечисленные и AC, VM, RF)

PUSHFD

POP EAX

PUSH EAX

Контрольные вопросы и упражнения:

1. Предположим, что регистр BL содержит 11100011b и переменная по имени BOOLDOG содержит 01111001b. Напишите программы определяющие воздействие на регистр BL следующих команд:

а) XOR BL,BOOLDOG; б) AND BL,BOOLDOG;

в) OR BL,BOOLDOG; г) NOT BL; д) XOR BL,BL;

е) XOR BL,11111111b; ж) OR BL,11111111b; з) AND BL,00000000b.

2. Предположим, что регистр BL содержит 11100011b. Укажите возможные способы, которыми можно инвертировать содержимое регистра BL.

Синтаксис команд:

Команда ADD складывает операнд2 и операнд1 размерностью байт, слово или двойное слово и записывает результат сложения в операнд1.

По команде SUB из операнда2 вычитается операнд1 и полученная разность записывается вместо операнда2. Операнд2 и операнд1 имеют размерность байт, слово или двойное слово Что произойдет, если полученная сумма окажется больше размерности операнда1? Например: при размере операнда1 в байт (=100000100b) не влезает в 8 бит, процессор отбросит самую левую единицу, а в качестве ответа будет записана искаженная сумма 4(=00000100b), но во флаг переноса CF будет записана 1. Это сигнал о том, что получилась неправильная сумма (если бы переноса не было, в CF записали бы 0). При сложении и вычитании меняются также флаг нуля ZF и флаг знака SF. Флаг нуля ZF получает значение 1, если результат оказался нулевым, и значение 0, если результат ненулевой. Во флаг знака SF заносится знаковый (самый левый) бит результата, он получает значение 1, если результат оказался отрицательным, и значение 0 при положительном результате. При выполнении сложения и вычитания могут также меняться флаг переполнения OF и флаги AF и PF Следующая пара команд сложения и вычитания INC и DEC Синтаксис команд: INC Команда INC аналогична команде ADD,1 то есть увеличение значения операнда в памяти или регистре на 1, а команда DEC аналогична команде SUB,1 т.е. уменьшение значения операнда в памяти или регистре на 1 (команды INC и DEC не меняют значение флага переноса CF, эти команды занимают меньше места в памяти и выполняются быстрее SUB и ADD).

DEC WORD PTR A

MOV AL, Еще одна команда из группы сложения и вычитания Синтаксис команды: NEG Команда NEG рассматривает свой операнд как число со знаком и меняет этот знак на противоположный. Команда NEG аналогична команде SUB 0, Три особых случая для команды NEG:

1. если операнд равен -128 (80h), в этом случае операнд не меняется, так как нет знакового числа +128 величиною в байт. CF=1, ZF=0, OF=1, SF=1. В этом особом случае флаг OF получает значение (при других операндах OF=0).

2. для числа размером в слово если значение операнда равно минимальному отрицательному числу -32768 (8000h), то команда не меняет операнд. CF=1, ZF=0, OF=1, SF=1. В этом особом случае флаг OF получает значение 1 (при других операндах OF=0).

3. если операнд равен 0 команда NEG не меняет операнд. флаг CF=0, ZF=1, OF=0, SF=0. В этом особом случае флаг CF получает значение 0, а флаг ZF значение 1 (при других операндах CF= При ненулевых значениях операнда после действия команды NEG CF=1 ZF=0. Флаг SF меняется как обычно — если операнд был положительным, то после действия команды NEG SF=1, если операнд был отрицательным, то после действия команды NEG SF=0.

(Сложение с переносом = “ADDITION WITH CARRY”) (Вычитание с займом = “SUBTRACT WITH BORROW”) Синтаксис команд:

Допустимые типы операндов, как в командах ADD и SUB. Аналогичны командам обычного сложения и вычитания, за одним исключением, в команде ADC к сумме операндов еще прибавляется значение флага переноса CF: ++CF, а в команде SBB из разности операндов вычитается еще и значение флага переноса CF: ——CF Для чего нужны команды ADC и SBB? Компьютер одной командой может сложить (вычесть) только числа размером в двойное слово. Сложение и вычитание чисел других размеров, например учетверенных слов, приходится реализовывать через сложение (вычитание) чисел размером в двойное слово. Рассмотрим сложение учетверенных слов X и Y. Условно разбиваем каждое учетверенное слово на два двойных. Сначала складываем младшие (правые) части, используя команду ADD. Может получиться единица переноса, которую надо надо добавить и значение этого флага (если единицы переноса не было, то CF=0 поэтому и здесь можно прибавлять CF), именно это и осуществляет команда ADC. Поэтому чего используют команду SBB.

Таким образом, команды ADC и SBB значительно расширяют диапазон значений складываемых и вычитаемых чисел. С помощью команд ADC и SBB можно реализовать сложение и вычитание чисел любого размера, причем эти операции для знаковых и беззнаковых чисел реализуются одинаково.

Так как микропроцессор не знает о том с какими числами (со знаком или без знака) мы в данный момент работаем — он на всякий случай предполагает, что все числа со знаком. Допустим мы складываем байты.

Сложение например чисел 5 и 126 даст в результате то ли число без знака, то ли число -125 со знаком. При сложении произошел перенос в знаковый разряд и получится ошибочный с точки зрения микропроцессора результат — микропроцессор выработает признак переполнения OF, свидетельствующий о том, что результат арифметических операций попал в старший значащий разряд слова (Most Significant Character) или в знаковый разряд. Термины перенос и переполнение используются для близких понятий поэтому требуются определенные уточнения.

При выполнении команды сложения ADD:

Перенос вырабатывается только тогда, когда происходит перенос из позиции слова.

Переполнение вырабатывается в том случае когда оба слагаемых имеют один знак, а результат — противоположный.

Перенос используют для выполнения операций с увеличенной точностью, а признак переполнения нужен для определения правильности или неправильности выполнения арифметической операции.

Любой начинающий работать на языке Ассемблера программист рано или поздно в своей деятельности доходит до изучения команд, изменяющих флаги переноса и переполнения в соответствии с определен ными правилами. К таковым относятся, например, команды сложения, вычитания, умножения, логических и арифметических сдвигов. Естественно, работа с этими командами требует четкого понимания понятий переноса и переполнения. (Если быть более точным, следует осознавать, каким образом знаковые или беззнаковые числа, сочетаясь в арифметических командах, дают различные комбинации флагов переноса и переполнения. Это - азбука начинающего программиста, и без ее освоения дальнейшая работа невозможна).

Раскроем, например, очень хороший учебник В.Юрова "Ассемблер: учебный курс".

Какую информацию он содержит по нашему вопросу?

В таблице "Флаги состояния" находим следующие сведения: "... Флаг переноса CF... устанавливается в 1, если арифметическая операция произвела перенос из старшего бита результата. Старшим является 7, 15 или 31-й бит в зависимости от размерности операнда.... Флаг переполнения OF... устанавливается в 1, если в результате операции происходит перенос (заем) в(из) старшего, знакового бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно)."

Это интересно. Получается, что автор учебника предлагает нам согласиться с тем, что:

1) Перенос происходит тогда, когда единица выносится за пределы разрядной сетки (при операции сложения) или занимается из этих пределов (при операции вычитания);

2) Переполнение происходит тогда, когда единица выносится в последний разряд числа (при операции Проверим, так ли это на самом деле. Сложим в программе два числа и проанализируем получившийся код отладчиком, обращая особое внимание на состояние флагов OF (переполнения) и CF (переноса) до и после выполнения команды. Например:

mov al, 10000000b;//Произошел вынос единицы ТОЛЬКО за mov bl, 10000000b;//пределы разрядной сетки, однако...

add al, bl ;//...есть и переполнение (OF=1), и перенос (CF=1) mov al, 11111111b ;//Имели место выносы единицы КАК за mov bl, 00000001b ;//пределы разрядной сетки, так и в старший add al, bl ;//бит, однако перенос есть, а переполнения нет Налицо явное противоречие теории, изложенной в учебнике, и действительности, открывшейся после манипуляций с отладчиком. Что же, продолжим изучение теории. Что утверждают в своем учебнике "Язык Ассемблера и организация ЭВМ" В.Сорокин и В.Сарычев? "... Флаг переноса CF устанавливается в единицу, если произошел перенос из самого старшего разряда числа при команде сложения или если требуется заем для самого старшего разряда уменьшаемого при вычитании...

Флаг переполнения OF используется как индикатор переполнения при работе с числами со знаком. Он устанавливается в 1, если результат операции над числами со знаком выйдет за пределы допустимого диапазона результата и устанавливается в 0 в противном случае."

По порядку установки флага переноса авторы не сообщили нам ничего нового. Более интересна информация о флаге переполнения, где вскользь упоминается о его зависимости от наличия у числа знака; чтобы выяснить, отличаются ли данные сведения от тех, что были найдены в предыдущем учебнике, произведем краткий экскурс в теорию знаковых и беззнаковых чисел, и вспомним, чем они отличаются друг от друга.

На уровне машинных команд между этими двумя видами чисел нет никакой разницы. Находящийся в памяти или в одном из регистров операнд представляет собой (в зависимости от используемой модели ад ресации) 8-,16- или 32-разрядное число, все разряды которого абсолютно равноправны. Понятие знака введено исключительно для возможности манипулирования (на логическом уровне) с отрицательными числами - для процессора все числа одинаковы, а для программиста они отличаются тем, что для одних высший разряд выступает в качестве информации о знаке числа (знаковые числа), а для других все разряды несут информации о самом числе (беззнаковые числа). Естественно, выделение одного разряда под знак приводит к уменьшению возможной величины знакового числа вдвое; так, максимальное значение беззнакового 8-разрядного числа равно 11111111b, или 255, максимальное же (минимальное) значение аналогичного знакового числа равно соответственно 01111111b, или 127 (-128, или 10000000b). Если старший разряд знакового числа равен 1, число считается отрицательным, если 0 - положительным. Что бы определить величину знакового числа, следует обратить в нем все биты (изменить их значения с 0 на 1 и наоборот), и приписать к полученному модулю (он считается беззнаковым) знак (-), если старший бит искомого числа был равен 1. Исходя из этого, становится понятным различие на 1 в диапазонах для положительных и отрицательных величин (127,-128) - для последних может использоваться старший бит, который и дает единичную прибавку. Легко видеть, что больше 127 (меньше -128) знаковое число быть не может, поскольку для этих величин все информационные разряды уже взведены (сброшены), и даль нейшее увеличение (уменьшение) числа приведет к переносу в знаковый разряд (заему из него) и, соот ветственно, изменению знака числа...... а это и есть пересказ иными словами того, что написано по поводу флага переполнения в учебнике "Язык Ассемблера и организация ЭВМ". То есть и здесь авторы не сообщили нам ничего нового - речь идет все о том же пресловутом переносе в знаковый бит (старший разряд). А это, как мы уже убедились, не соответствует действительности.

Популярные учебники не могут помочь нам в выяснении того, когда при выполнении арифметических команд возникает перенос, а когда - переполнение. Остается выяснить это самостоятельно, складывая между собой различные числа во всевозможных комбинациях, и анализируя состояние флагов OF и CF.

При этом каждая пара чисел будет интерпретироваться дважды - сперва как две знаковых, затем как две беззнаковых величины.

mov al, 00111111b ;//Нет ни переполнения,ни переноса mov bl, 00000001b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - нет mov al, 11111101b ;//Перенос есть,переполнения нет mov bl, 00000101b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 11111100b ;//Перенос есть,переполнения нет mov bl, 00000101b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 01000000b ;//Перенос есть,переполнения нет mov bl, 11000000b ;//7-й бит: стал равен mov al, 11100000b ;//Перенос есть,переполнения нет mov bl, 01100000b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 01100000b ;//Перенос есть,переполнения нет mov bl, 11100000b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 11100000b ;//Перенос есть,переполнения нет mov bl, 11100000b ;//7-й бит: стал равен 1; перенос в 7-й бит:есть add al, bl ;//Вынос за разрядную сетку - есть mov al, 11000000b ;//Перенос есть,переполнения нет mov bl, 11000000b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 11111111b ;//Перенос есть,переполнения нет mov bl, 00000001b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 11111111b ;//Перенос есть,переполнения нет mov bl, 10000001b ;//7-й бит: стал равен add al, bl ;//Вынос за разрядную сетку - есть mov al, 11111111b ;//Перенос есть,переполнения нет mov bl, 11000001b ;//7-й бит: стал равен 1; перенос в 7-й бит: есть add al, bl ;//Вынос за разрядную сетку - есть mov al, 11111111b ;//Перенос есть,переполнения нет mov bl, 01000001b ;//7-й бит: стал равен 0; перенос в 7-й бит: есть add al, bl ;//Вынос за разрядную сетку - есть mov al, 01000000b ;//Переполнение есть,переноса нет mov bl, 01000000b ;//7-й бит: стал равен 1; перенос в 7-й бит: есть add al, bl ;//Вынос за разрядную сетку - нет mov al, 01100000b ;//Переполнение есть,переноса нет mov bl, 01100000b ;//7-й бит: стал равен 1; перенос в 7-й бит: есть add al, bl ;//Вынос за разрядную сетку - нет mov al, 01111111b ;//Переполнение есть,переноса нет mov bl, 00000001b ;//7-й бит: стал равен 1; перенос в 7-й бит: есть add al, bl ;//Вынос за разрядную сетку - нет mov al, 10000000b ;//Есть и перенос,и переполнение mov bl, 10000000b ;//7-й бит: стал равен 0; перенос в 7-й бит: нет add al, bl ;//Вынос за разрядную сетку - есть Итак, установка флажков переноса и переполнения производится по следующим правилам:

ПЕРЕНОС БЕЗ ПЕРЕПОЛНЕНИЯ (CF=1, OF=0) - тогда,когда производится перенос единицы в знаковый разряд (7,15,31-й) и перенос единицы из разрядной сетки (из 7,15 или 31-го разрядов в 8,16,32, несуществующие для регистра указанной размерности).

Сложение БЕЗЗНАКОВЫХ чисел при возникновении переноса протекает неправильно (ТОЛЬКО из-за переноса из разрядной сетки - перенос в знаковый разряд роли не играет). При интерпретации слагаемых как беззнаковых чисел перенос из разрядной сетки приводит к потере старших разрядов числа, и результат оказывается неверным.

Сложение ЗНАКОВЫХ чисел при возникновении переноса протекает правильно, так как при такой интерпретации слагаемые представляют собой ЛИБО пару "ПОЛОЖИТЕЛЬНОЕ ЧИСЛО + ОТРИЦАТЕЛЬНОЕ ЧИСЛО" (старший бит одного слагаемого равен 0, а второго - 1, и перенос из шестого (четырнадцатого, тридцатого) бита приводит к переносу в старший и переносу из разрядной сетки), и результат такого сложения не может быть неправильным - он будет находиться в пределах -128 - +127;

ЛИБО пару "ДВА ОТРИЦАТЕЛЬНЫХ ЧИСЛА,СУММА КОТОРЫХ НЕ МЕНЬШЕ -128" (это означает, что сочетания единичных битов первого и второго слагаемых ОБЯЗАТЕЛЬНО приведут к переносу в старший разряд в то время,как будет произведен перенос из разрядной сетки, и знаковый бит не будет потерян; для этого и налагается условие на сумму - -127 - 1, -120 - 8, -64 - 64, НО НЕ - -127 - 2, -64 - 65).

В последних случаях возникает перенос с переполнением, так как производится только перенос из разрядной сетки.

ПЕРЕПОЛНЕНИЕ БЕЗ ПЕРЕНОСА (OF=1, CF=0) - тогда, когда производится ТОЛЬКО перенос единицы в знаковый разряд.

Сложение ЗНАКОВЫХ чисел при возникновении переполнения протекает неправильно, так как слагаемые могут представлять собой ТОЛЬКО беззнаковые числа (иначе при переносе единицы из шестого бита наличие единицы в знаковом разряде приведет к переносу из разрядной сетки; в результате переполнения не будет,а будет перенос). Поэтому перенос единицы в знаковый разряд приводит к появлению знакового (отрицательного) числа, что неправильно - сложение двух положительных чисел может иметь результатом только положительное число.

Сложение БЕЗЗНАКОВЫХ чисел в данном случае протекает правильно,так как для этих чисел 7-й бит не играет особой роли и представляет собой лишь добавочный разряд; перенос в него не приводит к ошибке.

ПЕРЕНОС С ПЕРЕПОЛНЕНИЕМ (CF=1,OF=1) - тогда,когда производится ТОЛЬКО перенос единицы из разрядной сетки.

Сложение БЕЗЗНАКОВЫХ чисел в данном случае протекает неправильно, так как перенос единицы из разрядной сетки приводит к потере старшего разряда.

Сложение ЗНАКОВЫХ чисел ТОЖЕ протекает неправильно, так как в результате переноса из разрядной сетки теряется знаковый бит,и сумма двух отрицательных чисел (а перенос с переполнением возможен только при сложении двух отрицательных чисел,т.к. для переноса единицы из разрядной сетки без переноса в знаковый бит необходимы единицы в старших разрядах обоих слагаемых) превращается в положительное число,что неправильно.

ОТСУТСТВИЕ ПЕРЕНОСА И ПЕРЕПОЛНЕНИЯ - тогда, когда нет переносов ни в знаковый разряд, ни из разрядной сетки. На основании всего вышеизложенного может быть составлена следующая Истинная таблица установки флагов переноса и переполнения для сложения:

Совершенно аналогично операциям сложения можно произвести ряд операций вычитания над знаковыми и беззнаковыми числами, отслеживая зависимость флагов OF и CF от наличия заемов из старшего и из "запредельного" разрядов.

mov al, 11100000b ;//Нет ни переполнения,ни переноса mov bl, 00100000b ;//Заем в 7-й бит: нет; заем из 7-го бита: нет sub al, bl mov al, 00111111b ;//Перенос есть,переполнения нет mov bl, 11111111b ;//Заем в 7-й бит: есть; заем из 7-го бита: есть sub al, bl mov al, 10000011b ;//Перенос есть,переполнения нет mov bl, 10011010b ;//Заем в 7-й бит: есть; заем из 7-го бита: есть sub al, bl mov al, 10000000b ;//Перенос есть,переполнения нет mov bl, 10000001b ;//Заем в 7-й бит: есть; заем из 7-го бита: есть sub al, bl mov al, 10000000b ;//Перенос есть,переполнения нет mov bl, 11000000b ;//Заем в 7-й бит: есть; заем из 7-го бита: есть sub al, bl mov al, 10001010b ;//Перенос есть,переполнения нет mov bl, 10100101b ;//Заем в 7-й бит: есть; заем из 7-го бита: есть sub al, bl mov al, 10000000b ;//Переполнение есть,переноса нет mov bl, 01000000b ;//Заем в 7-й бит: нет; заем из 7-го бита: есть sub al, bl mov al, 10000000b ;//Переполнение есть,переноса нет mov bl, 00000001b ;//Заем в 7-й бит: нет; заем из 7-го бита: есть sub al, bl mov al, 01000000b ;//Есть и переполнение,и перенос mov bl, 11000000b ;//Заем в 7-й бит: есть; заем из 7-го бита: нет sub al, bl mov al, 01100000b ;//Есть и переполнение,и перенос mov bl, 10100000b ;//Заем в 7-й бит: есть; заем из 7-го бита: нет sub al, bl mov al, 01111111b ;//Есть и переполнение,и перенос mov bl, 11111111b ;//Заем в 7-й бит: есть; заем из 7-го бита: нет sub al, bl mov al, 01110011b ;//Есть и переполнение,и перенос mov bl, 10110111b ;//Заем в 7-й бит: есть; заем из 7-го бита: нет sub al, bl Правила установки флагов переноса и переполнения для команды вычитания аналогичны тем, что уже излагались для команды сложения; единственное различие - вместо словосочетания "перенос в..." всюду следует подставить словосочетание "заем из...". А Истинная таблица установки флагов переноса и переполнения для вычитания Итак, мы на собственном опыте убедились, как на деле сложен тот вопрос, от которого авторы популярных учебников отделались парой абзацев.

(Обмен и сложение = “eXchang and ADD operands”) Синтаксис команды: XADD, операнд1 должен быть ячейкой памяти или регистром, а операнд только регистром. После сложения операнда1 и операнда2 исходное содержимое памяти (операнд1) переносится в операнд2 (регистр), а полученная сумма записывается в память (на место операнда1). Аналогично последовательному употреблению команд XCHG и ADD.

MOV AL, MOV BL, XADD AL,BL ;AL=9 BL= Если сложение и вычитание для знаковых и беззнаковых чисел производятся по одним и тем же алгоритмам, то умножения и деление для знаковых и беззнаковых чисел производятся по разным алгоритмам.

Например, чтобы умножить или разделить два числа с разными знаками две команды умножения и деления. В остальном эти команды действуют одинаково.

Сочетание операций сдвигов (глава «Команды сдвига») и сложения позволяют осуществлять умножение чисел без знака.

(Умножение целых без учета знака = ”unsigned MULtiply”) Синтаксис команды: MUL Семантика команды: операция умножения двух целых чисел без учета знака.

Алгоритм работы: Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя1, который может быть расположен в памяти или в регистре, но не может быть непосредственно числом. Местоположение сомножителя2 фиксировано и зависит от размера сомножителя1:

Если перемножить максимальные чисел величиной в байт — результат займет 2 байта:

При перемножении максимальных чисел величиной в слово (2 байта) —результат займет уже 4 байта:

0FFFFh 0FFFFh = 65535 65535 = 4294836225 = 0FFF E0001h и так далее, двоичный код результата будет занимать в два раза больше места, чем максимальный двоичный код сомножитей • если операнд, указанный в команде — байт, то сомножитель2 должен располагаться в AL;

• если операнд, указанный в команде — слово, то сомножитель2 должен располагаться в AX;

Местоположение результата умножения заранее известно, и поэтому в команде явно не указывается. Под результат отводят в два раза больше места, чем под сомножители. Место, в которое будет помещен результат, определяется размером сомножителей:

• при умножении байтов результат помещается в AX;

• при умножении слов результат помещается в пару DX:AX;

• при умножении двойных слов результат помещается в пару Хотя команда умножения выдает результат в удвоенном формате, но в то же время не всегда величина произведения столь велика, что ей нужен удвоенный формат. Очень часто результат имеет тот же формат, что и сомножители. Вопрос о том, уместится ли результат умножения в формат сомножителей или нет, решается с помощью анализа флагов CF и OF.

CF=OF=1 — если произведение занимает двойной формат;

CF=OF=0 — если произведению достаточен формат сомножителей.

MN_1 DB MN_2 DB MOV AH, MOV AL,MN_1 ;AX=15=0Fh MUL MN_2 ;AX=15*25=375=177h 9.2.2. Умножение с многократной точностью Команда MUL предназначена в основном для операций умножения с многократной точностью. Для иллюстрации продемонстрируем умножение двух 64-разрядных неотрицательных чисел: XY=Z, Адрес Машинный Вид команды Вид команды до трансляции 010A 89165201 MOV [0152],DX MOV [Z+2],DX 0115 01065201 ADD[0152],AX ADD [Z+2],AX 0119 11165401 ADC [0154],DX ADC [Z+4],DX 011F FF065601 INC W/[0156] INC [Z+6] 0123 A14A01 MOV AX,[014A] a1: MOV AX,a 0126 F7264C01 MUL W/[014C] MUL d 012A 01065201 ADD [0152],AX ADD [Z+2],AX 012E 11165401 ADC [0154],DX ADC [Z+4],DX 0134 FF065601 INC W/[0156] INC [Z+6] 0138 A14A01 MOV AX,[014A] a2: MOV AX,a 013B F7264E01 MUL W/[014E] MUL c 013F 01065401 ADD [0154],AX ADC [Z+4],AX 0143 11165601 ADC [0156],DX ADC [Z+6],DX Сама программа после компиляции занимает 148h-100h=48h=72 байта. Пытаемся уменьшить размер программы. Так как и сомножетели и место под результат расположены в памяти последовательно, то можно уменьшить размер кода программы если мы используем не прямую, а косвенную адресацию. При каждом таком обращении к памяти будет сэкономлено по одному байту. Адреса операндов будут передаваться через регистр BX Адрес Машинный Вид команды до трансляции 0105 F76704 MUL WORD PTR [BX+4] 010B 89570A MOV [BX+10],DX Адрес Машинный Вид команды до трансляции 0110 F76706 MUL WORD PTR [BX+6] 0113 01470A ADD [BX+10],AX 0116 11570C ADC [BX+12],DX 011B FF470E INC WORD PTR [BX+14] 0121 F76704 MUL WORD PTR [BX+4] 0124 01470A ADD [BX+10],AX 0127 11570C ADC [BX+12],DX 012C FF470E INC WORD PTR [BX+14] 0132 F76706 MUL WORD PTR [BX+6] 0135 01470C ADD [BX+12],AX 0138 11570E ADC [BX+14],DX 13Ch-100h=3Ch=60 байт В программе имеются повторяющиеся фрагменты кода, выделенные жирным шрифтом, которые можно оформить как процедуру, кроме того, две команды JNC метка и INC WORD PTR [BX+14] можно заменить на одну команду ADC [BX+14],0. Это сэкономит еще по одному байту кода Адрес Машинный Вид команды до трансляции 134h-100h=34h=52 байта. Итак, нам удалось уменьшить программу с 72 до 52 байт, то есть на 20 байт. Попробуем написать еще более короткий код.

Вернем в текст программы то, что мы вынесли в подпрограмму. В тексте программы есть три очень похожих фрагмента 1) MOV [BX+8], AX MOV [BX+10], DX 2) ADD [BX+10], AX ADD [BX+12], DX ADC [BX+14], 3) ADD [BX+12],AX ADC [BX+14],DX Так как в ячейках памяти отведенных под результат пока еще ничего нет, то если в ячейки [BX+8] и [BX+10] заранее поместить 0, тогда результат команд MOV [BX+8],AX и ADD [BX+8],AX будет эквивалентен.

Добавим также для большей схожести в первый фрагмент команду ADC[BX+12],0, а в третий фрагмент команду ADC [BX+16],0 использование этих команд результат не изменит.

MOV [BX+10],DX ADC [BX+10],DX ADC [BX+10],DX ADD [BX+10],AX ADD [BX+8+2],AX ADD [BX+8],AX ADC [BX+12],DX ADC [BX+10+2],DX ADC [BX+10],DX ADC [BX+14],0 ADC [BX+12+2],0 ADC [BX+12], ADD [BX+10],AX ADD [BX+8+2],AX ADD [BX+8],AX ADC [BX+12],DX ADC [BX+10+2],DX ADC [BX+10],DX ADC [BX+14],0 ADC [BX+12+2],0 ADC [BX+12], ADD [BX+12],AX ADD [BX+8+4],AX ADD [BX+8],AX ADC [BX+14],DX ADC [BX+10+4],DX ADC [BX+10],DX жирным шрифтом выделены повторяющиеся фрагменты кода. Можно было бы использовать вызов подпрограмм, но при использование цикла код программы будет короче. Вот, что у нас получилось в результате.

Адрес Машинный код Вид команды до трансляции 012F 0000000000000000 Z DQ 125h-100h=25h=37 байта. Подведем итоги: 72 60 Попробуйте сами написать еще короче, может быть получится… Программу можно легко переделать для умножения двух 64-разрядных неотрицательных чисел в командах для i80386 и выше.

(Умножение целых чисел со знаком =”INTEGER MULTIPLY”) Семантика команды: операция умножения двух целочисленных двоичных значений со знаком.

Алгоритм работы: Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом (1) требует явного указания местоположения только сомножителя1, который может быть расположен в ячейке памяти или регистре. Местоположение сомножителя2 фиксировано и зависит от размера сомножителя1:

• если операнд, указанный в команде, — байт, то сомножитель2 располагается в AL;

• если операнд, указанный в команде, — слово, то сомножитель2 располагается в AX;

• если операнд, указанный в команде, — двойное слово, то сомножитель2 располагается в EAX.

Пример:

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

• при умножении байтов результат помещается в AX (рис. 4);

• при умножении слов результат помещается в пару DX:AX (рис. 5);

• при умножении двойных слов результат помещается в пару EDX:EAX (рис. 6).

Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:

• в команде с двумя операндами (2) первый операнд определяет местоположение первого множителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;

< множитель2> в команде с тремя операндами (3) первый операнд определяет местоположение результата, второй операнд — местоположение первого множителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово.

< результат> Реально по команде с с двумя операндами (2) будет сгенерирована команда умножения с тремя операндами (3), где вместо операнда результат будет подставлен множитель Команда IMUL устанавливает в ноль флаги OF и CF, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов OF и CF в ноль являются следующие условия:

• для однооперандной формы команды IMUL регистры AX/DX/EDX являются знаковыми расширениями регистров AL/AX/EAX;

• для двухоперандной формы команды IMUL для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;

• то же для трехоперандной команды умножения.

Применение:

Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора. Так, для микропроцессора i возможна только однооперандная форма команды, для последующих моделей микропроцессоров дополнительно можно использовать двух-и трехоперандные формы этой команды.

MOV BX, ;если результату не хватило размерности операнда1, ;то перейдем на метку M1, где и скорректируем ;ситуацию:

JC M 9.2.4. Недокументированные способы умножения Команду AAD обычно используют для подготовки двух неупакованных BCD-цифр (в регистре AH находится число десятков, в регистре AL — число единиц) для операции деления, которая вернет результат в неупакованном виде (глава «Двоично-десятичные числа»). Это выполняется установкой регистра AL равным AL+(10*AH) и сбросом AH в 0. После этого в регистре AX находится двоичный эквивалент исходного неупакованного числа из двух цифр. Код команды AAD равен 0D50Ah, попробуйте вставить в вашу программу команду DB 0D5h,20h и Вы обнаружите, что после такого кода содержимое регистра AL станет равным AL+(32*AH).

Недостаток такого умножения — результат не может быть больше 255, так как содержимое регистра AH будет обнуляться. Запись команды в виде DB… обусловлена тем, что все трансляторы ориентированы на стандартную форму команд символьной коррекции для умножения, а это значит, в виде второго байта команды в случае использования мнемонического кода AAD будет подставляться 0Ah. Команду AAD можно использовать если Вам необходимо разделить содержимое регистра AH на 10. Использование недокументированных команд — неплохой способ запутать хакера или вражеский дизассемблер.

Пример: MOV AX,3705h DB 0D4h,20h ;умножаем 37h на 20h и складываем с ;AX =00E5h 55*32+05=1765=06E5h E5h Для реализации умножения можно также использовать табличное преобразование (команда XLAT), либо алгоритм Бута (Booth). Рассмотрим этот алгоритм на примере. Пусть множимое равно -41. В форме двоичного дополнительного числа –4110=11111111110101112. Если переписать это число в виде сумм и разностей целых, содержащих только единицы, получим следующее двоичное представление числа –41:

Так как 111112= 25—1, то можем записать Сократив на – 1 получим:

Так как у нас 16-разрядное число — пренебрегаем 17-разрядным значением 216, тогда будем иметь -4110=11111111110101112= –26+25–24+23– Теперь произведение –41m можно представить как: –26m+25m –24m +23m – 20m.

Произведение числа на 2n эквивалентно сдвигу этого числа на n разрядов влево. При использовании алгоритма Бута операции сложения и вычитания требуются только когда во множимом не совпадают значения в соседних разрядах, то есть, имеется переход от 0 к 1 или от 1 к 0. Перемножение чисел с помощью алгоритма Бута может оказаться быстрее, чем использование команд MUL или IMUL.

Деление в двоичной арифметике получают из сочетания операций сдвигов и вычитания. Результат деления для микропроцессора — это всегда два числа — частное и остаток. Как и умножение, деление чисел без знака и со знаком также реализуется двумя командами DIV и IDIV, в остальном же эти команды действуют одинаково.

(Деление беззнаковое = ”DIVIDE UNSIGNED”) Синтаксис команды: DIV Семантика команды: выполнение операции деления двух двоичных беззнаковых значений.

Алгоритм работы: Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:

если делитель размером в байт, то делимое должно быть расположено в регистре AX. После операции частное помещается в AL, а остаток — • если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX, причем младшая часть делимого находится в AX. После операции частное помещается в AX, а остаток • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX, причем младшая часть делимого находится в EAX. После операции частное помещается в EAX, а остаток — в EDX.

Применение:

Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре EAX/AX/AL.

MOV AX, MOV BL, (Деление целочисленное со знаком = “INTEGER DIVIDE”) Синтаксис команды: IDIV Семантика команды: операция деления двух двоичных значений со знаком.

Алгоритм работы: Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:

• если делитель размером в байт, то делимое должно быть расположено в регистре AX. После операции частное помещается в AL, а остаток — в AH;

• если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX, причем младшая часть делимого находится в AX. После операции частное помещается в AX, а остаток • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX, причем младшая часть делимого находится в EAX. После операции частное помещается в Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя.

Применение:

Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре EAX/AX/AL.

MOV AX,1046 ;делимое IDIV BH ;частное в AL=523, это больше ;«переполнение» и компьютер прекратит выполнение ;программы В операциях деления предполагается, что частное значительно меньше, чем делимое. Деление на 1 например, может также вызвать переполнение, так как частное равно делителю, поэтому рекомендуется следующее правило: если делитель — байт, то его значение должно быть меньше чем левый байт [AH] делителя; если делитель — слово, то его значение должно быть меньше чем левое слово [DX] делителя. Например:

В обоих случаях частное превышает возможный размер. Для того чтобы избежать подобных ситуаций, полезно вставлять перед командами DIV и IDIV соответствующую проверку. В случае деления слова на байт предположим, что DIVBYTE — однобайтовый делитель, а делимое находится уже в регистре AX. В случае деления двойного слова на слово предположим, что DIVWORD — двухбайтовый делитель, а делимое находится в регистровой паре DX:AX.

CMP AH,DIVBYTE CMP DX,DIVWORD

DIV DIVBYTE DIV DIVWORD

Для команды IDIV данная логика должна учитывать тот факт, что либо делимое, либо делитель могут быть отрицательными, а так как сравниваются абсолютные значения, то необходимо использовать команду NEG для временного перевода отрицательного значения в положительное.

9.3.3. Недокументированные способы деления Команду AAM обычно используют для коррекции в регистре AX результата умножения (MUL) двух неупакованных BCD-цифр. AAM осуществляет деление содержимого регистра AL на 10 и загружает частное в регистр AH, а остаток — в регистр AL (глава «Двоично-десятичные числа»). Код команды AAM равен 0D40Ah, попробуйте вставить в вашу программу команду db 0D4h,07 и Вы обнаружите, что после такого кода содержимое регистра AL будет поделено на 7, в регистр AH загружено частное, а остаток — в регистре AL. Недостаток такого деления — делимое не может быть больше 255, так как содержимое регистра AH будет игнорироваться. Запись команды в виде db… обусловлена тем, что все трансляторы ориентированы на стандартную форму команд символьной коррекции для деления, а это значит, в виде второго байта команды в случае использования мнемонического кода AAM будет подставляться 0Ah.

Пример: MOV AX, ;в AH частное 37/7=05 в AL остаток 37—7*5= Для реализации деления можно использовать табличное преобразование (команда XLAT), Частное от деления можно представить, как количество вычитаний делителя из делимого до тех пор, пока делимое сохраняет знак. Это дало возможность организовать деление путем повторения последовательности вычитаний с проверкой знака делимого. Если произошла перемена знака, то нужно уменьшить счетчик числа вычитаний на единицу, а делимое и делитель сложить. Теперь делимое будет равно остатку, а счетчик числа вычитаний равен частному.

Можно использовать быстрый алгоритм деления без восстановления. При этом из делимого вычитается делитель, умноженный на степень двойки. Произведение числа на 2n эквивалентно сдвигу этого числа на n разрядов влево. Если знак результата положительный, то нужно прибавить 2n к частному, если знак результата отрицательный — частное не увеличивается. Когда знак результата меняется на отрицательный, вычитание заменяется сложением. Так повторяется при уменьшающихся степенях двойки до тех пор, пока не будет достигнута степень равная нулю. Остатком считается последний положительный результат.

Для иллюстрации разделим 125 на 11. Делитель укладывается в байт ( Семантика команды: преобразование элементов со знаком меньшей размерности в эквивалентные им элементы со знаком большей размерности.

Алгоритм работы:

• считать содержимое операнда2;

• записать содержимое операнда2 в операнд1, начиная с младших разрядов операнда2;

• распространить значение знакового разряда на свободные старшие разряды операнда1.

Применение:

Команду MOVSX обычно используют для получения эквивалентного, но большего по размеру операнда со знаком. Это может понадобиться для приведения размера операнда к нужному значению с целью обеспечения работы следующих команд программы:

MOV AL,0FFh MOVSX BX,AL ;BX=0FFFFh Контрольные вопросы и упражнения:

Имеются следующие данные:

DATAX DW 0148h DATAY DW 0237h Напишите программы для сложения: а) слова DATAX со словом DATAY; б) двойного слова, начинающегося по адресу DATAX со двойным словом, начинающегося по адресу DATAY.

2. Объясните действие следующих команд 3. Напишите программы для умножения: а) слова DATAX со словом DATAY; б) двойного слова, начинающегося по адресу DATAX со двойным словом, начинающегося по адресу DATAY используя команды для микропроцессора i80286 (подсказка: необходимо представить произведение (a216+b)(c216+d) как ac232+(ad+bc)216+bd и использовать команды MUL, ADD и ADC).

4. Напишите программы для деления: а) слова DATAX на 23; б) двойного слова, начинающегося по адресу DATAX на слово DATAY.

5. Какой делитель кроме нуля вызывает ошибку переполнения?

6. Пусть регистр AL=0B4h и регистр BL=11h. Почему после команды IMUL BL AX=0FAF4h, а после команды MUL BL — AX=0BF4h?

7. Пусть регистр [AX]=0400h и регистр [BL]=0B4h. Почему после команды IDIV BL регистр [AX]=24F3h, а после команды DIV BL — [AX]=7C05h?

8. Напишите программу для беззнакового деления утроенного слова на слово используя команды для микропроцессора i80286 (подсказка:

необходимо представить делимое как (a232+b216+c), а делитель как d;

первое деление a на d даст частное r1 и остаток q1; второе деление (q1216+b) на d — частное r2 и остаток q2; третье деление (q2216+c) на d — частное r3 и остаток q3; результатом будет частное (r1232+r2216+r3) и остаток q3).

9. Напишите программу для беззнакового деления числа из n слов на однословное число.

10. Алгоритм беззнакового деления с двойной точностью числа (c2 +d) на число (a216+b) заключается в следующем. Вычислить такие q и r, что c=ar+q (r частное от деления c на a, а q остаток). Но равенство c=ar+q q216+drb считается остатком первоначального деления; если она отрицательна, следует производить повторяющийся декремент r до тех пор, пока она не станет положительной. Напишите программу реализующую данный алгоритм.

11. Напишите программу, которая определит какое умножение более быстрое: умножение командой MUL, умножение из сдвигов и сложений или умножение по алгоритму Бута (подсказка: получите системное время, в цикле проведите 10000 умножений, опять получите системное время). Компьютер содержит таймер, который выдает время с точностью до 1/100 секунды. Функция 2Ch прерывания 21h выдает время, а функция 2Dh устанавливает его. В обоих случаях регистр CH содержит часы (от 0 до 23), CL — минуты (от 0 до 59), DH — секунды (от 0 до 59) и DL — сотые доли секунд (от 0 до 99) ;получение системного времени MOV COUT_BEGIN,DL ;получаем сотые доли секунды из DL 14. Напишите программу, которая определит какое деление более быстрое:

деление командой DIV, умножение из сдвигов и вычитаний или по алгоритму деления без восстановления.

15. Напишите программы, которые выполняют следующие действия:

а)ZW+(XZ); б)ZW(X+6)(Y+9); в)Z(WX)/(Y+6) Rостаток;

г)Z((WX)/10Y) Глава 10. Дополнительные арифметические команды Конструкторы микропроцессоров от i8080 до i80386 не смогли реализовать все математические функции на одном кристалле, так как это оказалось слишком сложным. Вместо этого они создали набор функций более низкого уровня, из которых можно программно построить любые математические функции. Вот так программист должен был вычислять, используя только операции сложения, вычитания и умножения, функции синуса, экспоненты или логарифма:

ln x = (x —1) — (x—1) + (x—1) — … + (—1)n+1 (x—1) До микропроцессора i80486 команды математического сопроцессора рассматривались как расширение набора команд микропроцессора. Начиная с микропроцессора i80486 произошло объединение на одном кристалле математического сопроцессора с основным процессором. Поэтому хватит вычислять значения синуса рядами, а воспользуемся командами специально предназначенными для этого. Каждый сопроцессор имеет собственный набор команд и средства для выполнения операций с плавающей запятой, таких как, экспоненциальные, логарифмические и тригонометрические функции. Сопроцессор содержит восемь 80-битовых регистров (от ST(0) до ST(7)) с плавающей запятой, которые могут представлять числовые значения до 10400. Регистры сопроцессора, в отличие от регистров процессора, не независимы, а образуют стек.

Использование команд сопроцессора в антихакерских программах предпочтительно хотя бы потому, что хакерские программы ориентированы на слежение за основным процессором и ваши действия остаются в тени.

Основной процессор передает числовые данные в сопроцессор, который осуществляет необходимые вычисления и возвращает результат.

Для ассемблирования команд сопроцессора необходимо добавлять параметр для моделей микропроцессора младше i80486 —.8087,.287,. Названия всех команд сопроцессора начинаются с буквы F. Для разных типов данных существует разная мнемоника:

буква означает I целое число;

буква — B упакованное десятичное число;

отсутствие буквы — действительное число;

буква P в конце команды — выборка (восстановление) из стека;

буквы PP в конце команды — двойная выборка из стека;

буква R в конце команды или перед P — обратное число.

Для загрузки числа в сопроцессор используется команда FLD (Floating LoaD — плавающая загрузка). Варианты этой команды:

а) FILD загрузка в сопроцессор целого числа;

б) FBLD загрузка в сопроцессор десятичного упакованного числа;

в) FLD загрузка в сопроцессор действительного числа.

Команда помещается число в стек, увеличивая указатель стека на 1.

Примеры:

Команда FLD ST(0) дублирует вершину стека. После нее два верхних элемента имеют одинаковое значение.

Команда FLD ST(3) помещает копию четвертого элемента в стек. Число, которое имело адрес ST(3), имеет теперь адрес ST(4). Но если специально не указывать номер регистра сопроцессора, то по команде FLD загружаемое в сопроцессор число попадает на вершину стека, при этом числа уже хранящиеся в других регистрах, смещаются на шаг от вершины. Стек сопроцессора может хранить только 8 чисел — столько, сколько в нем регистров. Попытка загрузить в стек девятое число, приведет к потере числа, далее всего отстоящего от вершины. Но и вершина при этом не воспримет то, что в нее загружается, и будет содержать некое значение, которое с точки зрения сопроцессора не может быть числом. Загрузим сопроцессор числами 1, 2, 3, …, 9. первым в сопроцессоре оказалось число 1.0. Оно заняло вершину стека, то есть регистр ST0. Далее на вершину стека было загружено число 2.0, а число 1.0 спустилось ниже — в регистр ST1. Затем на вершине стека побывали числа 3.0, 4.0, 5.0, 6.0, 7.0, 8.0. Число 1.0, попавшее в стек первым, спускалось все ниже и оказалось, наконец, в регистре ST7, когда на его вершине было число 8.0. Но при попытке поместить в стек девятое число случилась авария: число, 1.0 загруженное первым, покинуло стек, а на вершине оказалось неверное значение, которое отладчик пометил словом bed (плохой). Кроме «плохих» в стеке могут быть нормальные числа, помеченные атрибутом valid (правильный). Таковы все числа, видимые в отладчике, кроме первого. У регистров ST0-ST7 может быть еще один атрибут empty (пустой). Так отладчик помечает регистр, в который можно загрузить число. Если регистр занят, то его нужно перед использованием освободить. Делается это командой ffree. Чтобы, например, освободить третий регистр, нужна команда ffreee ST(3). Есть еще одна команда finit, которая разом освобождает сразу все регистры и чаще всего используется для приведения стека в «исходное» состояние.

Далее будут перечислены команды для работы с вещественными числами, а в скобках другие варианты этих команд.

Команда сохранения вещественного числа FST (FIST, FSTP, Команда FST извлекает число из вершины стека и записывает его в требуемую ячейку памяти. Команда FSTP выполняет операцию записи данных из сопроцессора в память и извлекает число из стека.

Команда обмена значения регистра стека ST(1) со значением Команда FXCH меняет местами содержимое вершины стека с содержимым другого регистра стека.

Команда сложения вещественных чисел FADD (FADDP, FIADD) Команда вычитания вещественных чисел FSUB (FSBP, FISUB, Команда умножения вещественных чисел FMUL (FMULP, FIMUL) Команда деления вещественных чисел FDIV (FDIVP, FIDIV, FDIVR, Операция Действие FSUB результат результат -источник FSUBR результат источник -результат FMUL FDIV результат результат / источник FDIVR результат источник / результат 10.3.1 Команда сравнения вещественных чисел FCOM (FCOMP, В операции всегда участвует вершина стека и явно указанный регистр или операнд в памяти. Сопроцессор имеет свой собственный регистр флагов. Результат сравнения — установка или сброс битов состояния C3 и C0. Флаги состояния C3 и C0 в сопроцессоре расположены на тех же местах что и флаги нуля (FZ) и переноса (FC) микропроцессора. Перед тем как опросить флаги состояния, программа должна считать слово состояния и записать его в память. Обычно флаги состояния загружают в регистр AH, а затем для легкости проверки условия, командой SAHF — в регистр флагов микропроцессора. Можно также использовать для этого команду POPF.

1 1 ST и источник не могут быть сравнены Команда FCOMPP не имеет операндов. Она всегда сравнивает два верхних элемента стека, после сравнения они оба исчезают из стека.

10.3.2 Команда сравнения без учета порядка вещественных чисел 10.3.3 Команда проверки вершины стека на содержание +0.0. FTST Команда сравнения содержимого вершины стека с нулем.

10.3.4 Команда проверки вершины стека FXAM Команда FXAM устанавливает флаги регистра состояния от C3 до C0, показывая какое число находится на вершине стека.

10.4. Тригонометрические и прочие функции 10.4.1 Команда извлечения квадратного корня FSQRT Пример: найдем корни квадратного уравнения, заданного формулой:

Из школьного курса математики известно, что решением этого уравнения B DW ?

C DW ?

STATUS DW ?

FILD B ;загрузить число в регистр стека ST(0)=B FMUL ST(0),ST(0) ;перемножить числа ST(1)=B FILD A ;загрузить число в регистр стека, ST(0)=A FIMUL FOUR ;умножить число в ST(0) на 4, ST(0)=4A FIMUL C ;умножить число в ST(0) на C, ST(0)=4A C FSUBRP ST(1),ST(0) ;вычитаем обратные целые числа FTST ;проверяем дискриминант на отрицательность FSTSW STATUS;записываем в память управляющий регистр FWAIT; сопроцессора и переводим сопроцессор в режим MOV AH,BYTE PTR STATUS+1;ожидания. Читаем в AH SAHF; помещаем содержимое регистра AH в регистр ;флагов JB IMAGINARY;если корни мнимые переходим FSQRT ;извлекаем квадратный корень в ST(0) FLD ST(0) ;загрузить число из ST(0) в ST(1), FCHS ;изменяем знак, ST(0)=SQRT(D) FIADD B;складываем целые числа ST(0)=BSQRT(D) FCHS FXCH ST(1);обмениваемся данными между ST(0) и ST(1) FIADD B;складываем целые числа ST(0)=B+SQRT(D) FCHS FIDIV A;делим на целое число ST(0)= (B+SQRT(D))/A FIDIV TWO;еще раз делим на 2, ST(0)=(B+SQRT(D))/2A FST ROOT1;сохраняем в памяти 1-ый результат из ST(0) FIDIV A;делим на целое число ST(0)=(B+SQRT(D))/A FIDIV TWO ;делим на 2 ST(0)=(B+SQRT(D))/2A FST ROOT2 ;сохраняем в памяти 2-ой результат Состояние регистров ST0, ST1 после команд сопроцессора Эта команда необходима для возведения 2 в степень, равную целому числу 10.4.3 Команда вычисления 2 в степени X минус 1 F2XM Эта функция выполняет возведение в степень; она возводит число 2 в степень, указанную в вершине стека. Исходное число должно находиться в диапазоне 0 ST 0,5, и чтобы возвести в степень, большую 0,5, эту команду нужно использовать вместе с командой FSCALE. С помощью команд FLD, загружающих специальные константы, программа может возвести в степень и числа отличные от 2, для этого можно воспользоваться формулами: 10X=2X log210, eX=2X log2e, YX=2X log2Y.

10.4.5.1 Команда вычисления косинуса для ST(0) FCOS 10.4.5.2 Команда вычисления синуса для ST(0) FSIN 10.4.5.3 Команда вычисления синуса и косинуса для ST(0) FSINCOS 10.4.5.4 Команда вычисления частичного тангенса FPTAN Исходное число — угол, выраженный в радианах, значение которого должно быть в интервале 0 < угол < /4, помещается в вершину стека.

Уменьшить угол до правильного значения можно с помощью команды FPREM. Результатом является отношение Y/X, которое равно тангенсу угла; Y замещает вершину стека, а затем в стек помещается X.

10.4.5.5 Команда вычисления частичного арктангенса FPATAN Эта функция дополняет предыдущую, FPTAN. Команда FPATAN вычисляет угол в соответствии с отношением чисел ST(1) и ST(0). Она извлекает из стека число X, а затем записывает результирующий угол вместо числа Y в качестве новой вершины стека. Исходные значения должны подчиняться неравенству 00) S;

Где S, S1 и S2 какие-то операторы, а X — знаковая переменная, скрываются следующие ассемблерные команды

JMP FIN JMP BEG

FIN:

Если Вам необходимо по каким-то причинам скрыть условный переход, то помните, что конструкция b*x + NOT(b)*y эквивалентна условному выражению if (b==TRUE) then x else y.

Допустим вам надо в вашей программе решить уравнение (A+B)*C=D. Хорошо если Вы знаете, что A=1, B=5, C=7. D посчитать — нет проблем. А если эти числа получаются после других восьмиэтажных уравнений? Подойдем к решению задачи творчески (для простоты считаем что размерность A, B и C -байт):

Допустим, надо посчитать всю эту бодягу 10 раз. Да с разными значениями A, B и C. Как? Десять раз переписать? С ума сойти. И тут помогает такая классная вещь как ЦИКЛ. Цикл — это задание исполнителю повторить многократно одну или несколько указанных в теле цикла команд.

Существует целых два основных варианта оператора повторения, причем каждый для своих целей:

1) повторение, управляемое вычисляемым условием, и 2) повторение, управляемое явным счетчиком или списком значений.

В первую группу входят два оператора:

Среди циклов на практике часто встречаются циклы с заранее известным числом повторений (for-циклы), поэтому в систему команд многих ЭВМ обычно включают дополнительные команды, упрощающие реализацию подобных циклов.

Синтаксис команды: LOOP Пусть некоторую группу команд (тело цикла) надо повторить N раз (N>0). Когда-то на языке ассемблера этот цикл реализовали по такой схеме:

JNE LOOP ;если CX не равен 0 идти к метке LOOP Создатели языка ассемблера обратили внимание, что в конце таких циклов всегда применяется одна и та же тройка команд (DEC CX;

CMP CX,0; JNE LOOP). Учитывая это, в систему команд была введена специальная команда LOOP («петля»), которая объединяет в себе действие всех этих команд.

Действие команды LOOP немного сходно с циклом FOR-NEXT в Бейсике или соответствует паре инструкций REAPET-UNTIL, где инструкция REAPET означает начало блока инструкций цикла. Как и для цикла FOR-NEXT в Бейсике, мы должны сообщить LOOP о том, сколько раз запускать цикл. Мы делаем это, помещая счетчик повторений в регистр CX /ECX. В каждом цикле микропроцессор вычитает единицу из CX /ECX, и когда CX /ECX становится равным нулю, LOOP заканчивает цикл. С помощью команды LOOP наш цикл запишется следующим образом:

L: mov al,A Получилось короче, и работает команда LOOP быстрее трех команд.

Необходимо учитывать ряд особенностей команды LOOP:

1. команда LOOP требует, чтобы в качестве счетчика цикла обязательно использовался регистр CX/ECX;

2. начальное значение регистру CX/ECX должно быть присвоено до начала цикла;

3. так как команда LOOP ставится в конце цикла, тело цикла хотя бы раз должно выполниться;

если по какой-либо причине перед началом цикла регистр CX/ECX равен 0, то тело цикла все равно будет выполнено, из содержимого регистра CX/ECX будет отнята 1 и уже после этого регистр CX/ECX будет проверен на равенство 0. Что, по вашему, окажется в регистре CX/ECX? Правильно, содержимое регистра CX/ECX равно — (0FFFFh/0FFFFFFFFh) и цикл, вместо того чтобы остановиться, будет запущен еще 65535 раз, если мы используем регистр CX, или миллиона раз (!), если использовали регистр ECX, — это один из источников ошибок. Поэтому, если возможен вариант, что число повторений может быть и нулевым, то при CX /ECX =0 надо делать обход цикла:

L1: … Именно ради осуществления таких обходов и были введены команды условного перехода JCXZ/JECXZ;

5. как и команды условного перехода, команда LOOP реализует только короткий переход, поэтому расстояние от LOOP до начала цикла не должно превышать 127 байтов.

Если вам необходим бесконечный цикл — воспользуйтесь командой JMP, а если не знаете сколько раз придется запускать цикл используйте команды условного перехода.

11.3.1.2. Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ (Цикл по счетчику пока равно = “LOOP if Equal”) (Цикл по счетчику пока не равно = “LOOP if Not Equal”) (Цикл по счетчику пока не ноль = “LOOP if Not Zero”) Синтаксис команд:

LOOPNE

Эти команды похожи на команду LOOP, то есть заставляют цикл повториться столько раз, сколько указано в регистре CX/ECX, однако они допускают и досрочный выход из цикла.

Команда LOOPE используется для организации цикла с известным числом повторений, из которого возможен досрочный выход. До начала цикла в регистр CX /ECX записывается число повторений. Команда LOOPE ставится в конец цикла, а перед ней помещается команда, меняющая флаг ZF — обычно это команда сравнения CMP. Команда LOOPE заставляет цикл повторяться CX/ECX раз, но только если команда CMP фиксирует неравенство сравниваемых величин — происходит выход из цикла.

По какой именно причине произошел выход из цикла (по ZF=0 или CX/ECX=0), надо проверять после цикла. Чаще всего команда LOOPE используется для поиска первого элемента некоторой последовательности, отличного от заданной величины. Команда LOOPZ — синоним команды LOOPE.

Команда LOOPNE аналогична команде LOOPE, но выход из цикла осуществляется при ZF=1, если предыдущая команде LOOPNE команда CMP зафиксировала равенство или по CX/ECX=0. Команда LOOPNE обычно используется для поиска в некоторой последовательности первого элемента, имеющего заданную величину. Команда LOOPNZ — синоним команды LOOPNE.

Пусть ASCII_STR является переменной, ассоциируемой с началом цепочки из L символов, и в цепочке необходимо найти символ пробела.

Цикл заканчивается, когда обнаружен пробел или когда просмотрена вся цепочка. Если пробел не найден, осуществляется переход к метке NOT_FOUND:

CMP AL, ASCII_STR[SI] ;проверить на пробел Контрольные вопросы и упражнения:

1. Какое максимальное количество байтов могут обойти команды SHORT JMP, LOOP и относительный переход?

2. Предположим, что регистры AX и BX содержат знаковые данные, а CX и DX— беззнаковые. Определите команды (где необходимо) и команды условного перехода для следующих проверок: а) значение в DX больше, чем в CX? б) значение в BX больше, чем в AX? в) CX содержит нуль? г) было ли переполнение? д) значение в BX равно или меньше, чем в AX? е) значение в DX равно или меньше, чем в 3. На какие флаги воздействуют следующие события и какое значение этих флагов? а)произошло переполнение, б)результат отрицательный, в)совпадение, г)обработка в пошаговом режиме, д)нулевой результат, е)передача данных должна быть справа налево.

4. Напишите программу для вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,… (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду LOOP. Выполните ассемблирование, компоновку и с помощью отладчика AFD.EXE трассировку программы.

5. Напишите программу которая проверяет байт STATUS и переходит к ROUTINE_1, если биты 1, 3 или 5 содержат 1. в противном случае она переходит к ROUTINE_2, если оба бита 1 и 3 содержат 1, и к ROUTINE_3, если биты 1 и 3 содержат 0. Во всех остальных случаях программа переходит к ROUTINE_4. считайте что подпрограммы ROUTINE_i имеют длину более 128 байт. Постройте схему программы.

6. Считайте содержимое регистров DX:AX 32-битной величиной и напишите программу, загружающую в регистр BL номер младшего бита, который содержит 1.

7. Напишите программу, которая вычисляет квадратный корень используя алгоритм последовательного приближения. Пусть X — число, из которого необходимо извлечь квадратный корень, а Y — предполагаемое значение его квадратного кореня. Величина Y возводится в квадрат и сравнивается с X. Если Y2 > X, то Y уменьшается, а если Y2 < X, то Y увеличивается. Процедура повторяется, пока Y2 не станет приблизительно равной X. Автор программы должен сам решить, насколько Y2 должно быть близко к X, чтобы можно было прервать цикл.

Оцените время выполнения следующих эквивалентных программных фрагментов:

INC SI INC SI

LOOP NEXT DEC CX

JNE NEXT

JMP SHORT NEXT

Команды сдвига перемещают все биты в поле данных либо вправо, либо влево. Бит, попадающий за пределы операнда, помещается в бит флага переноса CF. Все команды сдвига делятся на логические, арифметические или циклические.

(Сдвиг логический операнда влево = SHIFT LOGICAL LEFT) Семантика команды: логический сдвиг операнда влево.

Алгоритм работы:

• сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса CF;

• одновременно слева в операнд вдвигается нулевой бит;

• указанные выше два действия повторяются количество раз, равное значению второго операнда.

Применение:

Команда SHL используется для сдвига разрядов операнда влево. Ее машинный код идентичен коду SAL, поэтому вся информация, приведенная для SAL, относится и к команде SHL. Команда SHL используется для сдвига разрядов операнда влево. Так же, как и для других сдвигов, значение второго операнда (счетчик сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага OF, значение которого имеет смысл только в операциях сдвига на один разряд:

• если OF=1, то текущее значение флага CF и выдвигаемого слева бита операнда различны;

• если OF=0, то текущее значение флага CF и выдвигаемого слева бита операнда совпадают.

Этот эффект, как Вы помните, обусловлен тем, что флаг OF устанавливается в единицу всякий раз при изменении знакового разряда операнда.

Команду SHL удобно использовать для умножения целочисленных операндов без знака на степени 2. Кстати сказать, это самый быстрый способ умножения:

; умножить содержимое AX на 16 (16=24).

MOV AX, SHL AX, (Сдвиг логический операнда вправо = SHIFT LOGICAL RIGHT) Синтаксис команды: SHR, Семантика команды: логический сдвиг операнда вправо.

Алгоритм работы:

• сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса CF;

• одновременно слева в операнд вдвигается нулевой бит;

• указанные выше два действия повторяются количество раз, равное значению второго операнда.

Применение:

Команда SHR используется для логического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество разрядов. В отличие от других команд сдвига, флаг OF всегда сбрасывается в ноль в операциях сдвига на один разряд.

Команду SHR можно использовать для деления целочисленных операндов без знака на степени 2.

MOV CL, SHR EAX,CL ;(EAX) разделить на 16(16=24) (Сдвиг двойного слова влево = SHIFT LEFT DOUBLE WORD) Синтаксис команды:

Семантика команды: логический сдвиг двойного слова влево.

Алгоритм работы:

• сдвинуть операнд операнд1 влево на количество битов, определяемое операндом количество сдвигов;

одновременно сдвинуть операнд операнд2 влево на количество битов, определяемое операндом количество сдвигов. Важно заметить, что операнд операнд2 только обеспечивает вдвигаемые в операнд операнд1 биты, сам он при этом не изменяется;

• выдвигаемые во время сдвига влево из операнда операнд2 биты вдвигаются в операнд операнд1 с его правого края.

Применение:

Команда SHLD используется для манипуляции битовыми строками длиной до 64 бит. Эту команду удобно использовать для быстрой вставки (или извлечения) битной строки в большую битную строку; при этом, что очень важно, не разрушается контекст (битное окружение) этих подстрок:

;извлечь старшую половину EAX в BX без разрушения EAX MOV CL, SHLD EBX,EAX,CL

PUSH BX

SHL EBX,CL POP BX (Сдвиг двойного слова вправо = SHIFT RIGHT DOUBLE WORD) Синтаксис команды:

Семантика команды: логический сдвиг двойного слова вправо.

Алгоритм работы:

• сдвинуть операнд операнд1 вправо на количество битов, определяемое операндом количество сдвигов;

• одновременно сдвинуть операнд операнд2 вправо на количество битов, определяемое операндом количество сдвигов. Важно заметить, что операнд операнд2 только обеспечивает вдвигаемые в операнд операнд1 биты, сам он при этом не изменяется;

• выдвигаемые вправо во время сдвига из операнда операнд2 биты вдвигаются в операнд операнд1 с его левого конца.

Применение:

Команда SHRD используется для манипуляции битными строками длиной до 64 бит. Эту команду удобно использовать для быстрой вставки (или извлечения) битной строки в большую битную строку, при этом, что очень важно, не разрушается контекст (битное окружение) этих подстрок.

;разделить операнд размером 64 бит на 16 (16=24) MOV EAX,OP_H ;разделить операнд на 16. Так как SHRD OP_L,EAX,4 ;старшая часть операнда реально еще SHR OP_H,4 в соответствие с результатом (Сдвиг арифметический операнда вправо = Shift Arithmetic operand Right) Синтаксис команды: SAR, Семантика команды: арифметический сдвиг операнда вправо.

Алгоритм работы:

• сдвиг всех битов операнда вправо на один разряд, при этом выдвигаемый справа бит становится значением флага переноса CF;

• обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, а значение старшего бита операнда, то есть по мере сдвига вправо освобождающиеся места заполняются значением знакового разряда. По этой причине этот тип сдвига и называется арифметическим;

• указанные выше два действия повторяются количество раз, равное значению второго операнда.

Применение:

Команда SAR используется для арифметического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество разрядов. В отличие от других команд сдвига флаг OF всегда сбрасывается в ноль в операциях сдвига на один разряд.

Команду SAR можно использовать для деления целочисленных операндов со знаком на степени 2:

MOV AX,88 ;(AX) разделить на 4(=22) (Сдвиг арифметический операнда влево =Shift Arithmetic operand Left) Синтаксис команды: SAL, Семантика команды: арифметический сдвиг операнда влево.

Алгоритм работы:

• сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса CF;

• одновременно справа в операнд вдвигается нулевой бит;

• указанные выше два действия повторяются количество раз, равное значению операнда количество сдвигов.

Применение:

Команда SAL используется для сдвига разрядов операнда влево. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов количество разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага OF, значение которого имеет смысл только в операциях сдвига на один разряд:

• если OF=1, то текущее значение флага CF и выдвигаемого слева бита операнда различны;

• если OF=0, то текущее значение флага CF и выдвигаемого слева бита операнда совпадают.

Этот эффект, как Вы помните, обусловлен тем, что флаг CF устанавливается в единицу всякий раз при изменении знакового разряда операнда.

Команду SAL удобно использовать для умножения целочисленных операндов без знака на степени 2. Кстати сказать, это самый быстрый способ такого умножения:

; умножить содержимое AX на 16 (2 в степени 4):

MOV AX, SAL AX, (Циклический сдвиг операнда влево = ROTATE OPERAND LEFT) Семантика команды: операция циклического сдвига операнда влево.

Алгоритм работы:

• сдвиг всех битов операнда влево на один разряд, при этом старший бит операнда вдвигается в операнд справа и становится значением младшего бита операнда;

• одновременно выдвигаемый бит становится значением флага переноса CF;

• указанные выше два действия повторяются количество раз, равное значению операнда количество сдвигов.

Применение:



Pages:     | 1 | 2 || 4 | 5 |


Похожие работы:

«Государственное автономное образовательное учреждение среднего профессионального образования РБ Бурятский республиканский многопрофильный техникум инновационных технологий Иванов В. А. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО ВЫПОЛНЕНИЮ КОНТРОЛЬНОЙ РАБОТЫ ПО ДИСЦИПЛИНЕ Метрология, стандартизация, сертификация МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ УТВЕРЖДАЮ Заместитель директора по УР Л. М. Банщикова г. Рассмотрено на заседании ЦКЗО Рассмотрено и одобрено для Руководитель ЗО_ внутреннего...»

«НЕГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ ИНСТИТУТ ГОСУДАРСТВЕННОГО УПРАВЛЕНИЯ, ПРАВА И ИННОВАЦИОННЫХ ТЕХНОЛОГИЙ ФАКУЛЬТЕТ ЖУРНАЛИСТИКИ И СРЕДСТВ МАССОВЫХ КОММУНИКАЦИЙ Кафедра социологии и политологии Утверждено решением УМО НОУ ВПО ИГУПИТ от _2013 г. протокол № ИТОГОВЫЙ ГОСУДАРСТВЕННЫЙ ЭКЗАМЕН Методические указания для студентов очной и очно-заочной форм обучения специальность 030201 – Политология “Согласовано” Проректор по учебной работе Г.А....»

«Список электронных образовательных ресурсов библиотеки БОУ ВО Вологодский многопрофильный лицей. Универсальные энциклопедии Ready Reference:Сокращенное издание 32-томной Британской 1. Britannica 2004 энциклопедии.-М.: Новый диск,2003. 2. Большая Советская энциклопедия: На 3 дисках.-М.: Большая Рос. энцикл.,2003.-(Золотой Фонд российских энциклопедий). 3. Большая энциклопедия Кирилла и Мефодия. 2004:10 CD-ROM For Windows.- 8- е изд.,перераб.и доп.-М.: Кирилл и Мефодий. 2004. 4. Брокгауз и Эфрон:...»

«Академия управления при Президенте Кыргызской Республики Международная неправительственная организация Tiri Международная неправительственная организация Tiri ПРОГРАММА Pro–Poor Integrity ПОВЫШЕНИЕ ДОБРОСОВЕСТНОСТИ УПРАВЛЕНИЯ МОДУЛЬНАЯ ПРОГРАММА ПО ДОБРОСОВЕСТНОМУ УПРАВЛЕНИЮ Учебный модуль 9. Руководство по написанию учебных конкретных ситуаций по добросовестному управлению и их использованию в процессе обучения государственных и муниципальных служащих (Практическое учебно-методическое пособие...»

«Таможенное право: учебное пособие, 2007, В. Ю Жуковец, 5902404762, 9785902404767, ООО Изд-во Элит, 2007 Опубликовано: 18th April 2010 Таможенное право: учебное пособие СКАЧАТЬ http://bit.ly/1pX6r3N Таможенное право: курс лекций, Николай Николаевич Косаренко, 2010, Law, 223 страниц. Компактная подача материала и доступное изложение наиболее сложных вопросов позволяет студентам сэкономить время и максимально быстро и качественно подготовиться к семинарам. Финансовая политика советской власти,...»

«Министерство образования и науки Украины Донецкий национальный технический университет Кафедра вычислительной математики и программирования МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО ОФОРМЛЕНИЮ ПОЯСНИТЕЛЬНЫХ ЗАПИСОК В ТЕКСТОВЫХ ПРОЦЕССОРАХ Донецк, 2014 Министерство образования и науки Украины Донецкий национальный технический университет Кафедра вычислительной математики и программирования МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО ОФОРМЛЕНИЮ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ К КУРСОВОЙ РАБОТЕ Рассмотрено на заседании кафедры...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ФГБОУ ВПО Уральский государственный лесотехнический университет Кафедра менеджмента и ВЭД предприятия Одобрена: Утверждаю: кафедрой менеджмента и ВЭД предприятия протокол № 1 от 2 сентября 2013 г. Декан ФЭУ В.П. Часовских Зав. Кафедрой _В.П. Часовских методической комиссией ФЭУ Протокол № 1 от 9 сентября 2013 г. Председатель НМС ФЭУ_ Е.Н. Щепеткин Программа учебной дисциплины Б3.В5 УПРАВЛЕНИЕ КАЧЕСТВОМ Направление 080200.62– менеджмент Трудоемкость- 4...»

«Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования Рязанский государственный университет имени С.А. Есенина Утверждено на заседании кафедры экологии и природопользования Протокол № 4 от 29 декабря 2008 г. Зав. кафедрой, д-р с.-х. наук, проф. Е.С. Иванов Экология человека Программа дисциплины и учебно-методические рекомендации Для специальности 013100 — Экология Факультет естественно-географический (отделение экологии) Курс 4,...»

«УЧЕБНИКИ 1. *Грачев А.В., Погожев В.А., Салецкий А.М., Боков П.Ю. Физика 10: Учебник для учащихся общеобразовательных учреждений. Гриф Рекомендовано Министерством образования и науки Российской Федерации. Москва, изд. центр Вентана-Граф, 2011. 27 печ. л. Тир.4000 экз. 2. *Грачев А.В., Погожев В.А., Селиверстов А.В. Физика 7. Учебник для учащихся общеобразовательных учреждений. Гриф Рекомендовано Министерством образования и науки Российской Федерации. Второе исправленное издание. М. Изд. центр...»

«Мир издательств РЕАЛИЗАЦИЯ ТРЕБОВАНИЙ ФГОС В УЧЕБНИКАХ БИОЛОГИИ ИЗДАТЕЛЬСТВА ДРОФА З авершённые линии учебно-методических комплексов по биологии, выпускаемые издательством ДРОФА, отличаются по структуре изложения материала и степени его сложности, что даёт педагогам возможность выбора учебников в зависимости от типа школы и уровня подготовки класса. Современный методический аппарат и актуальное содержание позволяют достигать личностных, метапредметных и предметных результатов образования. Об...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования ШУЙСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра спортивных дисциплин Учебно-методический комплекс ПО ДИСЦИПЛИНЕ СПОРТИВНАЯ МЕТРОЛОГИЯ для специальности050720.65 - Физическая культура со специализацией Физическое воспитание в дошкольных учреждениях Составитель: Хромцов Н.Е., кандидат педагогических наук, доцент Шуя, 2010...»

«АНО ВПО ЦС РФ РОССИЙСКИЙ УНИВЕРСИТЕТ КООПЕРАЦИИ Л.Б. ЛАРИНА А.В. БРИЛОН МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО НАПИСАНИЮ И ЗАЩИТЕ ВЫПУСКНЫХ КВАЛИФИКАЦИОННЫХ РАБОТ специальность 080107 Налоги и налогообложение Москва 2008 УДК 336.2 ББК 65.9(2)261.413я73 Л 25 Ларина Л.Б., Брилон А.В. Методические рекомендации по написанию и защите выпускных квалификационных работ. – М.: Российский университет кооперации, 2008. – 34 с. Методические рекомендации по написанию и защите выпускных квалификационных работ...»

«1 МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ ГОСУДАРСТВЕННАЯ СЛУЖБА ГРАЖДАНСКОЙ АВИАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ Кафедра радиотехнических устройств Е.Е. Нечаев АНТЕННЫ И УСТРОЙСТВА СВЧ Методические указания по изучению дисциплины для студентов I V курса специальности 201300 заочного обучения Москва - ББК ОФ2. М Рецензент: к. т. н, доцент Д.Н.Яманов Нечаев...»

«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА М. И. ГЕРАСЬКИН МАТЕМАТИЧЕСКАЯ ЭКОНОМИКА: ТЕОРИЯ ПРОИЗВОДСТВА И ПОТРЕБИТЕЛЬСКОГО ВЫБОРА САМАРА 2004 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА М. И. ГЕРАСЬКИН МАТЕМАТИЧЕСКАЯ ЭКОНОМИКА: ТЕОРИЯ ПРОИЗВОДСТВА И ПОТРЕБИТЕЛЬСКОГО ВЫБОРА Учебное пособие (для студентов заочного обучения) Второе издание...»

«Федеральное агентство морского и речного транспорта Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ МОРСКОГО И РЕЧНОГО ФЛОТА имени адмирала С.О. МАКАРОВА КАФЕДРА ТЕПЛОТЕХНИКИ, СУДОВЫХ КОТЛОВ И ВСПОМОГАТЕЛЬНЫХ УСТАНОВОК Б.С. Карандашов, Е.А. Бугаев АВТОМАТИЗИРОВАННОЕ ТОПОЧНОЕ УСТРОЙСТВО ОЙЛОН RP-52 YR Учебное пособие Санкт-Петербург Издательство ГУМРФ им. адм. С.О. Макарова УДК 621.181.002. К Карандашов, Б.С.,...»

«ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Осташков А.В. МАРКЕТИНГ Учебное пособие ПЕНЗА 2005 Основы маркетинга Понятие и причины возникновения маркетинга Основные категории маркетинга Концепции маркетинга • этапы развития маркетинга • концепция совершенствования производства • концепция совершенствования товара • концепция интенсификации коммерческих усилий • концепция маркетинга • социально-этический маркетинг Сравнение концепций маркетинга и их реализация в...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ МОСКОВСКОЙ ОБЛАСТИ Государственное образовательное учреждение высшего профессионального образования МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ОБЛАСТНОЙ УНИВЕРСИТЕТ (МГОУ) Историко-филологический институт Кафедра методики преподавания русского языка и литературы РАССМОТРЕНО И ОДОБРЕНО решением учебно-методического совета от 20 мая 2013 г., протокол № 8 МЕТОДИЧЕСКИЕ УКАЗАНИЯ к выполнению выпускной квалификационной работы (бакалаврской работы и магистерской диссертации) по методике...»

«Составитель: Э.И. Шагиахметова УДК 336.6 МЕТОДИЧЕСКИЕ УКАЗАНИЯ для проведения лабораторных занятий по дисциплине Управление инвестиционными проектами для студентов направления подготовки 270800 Строительство, профиля Экспертиза и управление недвижимостью, Информационные системы и технологии квалификации (степени) выпускника (БАКАЛАВР), формы обучения (очная)/КГАСУ.; Сост. Э.И. Шагиахметова. Казань, 2011 – 31 с. Печатается по решению Редакционно - издательского совета Казанского...»

«Приложение I Учетная политика Эмитента на 2007-2010 гг. ПРИКАЗ 29 12 2006 № 241 Об учетной политике ОАО ГидроОГК Руководствуясь пунктом 3 статьи 5 Федерального закона от 21.11.96 № 129-ФЗ О бухгалтерском учете, пунктом 3.3. Методических рекомендаций по составлению и предоставлению сводной бухгалтерской отчетности, утвержденных приказом Министерства финансов Российской Федерации от 30.02.96 № 112, статьей 313 Налогового кодекса Российской Федерации, ПРИКАЗЫВАЮ: 1. Утвердить положение об учетной...»

«А. С. ГЕРАСИМОВ КУРС МАТЕМАТИЧЕСКОЙ ЛОГИКИ И ТЕОРИИ ВЫЧИСЛИМОСТИ УЧЕБНОЕ ПОСОБИЕ Издание третье, исправленное и дополненное Электронный вариант этой книги (в виде PDF-файла) распространяется с сайта Московского центра непрерывного математического образования http://www.mccme.ru/free-books и с сайта её автора http://gas-teach.narod.ru. Издательство ЛЕМА Санкт-Петербург 2011 УДК 510.6+510.2+510.5+512.54.05+004.05 ББК 22.12 Г37 Герасимов А. С. Курс математической логики и теории вычислимости:...»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.