Как изменить направление изменения содержимого индексных регистров

Работа по теме: Метода Лукьянова_Ассемблер. Глава: 10. Команды работы со строками. Предмет: Конструирование программ и языки программирования. ВУЗ: БГУИР.

прерываний, они (процедуры) объединяются в группы, вызываемые по прерыванию с одним и тем же номером. Подпрограммы одной группы называют функциями прерывания. Чтобы различать функции прерывания перед его вызовом в регистр AH заносится номер необходимой функции:

MOV AH,<номер функции>

INT <номер прерывания>

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

Ниже приведен пример использования прерывания 21H функции 02 для вывода символа на экран.

AH,02h

;AH

номер функции

MOV

MOV

DL,’a’

;DL

выводимый символ

INT

21h

;инициализация прерывания

Строкой в Ассемблере называют последовательность байтов или слов длинной от 1 до 65535 байт. Операции со строками обеспечивают пересылку, сравнение, сканирование строк по значению, а также пересылку строки в аккумулятор или из него. Каждая строковая операция представленная в процессоре двумя командами: одна предназначена для обработки строк состоящих из байт, другая – из слов (их мнемоника различается наличием буквы B (byte) или W (word)).

Если флаг направления DF перед выполнением команды строковой обработки установлен в 0 (выполнена команда CLD), значение в индексном регистре автоматически увеличивается, если в 1 (выполнена STD) – уменьшается. Индексные регистры уменьшаются или увеличиваются на 1, если команды работают с байтами, или на 2 – если со словами.

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

Команда сравнения строк CMPS (CMPSB, CMPSW).

Команда CMPS сравнивает значение элемента одной строки (DS:SI) со значением элемента второй строки (ES:DI) и настраивает значения регистров на следующие элементы строк в соответствии с флагом направления DF. Сравнение происходит так же, как и по команде сравнения CMP. Результатом операции является установка флагов.

57

Команда сканирования строки SCAS (SCASB, SCASW).

Команда SCAS производит сравнение содержимого регистра (AL или AX) с байтом или словом памяти, абсолютный адрес которого определяется парой ES:DI, после чего регистр DI устанавливается на соседний элемент памяти (байт или слово) в соответствии с флагом DF. Команда SCAS используется обычно для поиска в строке (ES:DI) элемента заданного в регистре AL или AX.

Команда пересылки строки MOVS (MOVSB, MOVSW).

Команда MOVS пересылает поэлементно строку DS:SI в строку ES:DI и настраивает значения индексных регистров на следующий элемент строки.

Команда сохранения строки STOS (STOSB, STOSW).

Команда STOS заполняет строку, содержащуюся по адресу ES:DI, элементом из регистра AL или AX. На флаги команда не влияет

Команда загрузки строки LODS (LODSB, LODSW).

Команда LODS записывает в регистр AL или AX содержимое ячейки памяти, адрес которой задается регистрами DS:SI. Флаги не меняются.

Префиксы повторения.

В системе команд процессора имеются команды без операндов, которые называются префиксами повторения:

REPE

(повторять, пока равно);

REPZ

(повторять, пока ноль);

REP

(повторять);

REPNE

(повторять, пока не равно);

REPNZ

(повторять, пока не ноль).

Префиксы повторения ставятся перед строковыми командами обязательно в той же строке, например:

REPE CMPB

Префикс использует регистр CX как счетчик циклов. На каждом этапе цикла выполняются следующие действия:

1)Проверка CX. Если он равен 0 – выход из цикла и переход к следующей команде.

2)Подтверждение любых возникающих прерываний.

3)Выполнение указанной строковой операции.

4)Уменьшение CX на единицу, флаги при этом не изменяются.

5)Проверка флага ZF, если выполняется строковая операция SCAS или CMPS. Если условие повторения цикла не выполняется – выход из цикла и переход к следующей команде. Выход из цикла, если префиксом является REPE и ZF=0 (последнее сравнение не совпало) или используется префикс REPNE и ZF=1 (последнее сравнение совпало).

58

6) Изменение значения индексных регистров в соответствии со значением флага направления и переход на начало цикла.

Фрагмент программы, иллюстрирующий работу со строковыми данными, приведен ниже.

CLD

SI,s1

;DF=0

LEA

;DS:SI=начало s1

LEA

DI,s2

;ES:DI=начало s2

MOV

CX,n

;CX=длинна строк

REPE

CMPSB

;сравнение, пока элементы равны

JNE

NoEq

;если s1<>s2 (ZF=0), то на NoEq

NoEq:

11. Команды управления процессором

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

Команда CLC устанавливает значение флага переноса CF, равное нулю. Все остальные флаги и регистры остаются неизменными.

Команда CMC изменяет значение флага переноса CF на противоположное. Другие флаги остаются без изменений.

Команда STC устанавливает флаг переноса в единицу.

Команда CLD очищает флаг направления DF. Все остальные флаги и регистры остаются неизменными. После выполнения CLD используемые строковые операции будут увеличивать индексный регистр (SI или DI).

Команда STD устанавливает флаг направления DF в единицу, что заставляет все последующие строковые операции уменьшать при их выполнении индексные регистр (SI или DI).

Команда CLI очищает флаг прерываний, в результате чего процессор не распознает внешние маскируемые прерывания.

Команда STI устанавливает флаг разрешения прерываний FI в единицу. После этого при завершении работы следующей команды процессор может выполнять обработку внешних прерываний, если эта команда снова не сбросит флаг прерываний.

59

Соседние файлы в предмете Конструирование программ и языки программирования

  • #

    15.09.20142.04 Кб161-ая лаба по КПиЯП — Из 9 в 17 СС.asm

  • #
  • #
  • #
  • #

    15.09.2014955.9 Кб43Образец оформления курсовой по КПиЯП.doc

  • #
  • #
 

Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению:

  • команды передачи данных
  • команды установки единичного бита
  • команды работы со стеком
  • команды ввода-вывода
  • арифметические команды
  • логические команды
  • сдвиговые команды
  • команды коррекции двоично-десятичных чисел
  • команды преобразования типов
  • команды управления флагами
  • команды прерываний
  • команды передачи управления
  • команды синхронизации работы процессора
  • команды побитового сканирования
  • строковые команды

Кроме базовой системы команд микропроцессора существуют также команды расширений:

  • X87 – расширение, содержащее команды математического сопроцессора (работа с вещественными числами)
  • MMX – расширение, содержащее команды для кодирования/декодирования потоковых аудио/видео данных;
  • SSE – расширение включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных;
  • SSE2 – модификация SSE, содержит инструкции для потоковой обработки целочисленных данных, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше;
  • SSE3, SSE4 – содержат дополнительные инструкции расширения SSE.

В таблице команд приняты следующие обозначения:
r – регистр
m – ячейка памяти
c – константа
8, 16, 32 – размер в битах
На все базовые команды процессора накладываются следующие ограничения:

  • Нельзя в одной команде оперировать двумя областями памяти одновременно. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
  • Нельзя оперировать сегментным регистром и значением непосредственно из памяти. Поэтому для выполнения такой операции нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек.
  • Нельзя оперировать двумя сегментными регистрами. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения. Например,

    mov ax,ds
    mov es,ax    ; es=ds

  • Нельзя использовать сегментный регистр CS в качестве операнда приемника, поскольку в архитектуре микропроцессора пара CS:EIP всегда содержит адрес команды, которая должна выполняться следующей. Изменение содержимого регистра CS фактически означало бы операцию перехода, а не модификации, что недопустимо.
  • Операнды команды, если это не оговаривается дополнительно в описании команды, должны быть одного размера.
Команды передачи данных

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

MOV приемник, источник

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

Команда Операнды Пояснение Описание
MOV r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8,c8
r(m)16,c16
r(m)32,c32
r(m)8=r8
r(m)16=r16
r(m)32=r32
r8=r(m)8
r16=r(m)16
r32=r(m)32
r(m)8=с8
r(m)16=с16
r(m)32=с32
Пересылка операндов
XCHG r(m)8, r8
r8, r(m)8
r(m)16,r16
r16, r(m)16
r(m)32, r32
r32, r(m)32
r(m)8 ↔r8
r8   ↔r(m)8
r(m)16↔r16
r16  ↔r(m)16
r(m)32↔r32
r32  ↔r(m)32
Обмен операндов
BSWAP r32 TEMP ← r32
r32[7..0]←TEMP[31..24]
r32[15..8]←TEMP[23..16]
r32[23..16]←TEMP[15..8]
r32[31..24]←TEMP[7..0]
Перестановка байтов из порядка «младший – стар­ший» в порядок «старший – млад­ший»
MOVSX r16, r(m)8
r32, r(m)8
r32, r(m)16
r16,r(m)8 DW ← DB
r32,r(m)8 DD ← DB
r32,r(m)16 DD ← DW
Пересылка с рас­ши­ре­ни­ем форма­та и дублирова­ни­ем знакового бита
MOVZX r16,r(m)8
r32,r/m8
r32,r/m16
r16,r(m)8 DW ← DB
r32,r(m)8   DD ← DB
r32,r(m)16  DD ← DW
Пересылка с рас­ши­ре­ни­ем форма­та и дублирова­ни­ем нулевого бита
XLATXLATB m8 AL=DS:[(E)BX+unsigned AL] Загрузить в AL байт из таблицы в сегменте данных, на начало которой указывает EBX (ВХ); начальное зна­чение AL игра­ет роль смещения
LEA r16, m
r32, m
r16=offset m
r32=offset m
Загрузка эффективного адреса
LDS r16,m16
r32,m16
DS:r=offset m Загрузить пару регистров из памя­ти
LSS SS:r=offset m
LES ES:r=offset m
LFS FS:r=offset m
LGS GS:r=offset m
Команды установки единичного бита

Проверяют условие состояния битов регистра EFLAGS и, если условие выполняется, то младший бит операнда устанавливается в 1, в противном случае в 0. Анализ битов производится аналогич­но условным перехо­дам.

Команда Операнды Пояснение
SETA
SETNBE
r(m)8 CF=0 и ZF=0
SETAE
SETNB
SETNC
CF=0
SETB
SETC
SETNAE
CF=1
SETBE
SETNA
CF=1 или ZF=1
SETE
SETZ
ZF=1
SETG
SETNLE
ZF=0 и SF=OF
SETGE
SETNL
SF=OF
SETL
SETNGE
SF!=OF
SETLE
SETNG
SF!=OF или ZF=1
SETNE
SETNZ
ZF=0
SETNO OF=0
SETNP
SETPO
PF=0
SETNS SF=0
SETO OF=1
SETP
SETPE
PF=1
SETS SF=1
Команды работы со стеком
Команда Операнды Пояснение Описание
PUSH r(m)32
r(m)16
c32
ESP=ESP-4; SS:ESP=r(m)32/c
SP=SP-2; SS:SP=r(m)16
Поместить операнд в вершину стека
POP r(m)32
r(m)16
r(m)32=SS:ESP; ESP=ESP+4
r(m)16=SS:SP; SP=SP+2;
Извлечь операнд из вершины стека
PUSHA
PUSHAD
r(m)32
r(m)16
Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
POPA
POPAD
Извлечь из стека содержимое и заполнить регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
PUSHF Поместить в вершину стека регистр EFLAGS
POPF Извлечь содержимое вершины стека и заполнить регистр EFLAGS
Команды ввода-вывода

Микропроцессор может передавать данные в порты ввода-вывода, которые поддерживаются аппаратно и используют соответствующие своим предназначениям линии ввода-вывода процессора. Аппаратное адресное пространство ввода-вывода процессора не является физическим адресным пространством памяти. Адресное пространство ввода-вывода состоит из 64Кбайт индивидуально адресуемых 8-битных портов ввода-вывода, имеющих адреса 0…FFFFh. Адреса 0F8h…0FFh являются резервными. Любые два последовательных 8-битных порта могут быть объединены в 16-битный порт, 4 последовательных 8-битных порта – в 32-битный порт.

Команда Операнды Пояснение Описание
IN AL,c8
AX,c8
EAX,c8
AL,DX
AX,DX
EAX,DX
AL= port byte
AX= port word
EAX= port dword
AL= [DX-port]
AX= [DX-port]
EAX= [DX-port]
Ввод из порта
OUT c8, AL
c8, AX
c8, EAX
DX, AL
DX, AX
DX, EAX
port byte=AL
port word=AX
port dword=EAX
[DX-port]=AL
[DX-port]=AX
[DX-port]=EAX
Вывод в порт
INSB
INSW
INSD
ES:(E)DI = [DX-port] Вводит данные из порта, адресуемого DX в ячейку памяти ES:[(E)DI]. После ввода 1, 2 или 4-байтного слова данных EDI/DI корректируется на 1,2,4. При наличии префикса REP процесс продолжается, пока EСХ>0
OUTSB
OUTSW
OUTSD
[DX-port]=DS:(E)SI Выводит данные из ячейки памяти, определяемой регистрами DS:[(E)SI], в порт, адрес которого находится в DX. После вывода данных производится коррекция указателя ESI/SI на 1,2 или 4
Команды целочисленной арифметики
Команда Операнды Пояснение Описание
ADD r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8+с8
r(m)16=r(m)16+с16
r(m)32=r(m)32+c32
r(m)8=r(m)8+r8
r(m)16=r(m)16+r16
r(m)32=r(m)32+r32
r8=r8+r(m)8
r16=r16+r(m)16
r32=r32+r(m)32
Сложение целых чисел
ADC Сложение целых чисел с учетом флага переноса CF
INC r(m)8
r(m)16
r(m)32
r/m8=r/m8±1
r(m)16=r(m)16±1
r(m)32=r(m)32±1
Увеличение на 1
DEC Уменьшение на 1
SUB r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8-с8
r(m)16=r(m)16-с16
r(m)32=r(m)32-c32
r(m)8=r(m)8-r8
r(m)16=r(m)16-r16
r(m)32=r(m)32-r32
r8=r8-r(m)8
r16=r16-r(m)16
r32=r32-r(m)32
Вычитание целых чисел
SBB Вычитание с учетом флага переноса CF
CMP r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8-с8
r(m)16-с16
r(m)32-c32
r(m)8-r8
r(m)16-r16
r(m)32-r32
r8-r(m)8
r16-r(m)16
r32-r(m)32
Сравнение целых чисел
По результату сравнения устанавливаются флаги
CF PF
AF ZF
SF OF
NEG r(m)8
r(m)16
r(m)32
r(m)8=-r(m)8
r(m)16=-r(m)16
r(m)32=-r(m)32
Изменение знака числа
MUL r(m)8
r(m)16
r(m)32
AX=AL*r(m)8
DX:AX=AX*r(m)16
EDX:EAX=EAX*r(m)32
Умножение без знака
IMUL r(m)8
r(m)16
r(m)32
r16,r(m)16
r32,r(m)32
r16,r(m)16,c
r32,r(m)32,c
r16,c
r32,c
AX=AL*r(m)8
DX:AX=AX*r(m)16
EDX:EAX=EAX*r(m)32
r16=r16*r(m)16
r32=r32*r(m)32
r16=r(m)16*c16
r32=r(m)32*c32
r16=r16*c16
r32=r32*c32
Умножение со знаком
DIV r(m)8
r(m)16
r(m)32
AL=AX/r(m)8, AH=mod
AX=DX:AX/r(m)16, DX=mod
EAX=EDX:EAX/r(m)32, EDX=mod
Деление без знака
IDIV Деление со знаком

Особого внимания среди рассмотренных команд целочисленной арифметики заслуживает команда CMP, которая вычитает второй операнд из первого и не сохраняет результат, а устанавливает биты OF, SF, ZF, AF, PF, CF регистра признаков EFLAGS в соответствии с результатом. Команда CMP чаще всего предшествует командам знакового или беззнакового условных переходов.

Логические команды

Выполнение логических операций описано здесь

Команда Операнды Пояснение Описание
AND r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8 Ф с8
r(m)16=r(m)16 Ф с16
r(m)32=r(m)32 Ф c32
r(m)8=r(m)8 Ф r8
r(m)16=r(m)16 Ф r16
r(m)32=r(m)32 Ф r32
r8=r8 Ф r(m)8
r16=r16 Ф r(m)16
r32=r32 Ф r(m)32
Логическое умножение (И), конъюнкция
OR Логическое сложение (ИЛИ), дизъюнкция
XOR Исключающее ИЛИ
NOT r(m)8
r(m)16
r(m)32
r(m)8=~r(m)8
r(m)16=~r(m)16
r(m)32=~r(m)32
Логическое отрицание (НЕ), инверсия
TEST r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8 & с8
r(m)16 & с16
r(m)32 & с32
r(m)8 & r8
r(m)16 & r16
r(m)32 & r32
r8 & r(m)8
r16 & r(m)16
r32 & r(m)32
Логическое умножение без сохранения результата. В соответствии с результатом устанавливаются флаги
PF ZF SF
Сдвиговые команды

Выполнение сдвиговых операций в языке Си рассмотрено здесь.

Команда Операнды Пояснение Описание
SHR r(m)8
r(m)8,CL
r(m)8,с
r(m)16
r(m)16,CL
r(m)16,c
r(m)32
r(m)32,CL
r(m)32,c
r(m)8 на 1 раздяд
r(m)8 на CL разрядов
r(m)8 на с разрядов
r(m)16 на 1 разряд
r(m)16 на CL разрядов
r(m)16 на c разрядов
r(m)32 на 1 разряд
r(m)32 на CL разрядов
r(m)32 на c разрядов
Логический сдвиг вправо
SAR Арифметический сдвиг вправо (старшие разряды заполняются значением знакового)
SHL
SAL
Логический (арифметический) сдвиг влево
ROR Циклический сдвиг вправо
ROL Циклический сдвиг влево
RСR Циклический сдвиг вправо через перенос
RCL Циклический сдвиг влево через перенос

Команды циклического сдвига выполняются в соответствии со схемой
Команды циклического сдвига

Команды коррекции двично-десятичных чисел

Команды коррекции двоично-десятичных чисел не имеют операндов и используют операнд по умолчанию, хранящийся в регистре AX (паре регистров AH:AL).

Команда Пояснение Описание
AAA

if((AL&0Fh)>9 || AF) {

  AH=AH+1;

  AL=(AL+6) & 0Fh;

  CF:=1; AF:=1;}

Коррекция AX после сложения двух неупакованных двоично-десятичных чисел
AAS

if((AL&0Fh)>9)|| AF) {

  AH=AH-1;

  AL=(AL-6)& 0Fh;

  CF=1; AF=1;}

Коррекция AX после вычитания двух неупакованных двоично-десятичных чисел
AAM

AH=AL/10;
AL=AL%10;

Коррекция AX после умножения двух неупакованных двоично-десятичных чисел
AAD

AL=AH*10+AL;
AH=0;

Коррекция AX перед делением двух неупакованных двоично-десятичных чисел
DAA

old_AL = AL;
old_CF = CF;
if(((AL & 0x0F)>9) || AF==1) {

  AL = AL + 6;

  CF = old_CF | CF;

  AF = 1;}
else

  AF = 0;
if((old_AL > 99h) || (CF==1)) {

  AL = AL + 60h;

  CF = 1;}
else

  CF = 0;

Коррекция AL после сложения двух упакованных двоично-десятичных чисел
DAS

old_AL = AL;
old_CF = CF;
if(((AL & 0x0F)>9) || AF==1) {

  AL = AL — 6;

  CF = old_CF | CF;

  AF = 1;}
else

  AF = 0;
if((old_AL > 99h) || (CF==1)) {

  AL = AL + 60h;

  CF = 1;}
else

  CF = 0;

Коррекция AL после вычитания двух упакованных двоично-десятичных чисел
Команды преобразования типов

Команды преобразования типов предназначены для корректного изменения размера операнда, заданного неявно в регистре-аккумуляторе (EAX, AX, AL). Непосредственно после аббревиатуры команды операнд не указывается.

Команда Пояснение Описание
CBW AX=(DW)AL 2 байта ← 1 байт
CWDE EAX=(DD)AX 4 байта ← 2 байта
CWD DX:AX=(DD)AX 4 байта ←  2 байта
CDQ EDX:EAX=(DQ)EAX 8 байт ← 4 байта
Команды управления флагами

Команды управления флагами предназначены для сброса или установки соответствующего бита регистра признаков EFLAGS. Команды управления флагами не имеют операндов.

Команда Пояснение Описание
CLC CF = 0 Сброс бита переноса
CLD DF=0 Сброс бита направления
CMC CF=!CF Инверсия бита переноса
STC CF=1 Установка бита переноса
STD DF=1 Установка бита направления
STI IF=1 Установка бита прерывания
Команды прерываний

Команды прерываний предназначены для управления программными прерываниями.
Прерывание – это, как правило, асинхронная остановка работы процессора, вызванная началом работы устройства ввода-вывода. Исключением являются синхронные прерывания, возникающие при определении некоторых предопределенных условий в процессе выполнения команды.
Когда поступает сигнал о прерывании, процессор останавливает выполнение текущей программы и переключается на выполнение обработчика прерывания, заранее записанного для каждого прерывания.
Архитектура IA-32 поддерживает 17 векторов аппаратных прерываний и 224 пользовательских.
Команда INT вызывает обработчик указанного операндом прерывания (константой). Операнд определяет номер вектора системного прерывания BIOS от 0 до 255, представленный в виде беззнакового 8-битного целого числа. При вызове обработчика прерывания в стеке сохраняются регистры EIP, CS и EFLAGS.
Прерывание по переполнению вызывается отдельной командой INTO и имеет вектор 04h.

Команда Пояснение Описание
INT с EIP → стек
CS → стек
EFLAGS → стек
переход к вектору c
Программное прерывание
INTO OF=1 Прерывание по переполнению
IRET EFLAGS ← стек
CS ← стек
EIP ← стек
возврат
Возврат из обработчика прерывания
Команды передачи управления
Команда Операнды Пояснение Описание
JMP метка
r(m)16
r(m)32
метка
адрес в r(m)16
адрес в r(m)32
Безусловный переход на адрес, указанный операндом

Команды обращения к процедуре (функции)

Команда Операнды Пояснение Описание
CALL метка
r(m)16
r(m)32
метка
адрес в r(m)16
адрес в r(m)32
Вызов процедуры, указанной операндом
RET
c16

Удаляет из стека c16 байт
Возврат из процедуры

Команды поддержки языков высокого уровня

Команда Операнды Пояснение Описание
ENTER c16, c8 PUSH EBP
MOV EBP, ESP
Подготовка стека при входе в процедуру. Константа с16 указывает количество байт, резервируемых в стеке для локальных идентификаторов, константа с8 определяет вложенность процедуры
LEAVE POP EBP Приведение стека в исходное состояние
BOUND r16, m16&16
r32, m32&32
m16<r16<m16&16
m32<r16<m32&32
Проверка индекса массива: сравнивает значение в регистре, заданном первым операндом с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой вторым операндом.

Команды организации циклов — используют регистр ECX по умолчанию в качестве счетчика числа повторений цикла. Каждый раз при выполнении команды LOOPсс значение регистра ECX уменьшается на 1, а затем сравнивается с 0. Если ECX=0, выполнение цикла заканчивается, и продолжает выполняться код программы, записанный после команды LOOPcc. Если ECX содержит ненулевое значение, то осуществляется переход по адресу операнда команды LOOPcc.

Команда Операнды Пояснение Описание
LOOP метка

ECX=ECX-1;
if(CX>=0) EIP=метка;

Переход если ECX>0
LOOPE
LOOPZ

ECX=ECX-1;
if(ECX>0 && ZF==1)

  EIP=метка;

Переход если ECX>0 и ZF=1
LOOPNE
LOOPNZ

ECX=ECX-1;
if(ECX>0 && ZF==0)

  EIP=метка;

Переход если ECX>0 и ZF=0

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

Команда Операнды Пояснение Описание
JCXZ метка

if(ECX==0)
EIP=метка;

Переход при ECX=0
JC

if(CF==1)
EIP=метка;

Переход при переносе (CF=1)
JNC

if(CF==0)
EIP=метка;

Переход при отсутствии переноса (CF=0)
JS

if(SF==1)
EIP=метка;

Переход при отрицательном результате (SF=1)
JNS

if(SF==0)
EIP=метка;

Переход при неотрицательном результате (SF=0)
JE
JZ

if(ZF==1)
EIP=метка;

Переход при нулевом результате (ZF=1)
JNE
JNZ

if(ZF==0)
EIP=метка;

Переход при ненулевом результате (ZF=0)
JP
JPE

if(PF==1)
EIP=метка;

Переход по четности (PF=1)
JNP
JPO

if(PF==0)
EIP=метка;

Переход по нечетности (PF=0)
JO
JNZ

if(OF==1)
EIP=метка;

Переход при переполнении (OF=1)
JNO
JNZ

if(OF==0)
EIP=метка;

Переход при отсутствии переполнения (OF=0)

Беззнаковые переходы предназначены для сравнения беззнаковых величин и, как правило, используются непосредственно после команды сравнения CMP:

cmp m1, m2 ; сравнение m1 и m2, m1-m2

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

  • A (above) — выше;
  • B (below) — ниже;
  • E (equal) — равно.
Команда Операнды Пояснение Описание
JB
JNAE
метка

cmp m1,m2
if(CF==1)

  EIP=метка;

Переход если ниже:
m1<m2
JBE
JNA

cmp m1,m2
if(CF==1 || ZF==1)

  EIP=метка;

Переход если не выше: m1<=m2
JAE
JNB

cmp m1,m2
if(CF==0)

  EIP=метка;

Переход если не ниже: m1>=m2
JA
JNBE

cmp m1,m2
if(CF==0 && ZF==0)

  EIP=метка;

Переход если выше: m1>m2

Знаковые переходы предназначены для сравнения знаковых величин и, как правило, используются непосредственно после команды сравнения CMP:

cmp m1, m2 ; сравнение m1 и m2, m1-m2

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

  • L (less) — меньше;
  • G (greater) — больше;
  • E (equal) — равно.
Команда Операнды Пояснение Описание
JL
JNGE
метка

cmp m1,m2
if(SF != OF)

  EIP=метка;

Переход если меньше:
m1<m2
JLE
JNG

cmp m1,m2
if((SF != OF) || ZF==1)

  EIP=метка;

Переход если не больше: m1<=m2
JGE
JNL

cmp m1,m2
if(SF==OF)

  EIP=метка;

Переход если не меньше: m1>=m2
JG
JNLE

cmp m1,m2
if((SF==OF) && ZF==0)

  EIP=метка;

Переход если больше: m1>m2
Команды синхронизации работы процессора
Команда Описание
HLT Остановка процессора до внешнего прерывания
LOCK Префикс блокировки шины. Заставляет процессор сформировать сигнал LOCK# на время выполнения находящейся за префиксом команды. Этот сигнал блокирует запросы шины другими процессорами в мультипроцессорной системе
WAIT Ожидание завершения команды сопроцессора. Большинство команд сопроцессора автоматически вырабатывают эту команду
NOP Пустая операция
CPUID Получение информации о процессоре. Возвращаемое значение зависит от параметра в EAX
Команды побитового сканирования
Команда Операнды Описание
BSR r16,r(m)16
r32,r(m)32
Ищет 1 в операнде 2, начиная со старшего бита. Если 1 найдена, ее индекс записывается в операнд 1
BSF Ищет 1 в операнде 2, начиная со младшего бита. Если 1 найдена, ее индекс записывается в операнд 1
BT r(m)16,r16
r(m)32,r32
r(m)16,c8
r(m)32,c8
Тестирование бита с номером из операнда 2 в операнде 1 и перенос его значения во флаг CF.
BTC Тестирование бита с номером из операнда 2 в операнде 1 и перенос его значения во флаг CF с инверсией.
BTR Тестирование бита с номером из операнда 2 в операнде 1 и перенос его значения во флаг CF. Само значение бита сбрасывается в 0
BTS Тестирование бита с номером из операнда 2 в операнде 1 и перенос его значения во флаг CF. Само значение бита устанавливается в 1
Строковые команды

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

  • операнд-источник адресуется регистром ESI внутри сегмента, на который указывает DS.
  • операнд-источник адресуется регистром EDI внутри сегмента, на который указывает ES.
Команда Операнды Пояснение Описание
MOVSB 1 байт ES:EDI = DS:ESI Копирование строки
MOVSW 2 байта
MOVSD 4 байта
LODSB 1 байт AL = DS:ESI Загрузка строки
LODSW 2 байта AX = DS:ESI
LODSD 4 байта EAX = DS:ESI
STOSB 1 байт ES:EDI = AL Сохранение строки
STOSW 2 байта ES:EDI = AX
STOSD 4 байта ES:EDI = EAX
SCASB 1 байт поиск AL в ES:EDI Поиск данных в строке
SCASW 2 байта поиск AX в ES:EDI
SCASD 4 байта поиск EAX в ES:EDI
CMPSB 1 байт поиск DS:ESI в ES:EDI Поиск данных в строке
CMPSW 2 байта
CMPSD 4 байта

Перед выполнением строковых команд содержимое индексных регистров ESI, EDI должно быть проинициализировано. Сегментные регистры DS, ES должны указывать на соответствующие сегменты данных.

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

REP MOVSB

Здесь префикс REP сообщает процессору о том, что команда MOVSB должна повторяться. Максимальное количество повторений задается до вызова строковой команды в регистре ECX. Каждое выполнение строковой команды уменьшает содержимое регистра ECX на 1 и результат сравнивает с 0. В случае если ECX=0 выполнение повторяющейся строковой команды прекращается, и продолжается выполнение оставшейся части программы. Каждое повторение строковой команды также изменяет содержимое используемых индексных регистров (ESI, EDI) на размер операнда, заданный в команде (1, 2 или 4 байта). Направление модификации индексных регистров задается битом направления DF:

  • DF=0: содержимое используемых индексных регистров увеличивается на размер операнда при каждом повторении.
  • DF=1: содержимое используемых индексных регистров уменьшается на размер операнда при каждом повторении.

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

Префикс Команды, с которыми используется Описание
REP MOVS*
LODS*
STOS*
Повторение
REPE
REPZ
SCAS*
CMPS*
Повторение пока операнды равны
REPNE
REPNZ
SCAS*
CMPS*
Повторение пока операнды не равны

Назад

Назад: Язык ассемблера

Ассемблер основы

  • Самое главное в процессоре это регистры
  • Регистры в общем понимании являются переменными для работы процессора

Регистры общего назначения (EAX, EBX, ECX, EDX)

EAX, EBX, ECX, EDX (32bit регистры).

Младшие от 32bit : AX, BX, CX, DX (16bit делятся ещё на 2 части)

От 16bit :

  • Младшие : AL, BL, CL, DL (8bit)
  • Старшие : AH, BH, CH, DH (8bit)

Регистры указатели (EIP, ESP, EBP, ESI, EDI)

EIP, ESP, EBP, ESI, EDI (32bit)

  • Младшие : IP, SP, BP, SI, DI (16bit)
  • Старшие : CS, DS, ES, FS, GS, SS (16bit)

Сегментные регистры (CS, DS, ES, FS, GS, SS)

CS, DS, ES, FS, GS, SS (16bit) — Содержат первую половину «оффсет.сегмента-а»

Регистр флагов

  • Регистр флагов — Хранилище битовой информации, каждый из 32 бит важен по отдельности
  • Каждый бит кроме одного парного обозвали флагом
  • Eflags (32bit) : Flags (16bit)
  • Нельзя просто записать значение(mov)
  • Нет имени обращения

Флаги процессора

  • ZF (Zero Flag — флаг нуля) : Устанавливается в 1, если результат предыдущей операции = 0. Самое интересное, что флаг нуля переключается при сравнении переменных (команда CMP)
  • SF — флаг знака : Всегда равен старшему биту результата
  • CF — флаг переноса : Устанавливается в 1, если результат предыдущей операции над беззнаковыми числами не уместился в приёмник и прозошел перенос из старшего бита, или если требуется заем (при вычитании), иначе CF = 0
  • OF — флаг переполнения : OF = 1, если результат пред. ариф. операции над числами со знаком выходит за допустимые для них пределы
  • AF — флаг полупереноса : AF = 1, если в результате пред. операции произошел перенос или заем из третьего бита в четвертый.
  • PF — флаг четности : PF = 1, если младший байт результата пред. команды содержит четное число битов, равных единице, инчае 0.
  • IF — флаг прерываний : 1 — прерывание разрешены, 0 — запрещены
  • DF — флаг направления : 0 — строки обрабатываются в сторону увеличения адресов, 1 — в сторону уменьшения адресов.

Описание Регистров

  • **E — Extended
  • EAX (Accumulator)
  • EBX (Base)
  • ECX (Counter)
  • EDX (Data)
  • EBP (Base Pointer) — Указатель базы
  • ESP (Stack Pointer) — Указатель стека
  • ESI (Source Index) — Индекс источника
  • EDI (Deliver Index) — Индекс приемника
  • EIP (Instruction Pointer) — Регистр адреса текущей машинной команды (всегда содержит адрес след.команды процессора)

Операнд в квадратных скобках — [bx], [si], [di]

  • Когда операнд находится в квадратных скобках ([BX], [SI], [DI]), это означает что нужно производить действие по адресу в памяти, указанному операндом (BX, SI, DI).
mov  dword ptr [ВX],04030201h ; Поместить в память по адресу 0133h 
                              ; значение 01020304h размером в 4 байта

add  dword ptr [BX],30303030h ; Прибавить к 4 байтам в памяти по адресу 0133h
                              ; значение 30303030h, размером в 4 байта.

СТЕК

  • Специально выделенная область памяти для передачи или сохранения данных.
  • Стек растет вверх, дно стека по самому старшему адресу, вершина по младшему
  • Значения извлекаются в обратном порядке
  • На вершину стека указывает регистр-указатель ESP — это его значение
  • Если в программе нужно много раз сохранять разные регистры, то лучше делать это через стек.
  • Для записи в стек есть команда PUSH
  • Для извлечения из стека команда POP

КОМАНДЫ

MOV

  • Синтаксис — MOV приемник, источник приемник = источник
  • MOV — Копирует содержимое источника в приемник. (не может передавать данные между двумя адресами ОП)
    Пример :
mov ah, bh ; поместить значение регистра BH в регистр AH
mov ch, 09 ; поместить значение 9 в регистр CH

NOP

  • NOP — Команда ничего не делать

ADD

  • Синтаксис — ADD приемник, источник
  • ADD — Прибавляет значение источника к приемнику : приемник = приемник + источник
  • Для увеличения всего на еденицу используется команда INC

Пример :

add ah, bh ; прибавить значение регистра BH в регистр AH
add ch, 09 ; прибавить значение 9 в регистр CH
add eax, eax ; прибавить eax к самому себе (удвоить значение)

ADC приемник, источник (сложение повышенной точности приемника, источника и флага CF)

SUB

  • Синтаксис — SUB приемник, источник
  • SUB — Прибавляет значение источника к приемнику : приемник = приемник — источник
  • Для уменьшения всего на еденицу используется команда DEC

Пример :

sub ah, bh ; отнять значение регистра BH из регистра AH
sub ch, 09 ; отнять значение 9 из регистра CH
sub eax, eax ; обнулить значение регистра eax

SBB приемник, источник (вычитание из приемника,значения источника и флага CF)

Операции сдвига SHL, SHR (сдвиг влево, сдвиг вправо)

  • Синтаксис — SHL регистр, 10h
  • Синтаксис — SHR регистр, 10h
  • SHL — Сдвигает 2 младших байта на позиции 2-х старших байт (сдвиг влево)
  • SHR — Сдвигает 2 старших байта на позиции 2-х младших байт (сдвиг вправо)
; Если регистр EAX = 0000BBBB

shl eax, 10h ; eax станет равен ВВВВ0000
shr eax, 10h ; eax станет снова равен 0000BBBB

CMP — compare (сравнивать)

  • Синтаксис — CMP операнд1, операнд2
  • Сравнивает два операнда путем вычитания второго от первого
  • Результат может изменять 6 флагов (Eflags)
  • Операнды не меняются
mov ah, 10h  ; в AH значение 10h
cmp ah, 8    ; ZF = 0
cmp ah, 10h  ; ZF = 1
cmp ah, 0A0h ; ZF = 0

JMP — Jump (Переход)

  • Синтаксис JMP адрес
  • Смена EIP на указанный адрес, переход туда
jmp 000000005
jmp 0aef41e0d

JNZ (она же JNE) — Jump if Not Zero (Переход на адрес если не ноль)

  • Синтаксис JNZ адрес
  • Синтаксис2 JNE адрес
  • Если ZF=0, то действует как JMP (смена EIP на указанный адрес, переход туда)
  • Если ZF=1, то действие как у NOP (смена EIP на адрес след. команды)
  • Команда противоположнего действия для JZ(JE)
jne 000000005
jnz 000000005

XOR — eXclusive OR — исключающее ИЛИ

  • Синтаксис XOR приемник, источник
  • Побитовое исключающее или.
  • Если сравниваемые биты равны, то результат равен 0
  • Если сравниваемые биты не равны, то результат равен 1
  • Команда XOR обратима. Это значит, что поXORив её результат с одним из операндов, мы получим второй операнд.
xor eax, eax  ; обнуление регистра eax

INC — increment (увеличение на 1)

  • Синтаксис INC operand
  • Увеличение операнда на еденицу

DEC — decrement (уменьшение на 1)

  • Синтаксис DEC operand
  • Уменьшение операнда на еденицу

PUSH — (положить в стек) ESP — регистр указывающий на вершину стека

  • Синтаксис PUSH register
  • Добавляет новое значение на вершину стека
  • Если нужно положить в стек все 8 РОН используется команда PUSHA/PUSHAD
push eax 			; положить в стек из регистра eax
push 00403021 ; положить в стек

POP — (извлечь из стека) ESP — регистр указывающий на вершину стека

  • Синтаксис POP register
  • Извлекает верхнее значение из стека
  • Если нужно достать из стека все 8 РОН используется команда POPA/POPAD
pop eax 	; извлечь из стека в eax
pop ebx		; извлечь из стека в ebx

XCHG операнд1, операнд2 (обменивает операнды местами)

						; если   al=45, ah=37
xchg al,ah 	; будет  al=37, ah=45

AND|OR приемник,источник (логическое побитовое И|ИЛИ результат в приемник)

  • Часто используется для выборочного обнуления|объединения отдельных битов.
and al, 00001111b  ; обнулит старшие 4 бита регистра al, а младшие не изменит

TEST операнд1, операнд2 (выполняет команду and, опернды не меняет, меняет только флаги)

NOT приемник — Инверсия (каждый бит приемника, равный нулю, устанавливается в 1 и наоборот)


С этим файлом связано 4 файл(ов). Среди них: lb6.docx, lb9.docx, PRAKTIChESKAYa5.docx, asembler_2.docx.
Показать все связанные файлы


Подборка по базе: _Рабочая программа Spotlight 5 на 2022 — 2023 (ФГОС-3)_.pdf, Рабочая программа ID2245929.docx, Рабочая программа + КТП для 7 класса под редакцией Казакевича В., Рабочая программа по русскому языку 6 класс ID3008333.pdf, Рабочая программа внеурочной деятельности _Дорога в страну профе, c_Памятка Сигналиста (с изменением).pdf, рабочая программа НП-1.docx, Рабочая программа по русскому языку 8 клID4914435.pdf, Федеральная рабочая программа_Русский язык_НОО.pdf, Восп программа 01.10.15 (2).doc


Практическая работа №1

Тема: Программа Debug. Изменение содержимого регистров. Команды программы Debug и определение форматов команд.

Цель работы:

  1. Знакомство с регистрами процессора через программу Debug, изучение команд программы Debug. Присваивание регистру любого значения. Изменение содержимого регистров процессора.

  2. Знакомство с командой Assembler, Unassembled, Display и определение форматов команд. «Копирование» содержимого одного регистра в другой.

Ход работы:

  1. Задание: Вызов программы Debug.

Вызвать программу Debug: для этого в командной строке DOS набрать слово debug. После каждой команды нажимать Enter:
Рисунок 1 – Вызвал программу Debug

  1. Теория: Команда: —R (Register) –отображает на экране содержимого всех регистров, адрес текущей ячейки, машинный код команды и команду для выполнения.

Команда: Rm –отображение на экране содержимого регистра m, где m имя регистра.
Задание: Если мы хотим изменить значение одного из регистров, мы вводим R и имя регистра. Давайте поместим в AX слово * CHRT

_R AX


Рисунок 2 – поместил в
AX слово CHRT

На экране:

AX 0000

:

  «:» — это приглашение ввести новое значение. Мы отвечаем *CHRT

:* CHRT

На экране:

^Error

  Debug выдал сообщение об ошибке, т.к. * CHRT не шестнадцатеричное. Попробуйте ввести D3E0:

_R AX

AX 0000

:D3E0

Вы увидите, что ничего не изменилось кроме регистра AX. Ему присвоили новое значение. 

  1. Теория: Еще один важный момент: команда Register может использоваться только для 16-битных регистров (AX, BX и т. д.). Она не может изменять значения 8-битных регистров (AH, AL, BH и т. д.). Например, чтобы изменить AH, вы должны ввести новое значение в регистр AX с новым AH и старым значением AL.
  2. Задание: Вывести на экран все регистры.

    Рисунок 3 – вывел все регистры
  1. Запишите содержимое всех регистров. Назовите все отображенные регистры и выучите их:

AXD3E0 умножение, деление и вводвывод слов

BX 0000 перекодирование

CX 0000 операции со строками, циклы

DX 0000 умножение и деление слов, неявный вводвывод

SP- FFEE операция со стеком

BP- 0000

SI 0000 операции со строками

DI 0000 операции со строками

DS 1397 Сегмент данных

ES 1397 сегмент промежуточных данных

SS – 1397 сегмент стека

CS 1397 сегмент кода

IP 0100

  1. Назовите регистры общего назначения: D3E0, 0000, 0000, FFEE, 0000, 0000,
  1. Укажите адрес текущей ячейки: AX

    Рисунок 4 – адрес текущей ячейки

    Рисунок 5 – Присвоил значение регистру
  2. С помощью лекций расшифруйте и изучите состояния флагов, определяющих режим работы процессора:
Наименование флага На экране мнемокоды
OF OV(да) NV(нет)
DF DN(ум) UP(увел)
IF EI(вкл) DI(выкл)
SF NG(отр) PL(полож)
ZF ZR(да) NZ(нет)
AF AC(да) NA(нет)
PF PE(чет) PO(нечет)
CF CY(да) NC(нет)

С помощью команды _RF — измените значения флагов на противоположные. Запишите действия: (новые значения флагов вводим через пробел)

Рисунок 6 – изменил значения флагов

  1. Ввод команд в Ассемблере: Теория:

    Рисунок 7 – ввел командыасемблер

    sub – команда целочисленного вычитания. Производит вычитание значений одного операнда из значения другого.
    mov – назначение: пересылка данных между регистрами или регистрами и памятью.
    nop – ничего не делает

  2. Введите команду U (unassemble), которая преобразовывает программу в машинные коды:

U100L9

где 100 адрес первой команды, L9 длина программы, равная количеству байт в программе. Запишите машинные шестнадцатеричные коды команд в ряд:

  1. Теория: Введите команду D (dump), которая выводит программу из памяти в машинных кодах:

D100L9

где 100 адрес первой команды, L9 длина программы, равная количеству байт в программе.
Сравните машинный коды этой программы пункт 12 с пунктом 13.

  1. Расшифруйте символики команд, напишите соответствующие им команды на ассемблере: (Смотреть приложение I):

Вывод: __________________________________________________________________________________________________________________________________

Понравилась статья? Поделить с друзьями:
  • Как изменить направление вращения ушм
  • Как изменить направление вращения ротора трехфазного асинхронного электродвигателя
  • Как изменить направление вращения результирующего магнитного поля статора ад
  • Как изменить направление вращения однофазного электродвигателя переменного тока
  • Как изменить направление вращения однофазного двигателя вентилятора