CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Умножение и деление ----------------------------------------------------------------- Процессор 8086 может выполнять отдельные типы операций умно- жения и деления. Эта одна из сильных сторон процессора 8086, пос- кольку во многих микропроцессорах вообще отсутствует непосредст- венная поддержка операций умножения и деления, а эти операции до- вольно сложно выполнить программным путем. Инструкция MUL перемножает 8- или 16-битовые беззнаковые сомножители, создавая 16- или 32-битовое произведение. Давайте сначала рассмотрим умножение 8-битовых сомножителей. При 8-битовом (8-разрядном) умножении один из операндов дол- жен храниться в регистре AL, а другой может представлять собой любой 8-битовый общий регистр или переменную памяти соответствую- щего размера. Инструкция MUL всегда сохраняет 16-битовое произве- дение в регистре AX. Например, во фрагменте программы: . . . mov al,25 mov dh,40 mul dh . . . AL умножается на DH, а результат (1000) помещается в регистр AX. Заметим, что в инструкции MUL требуется указывать только один операнд, другой сомножитель всегда храниться в регистре AL (или в регистре AX в случае перемножения 16-битовых сомножителей). Инструкция перемножения 16-битовых сомножителей работает аналогично. Один из сомножителей должен храниться в регистре AX, а другой может находиться в 16-разрядном общем регистре или в пе- ременной памяти. 32-битовое произведение инструкция MUL помещает в этом случае в регистры DX:AX, при этом младшие (менее значащие) 16 битов произведения записываются в регистр AX, а старшие (более значащие) 16 бит - в регистр DX. Например, инструкции: . . . mov ax,1000 mul ax . . . загружают в регистр AX значение 1000, а затем возводят его в квадрат, помещая результат (значение 1000000) в регистры DX:AX. В отличие от сложения и вычитания, в операции умножения не учитывается, являются ли сомножители операндами со знаком или без знака, поэтому имеется вторая инструкция умножения IMUL для умно- жения 8- и 16-битовых сомножителей со знаком. Если не принимать во внимание, что перемножаются значения со знаком, инструкция IMUL работает аналогично инструкции MUL. Например, при выполнении инструкций: . . . mov al,-2 mov ah,10 imul ah . . . в регистре AX будет записано значение -20. Процессор 8086 позволяет вам с определенными ограничениями разделить 32-битовое значение на 16-битовое, или 16-битовое зна- чение на 8-битовое. Давайте сначала рассмотрим деление 16-битового значения на 8-битовое. При беззнаковом делении 16-битового значения на 8-битовое делимое должно быть записано в регистре AX. 8-битовый делитель может храниться в любом 8-битовом общем регистре или переменной в памяти соответствующего размера. Инструкция DIV всегда записывает 8-битовое частное в регистр AL, а 8-битовый остаток - в AH. Нап- ример, в результате выполнения инструкций: . . . mov ax,51 mov dl,10 div dl . . . результат 5 (51/10) будет записан в регистр AL, а остаток 1 (ос- таток от деления 51/10) - в регистр AH. Заметим, что частное представляет собой 8-битовое значение. Это означает, что результат деления 16-битового операнда на 8-битовый операнд должен превышать 255. Если частное слишком ве- лико, то генерируется прерывание 0 (прерывания по делению на 0). Инструкции: . . . mov ax,0fffh mov bl,1 div bl . . . генерируют прерывание по делению на 0 (как можно ожидать, преры- вание по делению на 0 генерируется также, если 0 используется в качестве делителя). При делении 32-битового операнда на 16-битовый операнд дели- мое должно записываться в регистрах DX:AX. 16-битовый делитель может находиться в любом из 16-битовых регистров общего назначе- ния или в переменной в памяти соответствующего размера. Например, в результате выполнения инструкций: . . . mov ax,2 mov dx,1 ; загрузить в DX:AX 10002h mov bx,10h div bx . . . частное 1000h (результат деления 10002h на 10h) будет записано в регистре AX, а 2 (остаток от деления) - в регистре DX. Как и при умножении, при делении имеет значение, используют- ся операнды со знаком или без знака. Для деления беззнаковых опе- рандов используется операция DIV, а для деления операндов со зна- ком - IDIV. Например, операции: . . . .DATA TestDivisor DW 100 . . . .CODE . . . mov ax,-667 cwd ; установить DX:AX в значение -667 idiv [TestDivisor] . . . сохраняют значение -6 в регистре AX и значение -67 в регистре DX. Изменение знака ----------------------------------------------------------------- Наконец, мы подошли к рассмотрению инструкции NEG, которая позволяет вам изменить (инвертировать) знак содержимого общего регистра или переменной в памяти. Например, после выполнения инс- трукций: . . . mov ax,1 ; установить регистр AX в значение 1 neg ax ; отрицание AX, он становится ; равным -1 mov bx,ax ; скопировать содержимое AX в BX neg bx ; отрицание BX, он становится равным 1 . . . в регистре AX будет содержаться значение -1, а в регистре BX - значение 1. Логические операции ----------------------------------------------------------------- Турбо Ассемблер поддерживает полный набор инструкций для вы- полнения логических операций, включая инструкции AND (И), OR (ИЛИ), XOR (исключающее ИЛИ) и NOT (НЕ). Эти инструкции могут оказаться очень полезными при работе с отдельными битами слова или байта, а также для выполнения операций булевой алгебры. Результаты выполнения логических операций показаны в Таблице 5.1. Логическая инструкция выполняет поразрядные операции над би- тами исходных операндов. Например, инструкция: adn ax,dx выполняет логическую операцию AND с битом 0 регистра AX и битом 0 регистра DX, затем ту же операцию с битами 1, 2 и т.д. до бита 15. Выполнение логических инструкций процессора 8086 ADN, OR и XOR Таблица 5.1 ----------------------------------------------------------------- | Исходный бит A | Исходный бит B | A AND B | A OR B | A XOR B | |---------------------------------------------------------------| | 0 | 0 | 0 | 0 | 0 | | 0 | 1 | 0 | 1 | 1 | | 1 | 0 | 0 | 1 | 1 | | 1 | 1 | 1 | 1 | 0 | ----------------------------------------------------------------- Инструкция AND комбинирует два операнда в соответствии с правилами, показанными в Таблице 5.1, устанавливая каждый бит ре- зультата (операнда-приемника) в 1 только в том случае, если оба соответствующих бита операнда-источника равны 1. Инструкция AND позволяет вам выделить отдельный бит или принудительно установить его в значение 0. Например, инструкции: . . . mov dx,3dah in al,dx and al,1 . . . выделяет бит 0 байта состояния цветного графического адаптера (CGA). Эти инструкции оставляют регистр AL установленным в значе- ние 1, если видеопамять адаптера CGA можно изменять, не вызывая помех на экране ("снег"), и устанавливают его в нулевое значение в противном случае. Инструкция OR также комбинирует два операнда в соответствии с правилами, приведенными в Таблице 5.1, устанавливая каждый бит операнда-приемника в значение 1, если любой из соответствующих бит операнда-источника равен 1. Инструкция OR позволяет вам при- нудительно установить отдельные биты (или бит) в значение 1. Нап- ример, инструкции: . . . mov ax,40h mov ds,ax mov bx,10h or WORD PTR [bx],0030h . . . устанавливают биты 5 и 4 слова флагов аппаратуры базовой системы ввода-вывода BIOS в значение 1. При этом BIOS будет поддерживать монохромный дисплейный адаптер. Инструкция XOR также комбинирует два операнда в соответствии с правилами, приведенными в Таблице 5.1, устанавливая каждый бит операнда-приемника в значение 1, только в том случае, один соот- ветствующих бит операнда-источника равен 0, и в значение 1 в про- тивном случае. Инструкция XOR позволяет вам "переключать" значе- ния отдельных бит в байте. Например, инструкции: . . . mov al,01010101b mov al,11110000b . . . устанавливают регистр AL в значение 10100101b или A5h. Когда для регистра AL выполняется операция XOR со значением 11110000b (0F0h), биты со значением 1 в 0F0h переключают значения соот- ветствующих бит в регистре AL, а биты со значением 0 оставляют соответствующие биты AL неизмененными. Кстати, инструкция XOR дает удобный способ обнуления содер- жимого регистра. Например, следующая инструкция устанавливает со- держимое регистра AX в значение 0: xor ax,ax Наконец, инструкция NOT просто изменяет значение каждого бита операнда на противоположное (как если бы над исходным опе- рандом была выполнена операция XOR со значением 0FFh). Например: . . . mov bl,10110001b not bl ; переключить BL в 01001110b xor bl,0ffh ; переключить BL обратно в ; значение 10110001b . . .
Оставить комментарий
Комментарии
1.
+2 / -3
5 марта 2013, 00:03:00
Спасибі, хороша стаття.
Знайшов помилку:
Заметим, что частное представляет собой 8-битовое значение.
Это означает, что результат деления 16-битового операнда на
8-битовый операнд "НЕ" должен превышать 255.
Пропущено "НЕ".
Знайшов помилку:
Заметим, что частное представляет собой 8-битовое значение.
Это означает, что результат деления 16-битового операнда на
8-битовый операнд "НЕ" должен превышать 255.
Пропущено "НЕ".