Перейти на: Главную | Индексную | Форумную страницу |
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д (три формата): Регистр плюс регистр или память: |000000dw|modregr/rm| Регистр AX (AL) плюс непосредственное значение: |0000010w|--data--|data, если w=1| Регистр или память плюс непосредственное значение: |100000sw|mod000r/m|--data--|data, если BW=01| AND: Логическое И ------------------- О п е р а ц и я: Команда выполняет поразрядную конъюнкцию (И) битов двух операндов. Операнды представляют собой одно- или двухбайтовые величины в регистре или памяти. Второй операнд может содержать непосредственные данные. Команда AND проверяет два операнда поразрядно. Если два проверяемых бита равны 1, то в первом операнде устанавливается единичное значение бита, в других случаях - нулевое. См. также команды OR, XOR и TEST. Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF не определен). О б ъ е к т н ы й к о д (три формата): Регистр И регистр или память: |001000dw|modregr/m| Регистр AX (AL) И непосредственное значение: |0010010w|--data--|data, если w=1| Регистр или память И непосредственное значение: |1010000w|modl00r/m|--data--|data, если w=1| CALL: Вызов процедуры ----------------------- О п е р а ц и я: Выполняет короткий или длинный вызов процедуры для связи подпрограмм. Для возврата из процедуры используется команда RET. Команда CALL уменьшает содержимое SP на 2 и заносит в стек адрес следующей команды (из IP), а затем устанавливает в регистре IP относительный адрес процедуры. Впоследствии команда RET использует значение в стеке для возврата. Существует четыре типа команды CALL для вызова внутри сегмента и между сегментами. Команда межсегментного вызова сначала уменьшает SP, заносит в стек адрес из регистра CS, а затем загружает в стек внутрисегментный указатель. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (четыре формата): Прямая адресация в сегменте: |11101000|disp-low|diep-high| Косвенная адресация в сегменте: |11111111|mod010r/m| Косвенная адресация между сегментами: |11111111|mod011r/m| Прямая адресация между сегментами: |10011010|offset-low|offset-high|seg-low|seg-high| CBW: Преобразование байта в слово ----------------------------------- О п е р а ц и я: Расширяет однобайтовое арифметическое значение в регистре AL до размеров слова. Команда CBW размножает знаковый бит (7) в регистре AL по всем Битам регистра АН. См также команду CWD. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011000 (без операндов). CLC: Сброс флага переноса --------------------------- О п е р а ц и я: Устанавливает значение флага переноса, равное 0, так что, например, команда ADC не прибавляет единичный бит. Команда CLC не имеет операндов. См. также команду STD. Ф л а г и: Команда воздействует на флаг CF (устанавливается в 0). О б ъ е к т н ы й к о д: 11111000. CLD: Сброс флага направления ------------------------------- О п е р а ц и я: Устанавливает значение флага направления, равное 0. В результате такие строковые операции, как CMPS или MOVS обрабатывают данные слева направо. См. также команду STD. Ф л а г и: Команда воздействует на флаг DF (устанавливается в 0). О б ъ е к т н ы й к о д: 11111100 (без операндов). CLI: Сброс флага прерывания ----------------------------- О п е р а ц и я: Запрещает маскируемые внешние прерывания по процессорной шине INTR посредством установки значения флага прерывания IF в 0. См. также команду STI. Ф л а г и: Команда воздействует на флаг IF (устанавливается в 0). О б ъ е к т н ы й к о д: 11111010 (без операндов). CMC: Переключение флага переноса ---------------------------------- О п е р а ц и я: Инвертирует флаг CF, т.е. преобразует нулевое значение флага CF в единичное и наоборот. Ф л а г и: Команда воздействует на флаг CF (инвертируется). О б ъ е к т н ы й к о д: 11110101 (без операндов). CMP: Сравнение ---------------- О п е р а ц и я: Сравнивает содержимое двух полей данных. Фактически команда CMP вычитает второй операнд из первого, но содержимое полей не изменяет. Операнды должны иметь одинаковую длину: байт или слово. Команда CMP может сравнивать содержимое регистра, памяти или непосредственное значение с содержимым регистра; или содержимое регистра или непосредственное значение с содержимым памяти. См. также команду CMPS. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д (три формата): Регистр или память с регистром: |001110dw|modregr/m| Непосредственное значение с регистром AX (AL): |0011110w|--data--|data, если w=1| Непосредственное значение с регистром или памятью: |100000sw|mod111r/m|--data--|data, если sw=0| CMPS/CMPSB/CMPSW: Сравнение строк ----------------------------------- О п е р а ц и я: Сравнивают строки любой длины. Этим командам обычно предшествует префикс REPn, например REPE CMPSB. Команда CMPSB сравнивает память по байтам, а команда CMPSW - по словам. Первый операнд этих команд адресуется регистровой парой DS:SI, а второй - регистровой парой ES:DI. Если флаг DF установлен в 0, то сравнение происходит слева направо, регистры SI и DI при этом увеличиваются после каждого сравнения. Если флаг DF установлен в 1, то сравнение происходит справа налево, а регистры SI и DI при этом уменьшаются после каждого сравнения. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д: 1010011w. CWD: Преобразование слова в двойное слово ------------------------------------------- О п е р а ц и я: Расширяет арифметическое значение в регистре АХ до размеров двойного слова в регистровой паре DX:AX, дублируя при этом знаковый бит (15-й бит в регистре АХ) через регистр DX. Обычно используется для получения 32-битового делимого. См. также команду CBW. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011001 (без операндов). DAA: Десятичная коррекция для сложения ---------------------------------------- О п е р а ц и я: Корректирует результат сложения двух BCD (десятичных упакованных) элементов в регистре AL. Если четыре правых бита имеют значение больше 9 или флаг AF установлен в 1, то команда DAA прибавляет 6 к регистру AL и устанавливает флаг AF. Если регистр AL содержит значение больше, чем 9F, или флаг CF установлен в 1, то команда DAA прибавляет 60Н к регистру AL и устанавливает флаг CF. См. также команду DAS. Ф л а г и: Команда воздействует на флаги AF. CF, PF, SF и 2F (флаг OF неопределен). О б ъ е к т н ы й к о д: 00100111 (без операндов). DAS: Десятичная коррекция для вычитания ----------------------------------------- О п е р а ц и я: Корректирует результат вычитания двух BCD (десятичных упакованных) чисел в регистре AL. Если четыре правых бита имеют значение больше 9 или флаг AF установлен в 1, то команда DAS вычитает 60Н из регистра AL и устанавливает флаг CF. См. также команду DAA. Ф л а г и: Команда воздействует на флаги AF, CF, PF, SF и ZF. О б ъ е к т н ы й к о д: 00101111 (без операндов). DEC: Декремент ---------------- О п е р а ц и я: Вычитает 1 из байта или слова в регистре или в памяти например DEC СХ. См. также команду INC. Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д (два формата): Регистр: |01001reg| Регистр или память: |1111111w|mod001r/m| DIV: Деление -------------- О п е р а ц и я: Выполняет деление беззнакового делимого (16 или 32 бит) на беззнаковый делитель (8 или 16 бит). Левый единичный бит рассматривается как бит данных, а не как минус для отрицательных чисел. Для 16-битового деления делимое должно находиться в регистре АХ, а 8-битовый делитель возможен в регистре или в памяти, например DIV BH. Частное от деления получается в регистре AL, а остаток - в регистре AН. Для 32-битового деления делимое должно находиться в регистровой паре DX:AX а 16-битовый делитель возможен в регистре или в памяти, например DIV СХ. Частное от деления получается в регистре AХ, а остаток - в регистре DX. См. также команду IDIV. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF SF и ZF (все не определены). О б ъ е к т н ы й к о д: |1111011w|mod110r/m| ESC: Переключение на сопроцессор ---------------------------------- О п е р а ц и я: Обеспечивает использование сопроцессора для выполнения специальных операций. Для выполнения арифметических операций над числами с плавающей запятой используются сопроцессоры 8087 или 80287. Команда ESC передает в сопроцессор инструкцию и операнд для выполнения необходимой операции. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11011xxx|modxxxr/m| (x - любое знач.). HLT: Останов микропроцессора ------------------------------ О п е р а ц и я: Приводит процессор в состояние останова, в котором происходит ожидание прерывания. При завершении команды HLT регистры CS:IP указывают на следующую команду. При возникновении прерывания процессор записывает в стек регистры CS и IP и выполняет подпрограмму обработки прерывания. При возврате из подпрограммы команда IRET восстанавливает регистры CS и IP из стека и управление передается на команду, следующую за командой HLT. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 11110100 (без операндов). IDIV: Целое деление знаковых величин -------------------------------------- О п е р а ц и я: Выполняет деление знакового делимого (16 или 32 бит) на знаковый делитель (8 или 16 бит). Левый единичный бит рассматривается как знак минус для отрицательных чисел. Для 16-битового деления делимое должно находиться в регистре АХ, a 8-битовый делитель возможен в регистре или в памяти, например IDIV DL. Частное от деления получается в регистре AL, а остаток - в регистре АН. Для 32-битового деления делимое должно находиться в регистровой паре DX:AX, а 16-битовый делитель возможен в регистре или в памяти, например IDIV BX. Частное от деления получается в регистре АХ, а остаток - в регистре DX. См. команды CBW и CWD для расширения знакового делимого, а также команду DIV. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д: |1111011w|mod111r/m| IMUL: Целое умножение знаковых величин ---------------------------------------- О п е р а ц и я: Выполняет умножение на знаковый множитель (8 или 16 бит). Левый единичный бит рассматривается как знак минус для отрицательных чисел. Для 8-битового умножения множимое должно находиться в регистре AL, а множитель возможен в регистре или в памяти, например IMUL BL. Произведение получается в регистре АХ. Для 16-битового умножения множимое должно находиться в регистре АХ, а множитель возможен в регистре или в памяти, например IMUL BX. Произведение получается в регистровой паре DX:AX. См. также команду MUL. Ф л а г и: Команда воздействует на флаги CF и OF (флаги AF PF SF и ZF не определены). О б ъ е к т н ы й к о д: |1111011w|mod101r/m| IN: Ввод байта или слова из порта ----------------------------------- О п е р а ц и я: Передает из вводного порта один байт в регистр AL или два байта в регистр АХ). Порт кодируется как фиксированный числовой операнд (IN АХ,порт#) или как переменная в регистре DX (IN AX,DX). Процессоры 80186, 80286 и 80386 имеют, кроме того, команду INS (Input String - ввод строки). См. также команду OUT. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (два формата): Переменный порт: |1110110w| Фиксированный порт: |1110010w|--port--| INC: Инкремент ---------------- О п е р а ц и я: Прибавляет 1 к байту или слову в регистре или в памяти, например INC СХ. См. также команду DEC. Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д (два формата): Регистр: |01000reg| Регистр или память: |1111111w|mod000r/m| INT: Прерывание ----------------- О п е р а ц и я: Прерывает выполнение программы и передает управление по одному из 256 адресов (векторов прерывания). Команда INT выполняет следующее: 1) уменьшает значение SP на 2 и заносит в стек флаговый регистр, сбрасывает флаги IF и TF; 2) уменьшает значение SP на 2 и заносит регистр CS в стек, старшее слово из вектора прерывания помещает в регистр CS; 3) уменьшает значение SP на 2 и заносит регистр IP в стек, младшее слово из вектора прерывания помещает в регистр IP. Ф л а г и: Команда воздействует на флаги IF и TF. О б ъ е к т н ы й к о д: |1100110v|--type--| (если v = 0, то type = 3). INTO: Прерывание по переполнению ---------------------------------- О п е р а ц и я: Приводит к прерыванию при возникновении переполнения (флаг OF установлен в 1) и выполняет команду IRET 4. Адрес подпрограммы обработки прерывания (вектор прерывания) находится по адресу 10Н. См. также команду INT. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 11001110 (без операндов). IRET: Возврат из обработки прерывания --------------------------------------- О п е р а ц и я: Обеспечивает возврат из подпрограммы обработки прерывания. Команда IRET выполняет следующее: 1) помещает слово из вершины стека в регистр IP и увеличивает значение SP на 2; 2) помещает слово из вершины стека в регистр CS и увеличивает значение SP на 2; 3) помещает слово из вершины стека во флаговый регистр и увеличивает значение SP. на 2. См. также команду RET. Ф л а г и: Команда воздействует на все флаги. О б ъ е к т н ы й к о д: 11001111 (бег операндов). JA/JNBE: Переход по "выше" или "не ниже или равно" ---------------------------------------------------- О п е р а ц и я: Используется после проверки беззнаковых данных для передачи управления по другому адресу. Если флаг CF равен нулю (нет переноса) и флаг ZF равен нулю (не нуль), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110111|--disp--| JAE/JNB: Переход по "выше или равно" или "не ниже" ---------------------------------------------------- О п е р а ц и я: Используется после проверки беззнаковых данных для передачи управления по другому адресу. Если флаг CF равен нулю (нет переноса), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110011|--disp--| JB/JNAE: Переход по "ниже" или "не выше или равно" ---------------------------------------------------- О п е р а ц и я: Используется после проверки беззнаковых данных для Передачи управления по другому адресу. Если флаг CF равен единице (есть перенос), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110010|--disp--| JBE/JNA: Переход по "ниже или равно" или "не выше" ---------------------------------------------------- О п е р а ц и я: Используется после проверки беззнаковых данных для передачи управления по другому адресу. Если флаг CF равен единице (есть перенос) или флаг AF равен единице, то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110110|--disp--| JC: Переход по переносу ------------------------- О п е р а ц и я: Идентична JB/JNAE. JCXZ: Переход по "CX равно нулю" ---------------------------------- О п е р а ц и я: Выполняет передачу управления по указанному в операнде адресу, если значение в регистре CX равно нулю. Команда JCXZ может быть полезна в начале циклов LOOP. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11100011|--disp--| JE/JZ: Переход по "равно" или по "нулю" О п е р а ц и я: Используется после проверки знаковых или беззнаковых данных для передачи управления по другому адресу. Если флаг ZF равен единице (нулевое состояние), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110100|--disp--| JG/JNLE: Переход по "больше" или "не меньше или равно" -------------------------------------------------------- О п е р а ц и я: Используется после проверки знаковых данных для передачи управления по другому адресу. Если флаг ZF равен нулю (не нуль) и флаги SF и OF одинаковы (оба 0 или оба 1), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111111|--disp--| JGE/JNL: Переход по "больше или равно" или "не меньше" -------------------------------------------------------- О п е р а ц и я: Используется после проверки знаковых данных для передачи управления по другому адресу. Если флаги SF и OF одинаковы (оба 0 или оба 1), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111101|--disp--| JL/JNGE: Переход по "меньше" или "не больше или равно" -------------------------------------------------------- О п е р а ц и я: Используется после проверки знаковых данных для передачи управления по другому адресу. Если флаги SF и OF различны, то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111100|--disp--| JLE/JNG: Переход по "меньше или равно" или "не больше" -------------------------------------------------------- О п е р а ц и я: Используется после проверки знаковых данных для передачи управления по другому адресу. Если флаг ZF равен единице (нулевое состояние) и флаги SF и OF различны, то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111110|--disp--| JMP: Безусловный переход -------------------------- О п е р а ц и я: Выполняет переход по указанному адресу при любых условиях. Команда JMP заносит в регистр IP необходимый адрес перехода. Существует пять типов команды JMP для передачи управления внутри сегмента или между сегментами. При межсегментном переходе в регистр CS заносится также новый сегментный адрес. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (пять форматов): Прямой переход внутри сегмента: |11101001|disp-low|disp-high| Прямой переход внутри сегмента (короткий): |11101011|--disp--| Косвенный переход внутри сегмента: |11111111|mod100r/m| Косвенный межсегментный переход: |11111111|mod101r/m| Прямой межсегментный переход: |11101010|offset-low|offset-high|seg-low|seg-high| JNC: Переход если нет переноса -------------------------------- О п е р а ц и я: Идентична JAE/JNB. JNE/JNZ: Переход по "не равно" или по "не нуль" ------------------------------------------------- О п е р а ц и я: Используется после проверки знаковых данных для передачи управления по другому адресу. Если флаг ZF равен нулю (ненулевое состояние), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110101|--disp--| INO: Переход, если нет переполнения ------------------------------------- О п е р а ц и я: Используется для передачи управления по определенному адресу после проверки на отсутствие переполнения. Если флаг OF равен, нулю (нет переполнения), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JO. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110001|--disp--| JNP/JPO: Переход, если нет паритета или паритет нечетный ---------------------------------------------------------- О п е р а ц и я: Приводит к передаче управления по определенному адресу, если в результате операции обнаружено отсутствие паритета или паритет нечетный. Нечетный паритет в данном случае означает, что в результате операции в . младших восьми битах получено нечетное число битов. Если флаг PF равен нулю (нечетный паритет), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JP/JPE. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111011|--disp--| JHS: Переход, если нет знака ------------------------------ О п е р а ц и я: Приводит к передаче управления по определенному адресу, если в результате операции получен положительный знак. Если флаг SF равен нулю (положительное), то команда JNS прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JS. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111001|--disp--| JO: Переход по переполнению ----------------------------- О п е р а ц и я: Приводит к передаче управления по определенному адресу, если в результате операции получено состояние переполнения. Если флаг OF равен единице (переполнение), то команда JO прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JNO. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01110000|--disp--| JP/JPE: Переход, если есть паритет или паритет четный ------------------------------------------------------- О п е р а ц и я: Приводит к передаче управления по определенному адресу, если в результате операции обнаружен четный паритет. Четный паритет в данном случае означает, что в результате операции в младших восьми битах получено четное число битов. Если флаг PF равен единице (четный паритет), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JNP/JPO. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111010|--disp--| JS: Переход по знаку ---------------------- О п е р а ц и я: Передает управления по определенному адресу, если в результате операции получен отрицательный знак. Если флаг SF равен единице (отрицательно), то команда JS прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход. См. также команду JNS. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |01111000|--disp--| LAHF: Загрузка флагов в регистр АН ------------------------------------ О п е р а ц и я: Загружает значение флагового регистра в регистр АН. Данная команда обеспечивает совместимость с процессором 8080. См. также команду SAHF. Команда LAHF заносит правый байт флагового регистра в регистр АН в следующем виде: SZ * A * P * C (* обозначает неиспользуемые биты) Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011111 (без операндов) LDS: Загрузка регистра сегмента данных ---------------------------------------- О п е р а ц и я: Инициализирует начальный адрес сегмента данных и адрес смещения к переменной для обеспечения доступа к данной переменной. Команда LDS загружает в необходимые регистры четыре байта из области памяти, содержащей относительный адрес и сегментный адрес. Сегментный адрес помещается в регистр DS, а относительный адрес - в любой из общих или индексных регистров или в регистровый указатель. Следующая команда загружает относительный адрес в регистр DI: LDS DI,адрес_памяти Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11000101|modregr/m| LES: Загрузка регистра дополнительного сегмента ------------------------------------------------- О п е р а ц и я: Инициализирует начальный адрес дополнительного сегмента и адрес смещения к переменной для .обеспечения доступа к данной переменной. См. также команду LDS. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11000100|modregr/m| LOCK: Блокировка шины доступа к данным ---------------------------------------- О п е р а ц и я: Запрещает другим (сопроцессорам одновременно изменять элементы данных. Команда LOCK представляет собой однобайтовый префикс, который можно кодировать непосредственно перед любой командой. Данная операция посылает сигнал в другой процессор, запрещая использование данных, пока не будет завершена следующая команда. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 11110000 LODS/LODSB/LODSW: Загрузка однобайтовой или двухбайтовой строки ----------------------------------------------------------------- О п е р а ц и я: Загружает из памяти один байт в регистр AL или одно слово в регистр AХ. Несмотря на то, что команда LODS выполняет строковую операцию, нет смысла использовать ее с префиксом REP. Регистровая пара DS:SI адресует в памяти байт (для LODSB) или слово (для LODSW), которые загружаются в регистр AL или AХ соответственно. Если флаг DF равен нулю, то операция прибавляет 1 (для байта) или 2 (для слова) к регистру SI. Если флаг DF равен единице, то операция вычитает 1 (для байта) или 2 (для слова) из регистра SI. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 1010110w (без операндов). LOOP: Цикл ------------ О п е р а ц и я: Управляет выполнением группы команд определенное число раз. До начала цикла в регистр CX должно быть -загружено число выполняемых циклов. Команда LOOP находится в конце цикла, где она уменьшает значение в регистре СХ. на единицу. Если значение в регистре CX не равно нулю, то команда передает управление по адресу, указанному в операнде (прибавляет к регистру IP значение операнда); в противном случае управление передается на следующую после LOOP команду (происходит выход из цикла). Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: у11100010у--disp--у LOOPE/LOOPZ: Цикл, если равно или нуль ----------------------------------------- О п е р а ц и я: Управляет выполнением группы команд определенное число раз или пока установлен флаг ZF (в единичное состояние). Команды LOOPE/LOOPZ аналогичны команде LOOP, за исключением того, что по этим командам цикл прекращается либо по нулевому значению в регистре CX, либо по нулевому значению флага ZF (ненулевое состояние). См. также команды LOOPNE/LOOPNZ. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11100001|--disp--| LOOPNE/LOOPNZ: Цикл, если не равно или не нуль ------------------------------------------------ О п е р а ц и я: Управляет выполнением группы команд определенное число раз или пока сброшен флаг ZF (в нулевое состояние)., Команды LOOPNE/LOOPNZ аналогичны команде LOOP за исключением того, что по этим командам цикл прекращается либо по нулевому значению в регистре CX, либо по единичному значению флага ZF (нулевое состояние). См. также команды LOOPE/LOOPZ. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |11100000|--disp--| MOV: Пересылка данных ----------------------- О п е р а ц и я: Пересылает один байт или одно слово между регистрами или между регистром и памятью, а также передает непосредственное значение в регистр или в память. Команда MOV не может передавать данные между двумя адресами памяти (для этой цели служит команда MOVS). Существует семь типов команды MOV. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (семь форматов): Регистр/память в/из регистр: |100010dw|modregr/m| Непосредственное значение в регистр/память: |1100011w|mod000r/m|--data--|data если w=1| Непосредственное значение в регистр: |1011wreg|--data--|data если w=1| Память в регистр AX (AL): |1010000w|addr-low|addr-high| Регистр AX (AL) в память: |1010001w|addr-low|addr-high| Регистр/память в сегментный регистр: |10001110|mod0sgr/m| (sg - сегментный регистр) Сегментный регистр в регистр/память: |10001100|mod0sgr/m| (sg - сегментный регистр) MOVS/MOVSB/MOVSW: Пересылка строки байт или строки слов --------------------------------------------------------- О п е р а ц и я: Пересылает данные между областями памяти. Команды MOVS(B/W) обычно используются с префиксом REP. Команда MOVSB пересылает любое число байтов, а команда MOVSW - любое число слов. Перед выполнением команды регистровая пара DS:SI должна адресовать источник пересылки ("откуда") а регистровая пара ES:DI - получатель пересылки ("куда"). Если флаг DF равен нулю, то операция пересылает данные слева направо и увеличивает регистры SI и DI. Если флаг DF равен единице то операция пересылает данные справа налево и уменьшает регистры SI и DI. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 1010010w (без операндов). MUL: Беззнаковое умножение ---------------------------- О п е р а ц и я: Умножает беззнаковое множимое (8 или 16 бит) на беззнаковый множитель (8 или 16 бит). Левый единичный бит рассматривается как бит данных, но не как знак минус для отрицательных чисел. Для 8-битового умножения множимое должно находиться в регистре AL, а множитель возможен в регистре или в памяти, например MUL CL. Произведение получается в регистре АХ. Для 16-битового умножения множимое должно находиться в регистре АХ, а множитель возможен в регистре или в памяти, например MUL ВХ. Произведение получается в регистровой паре DX:AX. См. также команду IMUL. Ф л а г и: Команда воздействует на флаги CF и OF (флаги AF, PF, SF и ZF не определены). О б ъ е к т н ы й к о д: |1111011w|mod100r/m| NEG: Изменение знака числа ---------------------------- О п е р а ц и я: Меняет двоичное значение из положительного в отрицательное и из отрицательного в положительное. Команда NEG вычисляет двоичное дополнение от указанного операнда: вычитает операнд из нуля и прибавляет единицу. Операндом может быть байт или слово в регистре или в памяти. См. также команду NOT. Флаги: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д: |1111011w|mod011r/m| NOP: Нет операции ------------------- О п е р а ц и я: Применяется для удаления или вставки машинных кодов или для задержки выполнения программы. Команда NOP выполняет операцию XCHG АХ,АХ, которая ничего не меняет. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10010000 (без операндов) NOT: Логическое НЕТ --------------------- О п е р а ц и я: Меняет нулевые биты на единичные и наоборот. Операндом может быть байт или слово в регистре или в памяти. См. также команду NEG. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: |1111011w|mod010r/m| OR: Логическое ИЛИ -------------------- О п е р а ц и я: Выполняет поразрядную дизъюнкцию (ИЛИ) над битами двух операндов. Операндами являются байты или слова в регистрах или в памяти, второй операнд может иметь непосредственное значение. Команда OR обрабатывает операнды побитово. Если любой из проверяемых бит равен единице, то бит в операнде 1 становится равным единице, в противном случае бит в операнде 1 не изменяется. См. также команды AND и XOR. Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF неопределен). О б ъ е к т н ы й к о д (три формата): Регистр/память с регистром: |000010dw|modregr/m| Непосредственное с аккумулятором: |0000110w|--data--|data если w=1| Непосредственное с регистром/памятью: |1000000w|mod001r/m|--data--|data если w=1| OUT: Вывод байта или слова в порт ----------------------------------- О п е р а ц и я: Передает в выводной порт байт из регистра AL или слово из регистра AХ. Порт кодируется как фиксированный числовой операнд (OUT порт#,АХ) или как переменная в регистре DX (OUT DX.AX). Процессоры 80186, 80286 и 80386 имеют, кроме того, команду OUTS (Output String - вывод строки). См. также команду IN. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (два формата): Переменный порт: |1110111w| Фиксированный порт:|1110011w|--port--| POP: Извлечение слова из стека -------------------------------- О п е р а ц и я: Передает слово (помещенное ранее в стек) в указанный операнд. Регистр SP указывает на текущее слово в вершине стека. Команда POP извлекает слово из стека и увеличивает значение в регистре SP на 2. Существует три типа команды POP в зависимости от операнда: общий регистр, сегментный регистр, слово в памяти. См. также команду PUSH. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (три формата): Регистр: |01011reg| Сегментный регистр: |000sg111| (sg-сегм.рег.) Регистр/память: |10001111|mod000r/m| POPA: Извлечение из стека всех общих регистров (80188,80186,80286) -------------------------------------------------------------------- О п е р а ц и я: Извлекает из стека восемь значений в регистры Dl, SI BP, SP, BX, DX, CX, AX в указанной последовательности и увеличивает регистр SP на 16. Регистры обычно записываются в стек ранее соответствующей командой PUSHA. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 01100001 (без операндов). POPF: Извлечение флагов из стека ---------------------------------- О п е р а ц и я: Передает биты (помещенные ранее в стек) во флаговый регистр. См. также команды PUSHF и POP. Регистр SP указывает на текущее слово в вершине стека. Команда POPF передает биты из этого слова во флаговый регистр и увеличивает значение в регистре SP на 2. Обычно команда PUSHF записывает значения флагов в стек, а команда POPF восстанавливает эти флаги. Ф л а г и: Команда воздействует на все флаги. О б ъ е к т н ы й к о д: 10011101 (без операндов). PUSH: Занесение слова в стек ------------------------------ О п е р а ц и я: Сохраняет значение слова (адрес или элемент данных) в стеке для последующего использования. Регистр SP указывает на текущее слово в вершине стека. Команда PUSH уменьшает значение в регистре SP на 2 и передает слово из указанного операнда в новую вершину стека. Существует три типа команды PUSH в зависимости от операнда: общий регистр, сегментный регистр или слово в памяти. См. также команды POP и PUSHF. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (три формата): Регистр: |01010reg| Сегментный регистр: |000sg111| (sg-сегм.рег.) Регистр/память: |11111111|mod110r/m| PUSHA: Занесение в стек всех общих регистров (80188,80186,80286) ------------------------------------------------------------------ О п е р а ц и я: Записывает в стек восемь значений регистров AX, CX, DX, BX, SP, BP, SI, DI в указанной последовательности и уменьшает регистр SP на 16. Обычно команда POPA позже восстановит эти регистры из стека. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 01100000 (без операндов). PUSHF: Занесение флагов в стек -------------------------------- О п е р а ц и я: Сохраняет значения флагов из флагового регистра в стеке для последующего использования. Регистр SP указывает на текущее слово в вершине стека. Команда PUSHF уменьшает значение в регистре SP на 2 и передает флаги в новую вершину стека. См. также команды POPF и PUSH. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011100 (без операндов). RCL и RCR: Циклический сдвиг влево через перенос и циклический сдвиг вправо через перенос ---------------------------------------------------- О п е р а ц и я: Выполняет циклический сдвиг битов (ротацию) влево или вправо через флаг CF. Данные операции могут выполняться в байте или в слове, в регистре или в памяти. Ротация на один бит кодируется в команде значением 1; ротация более чем на один бит требует указания регистра CL, который содержит счетчик. Для команды RCL значение флага CF записывается в бит 0, а. самый левый бит записывается во флаг CF; все другие биты сдвигаются влево. Для команды RCR значение флага CF записывается в самый левый бит, а бит 0 записывается во флаг CF; все другие биты сдвигаются вправо. См. также команды ROL и ROR. Ф л а г и: Команда воздействует на флаги CF и OF. О б ъ е к т н ы й к о д: RCL: |110100cw|mod010r/m| RCR: |110100cw|mod011r/m| (если с = 0, то сдвиг на 1; если с = 1, то сдвиг на CL). REP/REPE/REPZ/REPNE/REPNZ: Повтор строковой операции ------------------------------------------------------ О п е р а ц и я: Повторяет строковую операцию определенное число раз. Используется в качестве префикса повторения перед строковыми командами CMPS, MOVS, SCAS, STOS. Счетчик повторений должен быть загружен в регистр CX до выполнения строковой команды. Операция уменьшает регистр CX на 1 при каждом выполнении строковой команды. Для префикса REP операция повторяется, пока содержимое регистра CX не достигнет нуля. Для префикса REPE/REPZ операция повторяется, пока регистр CX содержит ненулевое значение и флаг ZF равен 1 (нулевое состояние). Для префикса REPNE/REPNZ операция повторяется, пока регистр CX содержит ненулевое значение и флаг ZF равен 0 (ненулевое состояние). Ф л а г и: Определяются соответствующей строковой командой. О б ъ е к т н ы й к о д: REP/REPNE: 11110010 REPE: 11110011 RET: Возврат из процедуры --------------------------- О п е р а ц и я: Возвращает управление из процедуры, вызванной ранее командой CALL. Команда CALL может передавать управление внутри одного сегмента или между сегментами. Команда RET заносит слово из вершины стека в регистр IP и увеличивает значение SP на 2. Для межсегментного возврата команда RET, кроме того, заносит слово из новой вершины стека в регистр CS и еще раз увеличивает значение SP на 2. Любой числовой операнд команды (например, RET 4) прибавляется к указателю стека SP. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (четыре формата): Внутри сегмента: |11000011| Внутри сегмента с операндом: |11000010|data-low|data-high| Между сегментами: |11001011| Между сегментами с операндом: |11001010|data-low|data-high| ROL и ROR: Циклический сдвиг влево и циклический сдвиг вправо --------------------------------------------------------------- О п е р а ц и я: Выполняет циклический сдвиг битов (ротацию) влево или вправо. Данные операции могут выполняться в байте или в слове, в регистре или в памяти. Ротация на один бит кодируется в команде значением 1; ротация более чем на один бит требует указания регистра CL, который содержит счётчик. Для команды ROL самый левый бит записывается в бит 0; все другие биты сдвигаются влево. Для команды ROR бит 0 записывается в самый левый бит; все другие биты сдвигаются вправо. См. также команды RCL и RCR. Ф л а г и: Команда воздействует на флаги CF и OF. О б ъ е к т н ы й к о д: ROL: |110100cw|mod000r/m| ROR: |110100cw|mod001r/m| (если с = 0, то сдвиг на 1; если с = 1, то сдвиг на CL). SAHF: Установка флагов из регистра АН --------------------------------------- О п е р а ц и я: Данная команда обеспечивает совместимость с процессором 8080 для пересылки значений флагов из регистра АН во флаговый регистр. См. также команду LAHF. Команда SAHF пересылает определенные биты из регистра АН во флаговый регистр в следующем виде: SZ * A * P * C (* обозначает неиспользуемые биты) Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011110 (без операндов) SAL, SAR, SHL и SHR: Сдвиг влево или вправо --------------------------------------------- О п е р а ц и я: Выполняет сдвиг битов влево или вправо. Данные операции могут выполняться в байте или в слове, в регистре или в памяти. Сдвиг на один бит кодируется в команде значением 1; сдвиг более чем на один бит требует указания регистра CL, который содержит счетчик сдвига. Команда SAR выполняет арифметический сдвиг, который учитывает знак сдвигаемого значения. Команды SHL и SHR выполняют логический сдвиг и рассматривают знаковый бит как обычный бит данных. Команда SAL выполняется аналогично команде SHL. Команды SAL и SHL сдвигают биты влево определенное число раз и правый освобождающийся бит заполняют нулевым значением. Команда SHR сдвигает биты вправо определенное число раз и левый освобождающийся бит заполняет нулевым значением. Команда SAR сдвигает биты вправо определенное число раз и левый освобождающийся бит заполняет значением знакового бита (0 или 1). Во всех случаях значения битов, выдвигаемых за разрядную сетку, теряются. Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF не определен). О б ъ е к т н ы й к о д: SAL/SHL: |110100cw|mod100r/m| SAR: |110100cw|mod111r/m| SHR: |110100cw|mod101r/m| (если с = 0, то сдвиг на 1; если с=1, то сдвиг на CL); SBB: Вычитание с заемом ------------------------- О п е р а ц и я: Обычно используется при вычитании многословных двоичных величин для учета единичного бита переполнения в последующей фазе операции. Если флаг CF установлен в 1, то команда SBB сначала вычитает 1 из операнда 1. Команда SBB всегда вычитает операнд 2 из операнда 1, аналогично команде SUB. См. также команду ADC. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF. SF и ZF. О б ъ е к т н ы й к о д (три формата): Регистр из регистра или памяти: |000110dw|modregr/m| Непосредственное значение из регистра AX (AL): |0001110w|--data--|data, если w=1| Непосредственное значение из регистра или памяти: |100000sw|mod011r/m|--data--|data, если sw=01| SCAS/SCASB/SCASW: Поиск байта или слова в строке -------------------------------------------------- О п е р а ц и я: Выполняет поиск определенного байта или слова в строке. Для команды SCASB необходимое значение загружается в регистр AL, а для команды SCASW - в регистр AX. Регистровая пара ES:DI указывает на строку в памяти, которая должна быть сканирована. Данные команды обычно используются с префиксом REPE или REPNE. Если флаг DF равен нулю, то операция сканирует память слева направо и увеличивает регистр DI. Если флаг DF равен единице, то операция сканирует память справа налево и уменьшает регистр DI. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д: 1010111w (без операндов). STC: Установка флага переноса ------------------------------- О п е р а ц и я: Устанавливает значение флага CF в 1. См. также команду STD. Ф л а г и: Команда воздействует на флаг CF (устанавливается в 1). О б ъ е к т н ы й к о д: 11111001 (без операндов). STD: Установка флага направления ---------------------------------- О п е р а ц и я: Устанавливает значение флага направления в 1. В результате строковые операции, такие, как MOVS или CMPS, обрабатывают данные справа налево. См. также CLD. Ф л а г и: Команда воздействует на флаг DF (устанавливается в 1). О б ъ е к т н ы й к о д: 11111101 (без операндов). STI: Установка флага прерывания --------------------------------- О п е р а ц и я: Разрешает маскируемые внешние прерывания после выполнения следующей команды и устанавливает значения флага прерывания IF в 1. См. также команду CLI. Ф л а г и: Команда воздействует на флаг IF (устанавливается в 1). О б ъ е к т н ы й к о д: 11111011 (без операндов). STOS/STOSB/STOSW: Запись однобайтовой или двухбайтовой строки --------------------------------------------------------------- О п е р а ц и я: Сохраняет байт или слово в памяти. При использовании префикса REP операция дублирует значение байта или слова определенное число раз, что делает ее удобной для очистки областей памяти. Для команды STOSB необходимый байт загружается в регистр AL, а для команды STOSW необходимое слово загружается в регистр АХ. Регистровая пара ES:DI указывает область памяти, куда должен быть записан байт или слово. Если флаг DF равен нулю, то операция записывает в память слева направо и увеличивает регистр DI. Если флаг DF равен единице, то операция записывает в память справа налево и уменьшает значение в регистре DI. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 1010101w (без операндов). SUB: Вычитание двоичных чисел ------------------------------- О п е р а ц и я: Вычитает байт или слово в регистре, памяти или непосредственное значение из регистра; или вычитает байт или слово в регистре или непосредственное значение из памяти. См. также команду SBB. Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF. О б ъ е к т н ы й к о д (три формата): Регистр из регистра или памяти: |001010dw|modregr/m| Непосредственное значение из регистра АХ (AL): |0010110w|--data--|data, если w=1| Непосредственное значение из регистра или памяти: |100000sw|mod101r/m|--data--|data, если sw=01| TEST: Проверка битов ---------------------- О п е р а ц и я: Команда выполняет проверку байта или слова на определенную битовую комбинацию. Команда TEST действует аналогично команде AND, но не изменяет результирующий операнд. Операнды могут иметь однобайтовые или двухбайтовые значения. Второй операнд может иметь непосредственное значение. Команда выставляет флаги в соответствии с логической функцией И. Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF не определен). О б ъ е к т н ы й к о д (три формата): Регистр или память И регистр: |1000010w|modregr/m| Непосредственное значение И регистр АХ (AL): |1010100w|--data--|data, если w=1| Непосредственное значение И регистр или память: y1111011w|mod000r/m|--data--|data, если w=1| WAIT: Установка процессора в состояние ожидания ------------------------------------------------- О п е р а ц и я: Позволяет процессору оставаться в состоянии ожидания, пока не произойдет внешнее прерывание. Данная операция необходима для обеспечения синхронизации процессора с внешним устройством или с сопроцессором. Процессор ожидает, пока внешнее устройство (или сопроцессор) не закончит выполнение операции и на входной линии TEST не появится сигнал (активный уровень). Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 10011011 XCHG: Перестановка -------------------- О п е р а ц и я: Переставляет два байта или два слова между двумя регистрами (например, XCHG AH,BL) или между регистром и памятью (например, XCHG CX,word). Ф л а г и: Не меняются. О б ъ е к т н ы й к о д (два формата): Регистр и аккумулятор: |10010reg| Регистр/память и регистр: |1000011w|modregr/m| XLAT: Перекодировка --------------------- О п е р а ц и я: Транслирует байты в другой формат, например при переводе нижнего регистра в верхний или при перекодировке ASCII-кода в EBCDIC-код. Для выполнения данной команды необходимо определить таблицу преобразования байт и загрузить ее адрес в регистр ВХ. Регистр AL должен содержать байт, который будет преобразован с помощью команды XLAT. Операция использует значение в регистре AL как смещение в таблице, выбирает байт по этому смещению и помещает его в регистр AL. Ф л а г и: Не меняются. О б ъ е к т н ы й к о д: 11010111 (без операндов). XOR: Исключающее ИЛИ ---------------------- О п е р а ц и я: Выполняет логическую операцию исключающего ИЛИ над битами двух операндов. Операндами являются байты или слова в регистрах или в памяти, второй операнд может иметь непосредственное значение. Команда XOR обрабатывает операнды побитово. Если проверяемые биты одинаковы, то команда XOR устанавливает бит в операнде 1 равным нулю, если биты различны, то бит в операнде 1 устанавливается равным единице. См. также команды AND и OR. Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF неопределен). О б ъ е к т н ы й к о д (три формата): Регистр/память с регистром: |001100dw|modregr/m| Непосредственное с регистром AX (AL): |0011010w|--data--|data если w=1| Непосредственное с регистром/памятью: |1000000w|mod110r/m|--data--|data если w=1| ПРИЛОЖЕНИЯ __________________________________________________________________________ ПРИЛОЖЕНИЕ 1: Коды ASCII-символов ________________________________________________________________ Ниже представлены первые 128 символов ASCII-кода. В руководстве по языку BASIC приведены остальные 128 символов. На помним, что шест.20 представляет стандартный символ пробела. Таблица A-1. Набор ASCII символов __________________________________________________________________________ Дес Шест Симв Дес Шест Симв Дес Шест Симв Дес Шест Симв 000 00h Нуль 032 20h sp 064 40h @ 096 60h ` 001 01h Начало заголовка 033 21h ! 065 41h A 097 61h a 002 02h Начало текста 034 22h " 066 42h B 098 62h b 003 03h Конец текста 035 23h # 067 43h C 099 63h c 004 04h Конец передачи 036 24h $ 068 44h D 100 64h d 005 05h КТМ 037 25h % 069 45h E 101 65h e 006 06h Да 038 26h & 070 46h F 102 66h f 007 07h Звонок 039 27h ' 071 47h G 103 67h g 008 08h Возврат на шаг 040 28h ( 072 48h H 104 68h h 009 09h Гориз.табуляция 041 29h ) 073 49h I 105 69h i 010 0Ah Перевод строки 042 2Ah * 074 4Ah J 106 6Ah j 011 0Bh Верт.табуляция 043 2Bh + 075 4Bh K 107 6Bh k 012 0Ch Перевод страницы 044 2Ch , 076 4Ch L 108 6Ch l 013 0Dh Возврат каретки 045 2Dh - 077 4Dh M 109 6Dh m 014 0Eh Shift out 046 2Eh . 078 4Eh N 110 6Eh n 015 0Fh Shift in 047 2Fh / 079 4Fh O 111 6Fh o 016 10h Data line esc 048 30h 0 080 50h P 112 70h p 017 11h Управление 1 049 31h 1 081 51h Q 113 71h q 018 12h Управление 2 050 32h 2 082 52h R 114 72h r 019 13h Управление 3 051 33h 3 083 53h S 115 73h s 020 14h Управление 4 052 34h 4 084 54h T 116 74h t 021 15h Нет 053 35h 5 085 55h U 117 75h u 022 16h Синхронизация 054 36h 6 086 56h V 118 76h v 023 17h Конец блока 055 37h 7 087 57h W 119 77h w 024 18h Анулирование 056 38h 8 088 58h X 120 78h x 025 19h End of medium 057 39h 9 089 59h Y 121 79h y 026 1Ah Замена 058 3Ah : 090 5Ah Z 122 7Ah z 027 1Bh Escape 059 3Bh ; 091 5Bh [ 123 7Bh { 028 1Ch Раздел.файла 060 3Ch < 092 5Ch \ 124 7Ch | 029 1Dh Раздел.группы 061 3Dh = 093 5Dh 125 7Dh } 030 1Eh Раздел.записи 062 3Eh > 094 5Eh ^ 126 7Eh ~ 031 1Fh Раздел.единицы 063 3Fh ? 095 5Fh _ 127 7Fh Забой ПРИЛОЖЕНИЕ 2: Шестнадцатерично-десятичные преобразования ________________________________________________________________ В данном приложении представлены приемы преобразования между шестнадцатеричным и десятичным форматами. В первом разделе показан пример преобразования шест. A7B8 в десятичное 42936, а во втором - 42936 обратно в шест. A7B8. Преобразование шестнадцатеричного формата в десятичный -------------------------------------------------------- Для перевода шест. A7B8 в десятичное число необходимо последовательно, начиная с самой левой шест. цифры (A), умножать на 16 и складывать со следующей цифрой. Так как операции выполняются в десятичном формате, то шест. числа от A до F необходимо преобразовать в десятичные от 10 до 15. Первая цифра: A (10) 10 Умножить на 16 х16 --- 160 Прибавить следующую цифру, 7 +7 --- 167 Умножить на 16 х16 ---- 2672 Прибавить следующую цифру, B (11) +11 ---- 2683 Умножить на 16 х16 ----- 42928 Прибавить следующую цифру, 8 +8 ----- Десятичное значение 42936 Можно использовать также таблицу преобразования. Для шест. числа A7B8 представим правую цифру (8) как позицию 1, следующую влево цифру (B) как позицию 2, следующую цифру (7) как позицию 3 и самую левую цифру (A) как позицию 4. Из таблицы B-1 выберем значения для каждой шест. цифры: Для позиции 1 (8), столбец 1 8 Для позиции 1 (8), столбец 1 176 Для позиции 1 (8), столбец 1 1792 Для позиции 1 (8), столбец 1 40960 ----- Десятичное значение 42936 Преобразование десятичного формата в шестнадцатеричный --------------------------------------------------------- Для преобразования десятичного числа 42936 в шестнадцатеричный формат необходимо сначала исходное число 42936 разделить на 16; число, получившееся в остатке, (6) является младшей шестнадцатеричной цифрой. Затем полученное частное необходимо снова разделить на 16 и полученный остаток (11 или B) дает следующую влево шестнадцатеричную цифру. Продолжая таким образом деления до тех пор, пока в частном не получится 0, получим из остатков все необходимые шестнадцатеричные цифры. Частное Остаток Шест. 42936 / 16 2683 8 8 (младшая цифра) 2683 / 16 167 11 B 167 / 16 10 7 7 10 / 16 0 10 A (старшая цифра) Для преобразования чисел из десятичного формата в шестнадцатеричный можно также воспользоваться таблицей B-1. Для десятичного числа 42936 необходимо найти в таблице число равное или ближайшее меньшее исходному, и записать соответствующую шестнадцатеричную цифру и ее позицию. Затем следует вычесть найденное десятичное число из 42936 и с полученной разностью проделать проделать ту же операцию: Дес. Шест. Исходное десятичное число 42936 Вычесть ближайшее меньшее 40960 A000 ----- Разность 1976 Вычесть ближайшее меньшее 1792 700 ---- Разность 184 Вычесть ближайшее меньшее 176 B0 --- Разность 8 8 ---- Результирующее шест. число A7B8 Таблица B-1. Шестнадцатерично-десятичные преобразования -------------T-----------T----------T--------T-------T------T-----T-----¬ ¦Ш ¦Ш ¦Ш ¦Ш ¦Ш ¦Ш ¦Ш ¦Ш ¦ ¦Е ¦Е ¦Е ¦Е ¦Е ¦Е ¦Е ¦Е ¦ ¦С ¦С ¦С ¦С ¦С ¦С ¦С ¦С ¦ ¦Т ДЕС ¦Т ДЕС ¦Т ДЕС ¦Т ДЕС ¦Т ДЕС¦Т ДЕС¦Т ДЕС¦Т ДЕС¦ +------------+-----------+----------+--------+-------+------+-----+-----+ ¦0 0¦0 0¦0 0¦0 0¦0 0¦0 0¦0 0¦0 0¦ ¦1 268435456¦1 16777216¦1 1048576¦1 65536¦1 4096¦1 256¦1 16¦1 1¦ ¦2 536870912¦2 33554432¦2 2097152¦2 131072¦2 8192¦2 512¦2 32¦2 2¦ ¦3 805306368¦3 50331648¦3 3145728¦3 196608¦3 12288¦3 768¦3 48¦3 3¦ ¦4 1073741824¦4 67108864¦4 4194304¦4 262144¦4 16384¦4 1024¦4 64¦4 4¦ ¦5 1342177280¦5 83886080¦5 5242880¦5 327680¦5 20480¦5 1280¦5 80¦5 5¦ ¦6 1610612736¦6 100663296¦6 6291456¦6 393216¦6 24576¦6 1536¦6 96¦6 6¦ ¦7 1879048192¦7 117440512¦7 7340032¦7 458752¦7 28672¦7 1792¦7 112¦7 7¦ ¦8 2147483648¦8 134217728¦8 8388608¦8 524288¦8 32768¦8 2048¦8 128¦8 8¦ ¦9 2415919104¦9 150994944¦9 9437184¦9 589824¦9 36864¦9 2304¦9 144¦9 9¦ ¦A 2684354560¦A 167772160¦A 10485760¦A 655360¦A 40960¦A 2560¦A 160¦A 10¦ ¦B 2952790016¦B 184549376¦B 11534336¦B 720896¦B 45056¦B 2816¦B 176¦B 11¦ ¦C 3221225472¦C 201326592¦C 12582912¦C 786432¦C 49152¦C 3072¦C 192¦C 12¦ ¦D 3489660928¦D 218103808¦D 13631488¦D 851968¦D 53248¦D 3328¦D 208¦D 13¦ ¦E 3758096384¦E 234881024¦E 14680064¦E 917504¦E 57344¦E 3584¦E 224¦E 14¦ ¦F 4026531840¦F 251658240¦F 15728640¦F 983040¦F 61440¦F 3840¦F 240¦F 15¦ +------------+-----------+----------+--------+-------+------+-----+-----+ ¦ 8 ¦ 7 ¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ L------------+-----------+----------+--------+-------+------+-----+------ Шестнадцатиpичные позиции ПРИЛОЖЕНИЕ 3: Зарезервированные слова ________________________________________________________________ Большинство из следующих зарезервированных слов при использовании их для определении элементов данных могут привести к ошибкам ассемблирования (в ряде случаев - к весьма грубым): Имена регистров ----------------- AH BH CH DH CS SS BP AL BL CL DL DS SI SP AX BX CX DX ES DI Мнемокоды ----------- AAA DIV JLE JS OR SBB AAD ESC JMP JZ OUT SCAS AAM HLT JNA LAHF POP SHL AAS IDIV JNAE LDS POPF SHR ADC IMUL JNB LEA PUSH STC ADD IN JNBE LES PUSHF STD AND INC JNE LOCK RCL STI CALL INT JNG LODS RCR STOS CBW INTO JNGE LOOP REP SUB CLC IRET JNL LOOPE REPE TEST CLD JA JNLE LOOPNE REPNE WAIT CLI JAE JNO LOOPNZ REPNZ XCHG CMC JB JNP LOOPZ REPZ XLAT CMP JBE JNS MOV RET XOR CMPS JCXZ JNZ MOVS ROL CWD JE JO MUL ROR DAA JG JP NEG SAHF DAS JGE JPE NOP SAL DEC JL JPO NOT SAR Директивы ассемблера ---------------------- ASSUME END EXTRN IFNB LOCAL PURGE COMMENT ENDIF GROUP IFNDEF MACRO RECORD DB ENDM IF IF1 NAME REPT DD ENDP IFB IF2 ORG SEGMENT DQ ENDS IFDEF INCLUDE OUT STRUC DT EQU IFDIF IRP PAGE SUBTTL DW EVEN IFE IRPC PROC TITLE ELSE EXITM IFIDN LABEL PUBLIC Прочие элементы языка ----------------------- BYTE FAR LENGTH MOD PRT THIS COMMENT GE LINE NE SEG TYPE CON GT LT NEAR SHORT WIDTH DUP HIGH LOW NOTHING SIZE WORD EQ LE MASK OFFSET STACK ПРИЛОЖЕНИЕ 4: РЕЖИМЫ АССЕМБЛИРОВАНИЯ И КОМПОНОВКИ ________________________________________________________________ Ассемблирование программы --------------------------- На дискете с ассемблерным пакетом имеются две версии ассемблера: ASM.EXE - сокращенная версия, в которой отсутствуют некоторые возможности, и MASM.EXE - полная версия, имеющая все возможности и являющаяся предпочтительной. Для ассемблирования вставьте ассемблерную дискету в дисковод А, а дискету с исходной программой - в дисковод В. Кто имеет винчестер или RAM-диск (виртуальный диск в памяти), могут в следующих примерах заменить соответствующие номера дисководов. Введите команды MASM (или ASM), что приведет к загрузке программы ассемблера с диска в память. На экране появится: source filename [.ASM]: object filename [filename.OBJ]: source listing [NUL.LST]: cross-reference [NUL.CRF]: Курсор при этом расположится в конце первой строки, где необходимо указать имя файла. Введите номер дисковода (если он не определен по умолчанию) и имя файла. Не следует набирать тип файла ASM - ассемблер подразумевает это. Во втором запросе предполагается аналогичное имя файла (но можно его заменить). Если необходимо, введите номер дисковода. Третий запрос предполагает, что листинг ассемблирования программы не требуется. Последний запрос предполагает, что листинг перекрестных ссылок не требуется. Для получения листинга на дисководе В введите В:. Если вы хотите оставить значения по умолчанию, то в трех последних запросах просто нажмите Return. Ниже приведен пример запросов и ответов, в результате которых ассемблер должен создать OBJ-, LST- и CRF-файлы на дисководе В: source filename [.ASM]:B:ASMPROG [Return] object filename [filename.OBJ]:B: [Return] source listing [NUL.LST]:B: [Return] cross-reference [NUL.CRF]:B: [Return] Альтернативный вариант вызова ассемблера: MASM B:name.ASM,B:name.OBJ,B:name.LST,B:name.CRF В следующей команде используются значения по умолчанию: MASM B:filename,B:,B:,В:; - первый параметр B:filename идентифицирует исходную программу, которая должна быть ассемблирована; - второй параметр В: указывает ассемблеру на необходимость записать объектный модуль на дисковод В под именем filename.OBJ; - третий параметр В: указывает ассемблеру на необходимость записать листинг ассемблирования на дисковод В под именем filename.LST; - четвертый параметр В: приводит к генерации файла перекрестных ссылок под именем filename.CRF; - Точка с запятой в конце команды указывает ассемблеру на необходимость игнорировать любые последующие параметры. Хотя в приведенном примере таких параметров нет, кодирование точки с запятой является хорошим правилом для других вариантов команды. При наличии ошибок ассемблирования программа ASM выдает только коды ошибок, которые объяснены в руководстве по Ассемблеру, в то время как программа MASM выдает и коды ошибок, и пояснения к ним. Всего имеется около 100 сообщений об ошибках. Режимы ассемблирования включают следующие: MASM /A организовать исходные сегменты в алфавитном порядке; MASM /D генерировать LST-файл в обоих проходах ассемблирования; MASM /E ассемблировать команды для сопроцессора 8087 и генерировать связи для языка ФОРТРАН и пакета эмуляции языка ПАСКАЛЬ; MASM /N отменить генерацию таблицы идентификаторов; MASM /R ассемблировать команды для сопроцессора 8087 (аналогично /E); MASM /S сохранить исходные сегменты в оригинальной последовательности. Файл перекрестных ссылок -------------------------- Генерируемый в ходе ассемблирования CRF-файл может использоваться для создания листинга перекрестных ссылок на метки, идентификаторы и переменные в программе. Для получения CRF-фала необходимо на четвертый запрос ассемблера ответить, например. В:, полагая, что файл должен быть создан на диске В: cross-reference [NUL.CRF]:B: [Return] Для преобразования полученного CRF-файла в удобно отсортированную таблицу перекрестных ссылок используется программа CREF, имеющаяся на ассемблерном диске. Введите команду CREF; на экране появится два запроса: Cref filename [.CRF]: List filename [cross-ref.REF]: На первый запрос введите имя CRF-файла, например B:ASMPROG. На второй запрос можно ввести только номер дисковода и получить имя по умолчанию. Такой выбор приведет к преобразованию CRF-файла в файл перекрестных ссылок по имени filename.REF на дисководе В. Можно также кодировать всю команду в одной строке, например: CREF В: filename. CRF, CON иди CREF B:filename.CRF,B: В первом примере файл перекрестных ссылок выводится на экран. Второй пример записывает файл по имени filename.REF на диск В. Компоновка программ --------------------- Для компоновки ЕХЕ-программы вставьте дискету DOS в дисковод А, а дискету с программой - в дисковод В. Те, кто имеют винчестер или RAM-диск (виртуальный диск в памяти), могут в следующих примерах заменить соответствующие номера дисководов. Простейший способ запуска компоновщика представляет ввод команды LINK, что приводит к загрузке компоновщика с диска в память. На экране появятся следующие запросы: Object Modules [.OBJ]: Run File [d:filename.ЕХЕ]: List File [NUL.MAP]: Libraries [.LIB]: Курсор при этом расположится в конце первой строки, где необходимо указать имя файла. Введите номер дисковода (если он не определен по умолчанию) и имя файла. Не следует набирать тип файла OBJ - компоновщик подразумевает это. Во втором запросе предполагается аналогичное имя файла (но можно его заменить). Если необходимо, введите номер дисковода. Третий запрос предполагает, что листинг компоновки программы не требуется. Последний запрос имеет отношение к библиотечным средствам DOS. Если вы хотите оставить значения по умолчанию, то в трех последних запросах просто нажмите Return. Ниже приведен пример запросов и ответов, в результате которых компоновщик должен создать файлы ЕХЕ и CON: Object Modules [.OBJ]:B:ASMPROG [return] Run File [d:filename.ЕХЕ]:В: [return] List File [NUL.MAP]:CON [return] Libraries [.LIB]: [return] Ответ CON приводит к выводу карты компоновки на экран для проверки на наличие сообщений об ошибках. Команду LINK можно сформировать также следующим образом: LINK B:ASMPROG,В:,CON Описание остальных режимов компоновщика LINK можно найти в руководстве no DOS. Программа ЕХЕ2ВIN ------------------- Программа EXE2BIN.COM в операционной системе DOS используется для преобразования ЕХЕ-модулей в СОМ-модули, при этом полагается, что программы подготовлены в соответствии с требованиями для СОМ-модулей. Для запуска программы EXE2BIN вставьте дискету DOS в дисковод А, а дискету с ЕХЕ-файлом - в дисковод В. Для винчестерского диска следует использовать дисковод С. Введите следующую команду: EXE2BIN B:filename,B:filename.COM Первым операндом является имя ЕХЕ-файла, которое вводится без указания типа. Второй операнд представляет собой имя СОМ-файла; здесь можно изменить имя программы, но обязательно следует указывать тип СОМ. После того как преобразование будет выполнено, можно удалить файлы OBJ и ЕХЕ. Ответы на некоторые вопросы __________________________________________________________________________ 1.1. а) 01001101; в) 00111111. 1.2. а) 0101; в) 10101. 1.3. а) 00100010; в) 00100000. 1.4. а) 11101101; в) 11000110. 1.5. а) 00111000; в) 10000000. 1.6. а) 51; в) 5D. 1.7. а) 23С8; в) 8000. 1.8. а) 13; в) 59; д) FFF. 1.9. а) Стек, данные и код; в) параграф. 1.l0. a) AX, BX, CX, DX, Dl, SI; в) AX и DX; д) флаги. 1.11.a) ROM (постоянная память выполняет процедуры начальной загрузки и управляет операциями ввода-вывода. б) RAM (оперативная память) представляет собой область, где находятся программы и данные при выполнении. 2.1. а) В82946. 2.2. Е CS:101 54. 2.3. a) MOV AX, 3004 ADD AX,3000 RET в) R и IP устанавливают IP в 0. 2.4. Произведение равно 0612Н. 2.6. Использовать команду N для указания имени программы (например, СОМ), установить длину программы в регистре CX и с помощью команды W записать программу. 3.1. TITLE и PAGE. 3.2. а), б) и в) корректны; г) неверно, так как начинается с цифры; д) корректно только при ссылке на регистр AX. 3.4. a) END; в) ENDS. 3.6. RET является командой, которая обеспечивает возврат в операционную систему; END является директивой, которая указывает ассемблеру, что в тексте более нет команд для ассемблирования. 3.7. ASSUME CS:CDSEG,DS:DATSEG,SS:STKSEG. 3.8. PUSH DS SUB AX, AX PUSH AX 4.1. а) Ввести команду MASM и ответить на запросы: В:TEMPY В:, В: и В: 4.2. a) DEBUG B:TEMPY.EXE; б) B:TEMPY 4.3. а) Резервная копия исходного файла; в) файл листинга ассемблирования с исходным и объектным кодом; д) файл объектного кода; ж) карта компоновки. 4.4. MOV AX,DATSEG MOV DS,AX 4.5. MOV AL,30H SHL AL,1 MOV BL,18H MUL BL 4.6. Сегмент данных должен выглядеть следующим образом: FLDA OB 28H FLDB DB 14H FLDC DW ? 5.1. а) 2; в) 10; д) 8. 5.2. CONAME DB 'RGB Electronics' 5.3. a) FLDA DD 73H в) FLDC DW ? д) FLDE DW 16, 19, 20, 27, 30 5.4. a) ASCII 3236; б) 1AH. 5.5. а) 26; в) ЗА732500. 5.6. a) MOV AX,320 в) ADD BX,40H д) SHL FLDB,1 (или SAL) 6.1. 64 К. 6.3. Это использует старшую область COM-программы или при недостатке памяти - старшие адреса оперативной памяти. 6.4. EXE2BIN SAMPLE,SAMPLE.COM. 7.1. +127 и -128. Операнд представляет собой однобайтовое значение от 00Н до 7FH (от 0 до + 127) и от 80Н до 0FFH (от -128 до -1). 7.2. а) 62В; в) 5ЕА (преобразует С6 в двоичное дополнение). 7.3. Приводим одно из многих возможных решений: MOV AX,00 MOV BX,01 MOV CX,12 MOV DX,00 В20: ADD AX,BX ;Номер в AX MOV BX,DX MOV DX,AX LOOP B20 7.4. а) CMP DX,CX в) JCXZ адрес д) CMP BX,AX JA адрес или CMP CX,0 JLE или JNG JZ адрес 7.5. a) OF (1); в) ZF (1); д) DF (1) 7.7. Первая (основная) процедура PROC должна иметь атрибут FAR, так как ее вызов и выполнение происходят из операционной системы. Атрибут NEAR указывает на то, что адрес процедуры находится внутри конкретной программы (т.е. в пределах одного сегмента ассемблерного модуля). 7.9. Три (по одному на каждый вызов CALL). 7.10.а) 1001 1010; в) 1111 1011; д) 0001 1100. 7.12.а) 01011100 11011100; в) 11001101 11001000. 8.1. Строка = 18Н, столбец = 27Н. 8.3. MOV AX,0600H ;3апрос MOV BH,07 ; функции MOV CX,OCOOH ; очистки MOV DX,164FH ; экрана INT 10Н 8.4. а) Вызов базовой функции DOS: MSSGE DB 'What Is the date (mm/dd/yy)?',07H,'$' MOV AH,09 ;Запрос функции MOV DX,MSSGE ;вывода сообщения INT 21H
Материалы находятся на сайте http://cracklab.narod.ru/asm/