Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
palivo_finalv0_2.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

58. Команди ділення цілих чисел

(источник - http://looch-disasm.narod.ru/refe01.htm)

div op2 – беззнаковое целочисленное деление,

idiv op2 – знаковое целочисленное деление.

Алгоритм деления

Рассмотрим выполнение операции D = A / B , где A и B цели двоичные числа без знака .

Одним из самых простых алгоритмов является деление " в столбик ".

Алгоритм деления n - битового числа A 4-битное B

можно записать так :

1 . Установить i = n - 4.

2 . Взять четыре старшие биты числа A. Отметить это как R = { an -1 , an -2 , an -3 , an -4 }

3 . Если R больше или равна B ,

то : i - и цифра (бит ) результата di равна 1 , вычитаем R = R - B

иначе : i - и цифра результата di равна 0

4 . Уменьшить i на единицу. Если i меньше нуля , то конец работы .

5 . Умножить R на два. Такое умножение означает смещение битов на одну позицию

влево. Добавить в R в младший разряд i -й бит числа A , т.е. ai .

6 . Переход на п. 2 .

59. Побітові логічні команди

(источник - http://looch-disasm.narod.ru/refe01.htm)

ADD – сложение.

OR – логическое включающее «ИЛИ»

ADC – сложение с переносом.

SBB – вычитание с заёмом

AND – логическое «И».

SUB - вычитание

XOR – логическое исключающее «ИЛИ»

CMP – сравнение двух операндов.

TEST – логическое сравнение.

NEG – получение дополнительного кода (изменение знака).

NOT – инвертирование

60. Програмування читання та запису окремих бітів

(источник - http://looch-disasm.narod.ru/refe01.htm)

BSF – crанирование бита вперед

BSR – сканирование бита назад

BT – проверка бита

BTS – проверка бита и установка в единицу

BTC – проверка бита и сброс в нуль

61. Команди зсувів

(источник - http://looch-disasm.narod.ru/refe01.htm)

SHL – обычный сдвиг влево (по направлению к старшему биту)

SHR – обычный сдвиг вправо (по направлению к младшему биту)

SAL – арифмитический сдвиг влево (по направлению к старшему биту)

SAR – арифметический сдвиг вправо (старший бит размножается — если в старшем бите 0, то сдвинутые биты забиваются нулями, если 1 - единицами)

SAL и SHL работают одинаково.

62. Команди циклічного зсуву

63 Команды перехода

  1) jmp метка – безусловный переход на метку. Например: jmp @exit; Используется очень часто. По сути выполняет то же самое действие, что и goto в Паскале   2) jcc метка (jcc – одна из команд в следующей таблице) – условный переход. Переход выполняется, если соответствующее условие выполнено. Реально каждое условие является каким-либо состоянием флагов. Обычно перед командой условного перехода выполняется команда cmp, хотя это совсем не обязательно. В приведённом ниже примере мы хотим найти модуль числа eax:     cmp eax, 0;     jge @NoNEG; {если больше или равно, то знак инвертировать не надо}     neg eax;  @NoNEG:  Если вы разберётесь с флагами, и поймёте, какие флаги реально изменяет каждая команда, то сможете писать условные переходы, например, после команды dec. Это иногда позволяет получить некоторый выигрыш в производительности.Команды условного перехода: 

Код команды

Реальное условие

Условие для CMP

Код команды

Реальное условие

Условие для CMP

JA

CF=0 и ZF=0

если выше

JG

ZF=0 и SF=OF

если больше

JAE JNC

CF=0

если выше или равно если нет переноса

JGE

SF=OF

если больше или равно

JB JC

CF=1

если ниже если перенос

JL

SF<>OF

если меньше

JBE

CF=1 | ZF=1

если ниже или равно

JLE

ZF=1 | SF<>OF

если меньше или равно

JE JZ

ZF=1

если равно если ноль

JNE JNZ

ZF=0

если не равно если не ноль

JO

OF=1

если есть переполнение

JNO

OF=0

если нет переполнения

JS

SF=1

если есть знак

JNS

SF=0

если нет знака

JP

PF=1

если есть четность

JNP

PF=0

если нет четности

  3) jecxz метка – переход, если ecx=0    4) loop метка – цикл. Уменьшает регистр ecx на 1 и выполняет переход типа short (не дальше, чем на 127 байт) на метку, если ecx<>0. Например, в следующем фрагменте команда add выполнится 10 раз:      mov ecx, 10;  @loop_start:      add eax, ecx;      loop @loop_start;  Команда loop эквивалентна паре команд dec ecx; jnz метка, но не меняет флаги    5) loope|loopz метка – цикл пока равно|ноль  7) loopne|loopnz метка – цикл пока не_равно|не_ноль  Все перечисленные команды уменьшают ecx на 1, после чего выполняют переход типа short, если ecx<>0, и если выполняется условие. Для команд loope|loopz условие – равенство ZF=1, для loopne|loopnz – равенство ZF=0. Сами командыloopcc не изменяют значений флагов, так что ZF должен быть определён предыдущей командой. Например, следующий фрагмент копирует строку из esi в edi пока не кончится строка (ecx=0), или пока не встретится символ с ASCII-кодом 13 (конец строки):      mov ecx, lenght_string;  @loop0:      lodsb;      stosb;      cmp al, 13;  @loopnz loop0; 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]