Outs/outsb/outsw/outsd
(OUTput Byte/Word/Double word String to port)
Вывод строки байтов/слов/двойных слов в порт
Схема команды: | outs порт,источник outsb outsw outsd |
Назначение: вывод в порт из памяти последовательности байт, слов, двойных слов.
Синтаксис
Алгоритм работы:
- передать данные в порт ввода-вывода, номер которого загружен в регистр dx, из ячейки памяти по адресу ds:esi/si;
- в зависимости от состояния флага df изменить значение регистров esi/si:
- если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;
- если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;
- при наличии префикса выполнить определяемые им deiqrbh (см. команду rep/repe/repz/repne/repnz).
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда выводит данные в порт ввода-вывода, номер которого загружен в регистр dx, из ячейки памяти по адресу ds:esi/si (допускается замена сегмента). Недопустимо задание номера порта в команде в виде непосредственного операнда — для этого используется регистр dx. Размеры вводимых элементов зависят от применяемой команды. Команда outs может работать с элементами размером в байт, слово или двойное слово. В качестве операнда в команде указывается символическое имя ячейки памяти, из которой элемент выводится в порт ввода-вывода. Реально символическое имя используется лишь для получения типа элемента последовательности, а ее адрес должен быть предварительно загружен в пару регистров ds:esi/si. Транслятор, обработав команду outs и выяснив тип операндов, генерирует одну из машинных команд outsb, outsw или outsd. Машинного аналога для команды outs нет.
Для того чтобы эти команды можно было использовать для вывода в порт последовательности элементов, имеющих размерность байт, слово или двойное слово, необходимо использовать префикс rep. Он заставляет циклически выполняться команду вывода в порт до тех пор, пока содержимое регистра ecx/cx не станет равным нулю.
.286;вывести последовательность 10 байт в порт 300h;(номер порта взят условно)str_10 db 10 dup(0)adr_str dd str_10 lds si,adr_str mov dx,300hrep outsb |
См. также: уроки 2, 7, 11 и команды cmps/cmpsb/cmpsw/cmpsd, lods/lodsb/lodsw/lodsd, movs/movsb/movsw/movsd, ins/insb/insw/insd, scas/scasb/scasw/scasd, stos/stosb/stosw/stosd, rep/repe/repz/repne/repnz
POP
(POP operand from the stack)
Извлечение операнда из стека
Схема команды: | pop приемник |
Назначение: извлечение слова или двойного слова из стека.
Синтаксис
Алгоритм работы:
Алгоритм работы команды зависит от установленного атрибута размера адреса — use16 или use32:
- загрузить в приемник содержимое вершины стека (адресуется парой ss:esp/sp);
- увеличить содержимое esp/sp на 4 (2 байта) для use32 (соответственно для use16).
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда применяется для восстановления содержимого вершины стека в регистр, ячейку памяти или сегментный регистр. Заметим, что недопустимо восстановление значения в сегментный регистр cs.
my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды popa, popad, popf, popfd, push, pusha, pushad, pushf, pushfd
POPA
(POP All general registers from the stack)
Извлечение всех регистров общего назначения из стека
Схема команды: | popa |
Назначение: извлечение из стека регистров общего назначения di, si, bp, sp, bx, dx, cx, ax.
Синтаксис
Алгоритм работы:
- извлечь из стека последовательно значения и загрузить ими регистры общего назначения di, si, bp, sp, bx, dx, cx, ax. Содержимое di восстанавливается первым. Содержимое sp извлекается, но не восстанавливается;
- увеличить значение указателя стека esp/sp на 16.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда popa по принципу работы является обратной команде pusha и используется для восстановления содержимого всех регистров общего назначения значениями из стека. Эту команду можно использовать в процедурах и программах обработки прерываний для восстановления регистров общего назначения прерванной программы.
.386my_proc proc near pusha;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popa ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popad, popf, popfd, push, pusha, pushad, pushf, pushfd
POPAD
(POP All general Double word registers from the stack)
Извлечение всех 32-разрядных регистров общего назначения из стека
Схема команды: | popad |
Назначение: извлечение из стека регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax.
Синтаксис
Алгоритм работы:
- извлечь из стека последовательно значения и загрузить ими 32-разрядные регистры общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax. Содержимое edi восстанавливается первым. Содержимое esp извлекается но не восстанавливается;
- увеличить значение указателя стека esp на 32.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда popad по принципу работы является обратной команде pushad и используется для восстановления всех 32-разрядных регистров общего назначения. Эту команду можно использовать в процедурах и программах обработки прерываний для восстановления регистров общего назначения прерванной программы.
.386my_proc proc near pushad;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popad ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popf, popfd, push, pusha, pushad, pushf, pushfd
POPF
(POP Flags register from the stack)
Извлечение регистра флагов из стека
Схема команды: | popf |
Назначение: извлечение из стека слова и восстановление его в регистр флагов flags.
Синтаксис
Алгоритм работы:
- извлечь из вершины стека слово и поместить его в регистр flags;
- увеличить значение указателя стека esp на 2.
Состояние флагов после выполнения команды:
NT | IOPL | OF | DF | IF | TF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r | r | r | r | r | r |
Применение:
Команда popf по принципу работы является обратной команде pushf и используется для восстановления из стека содержимого регистра флагов eflags. Возможным вариантом использования этой команды являются программы обработки прерываний или другие случаи, в которых необходимо сохранять некоторый локальный контекст процесса вычисления. Из-за того, что регистр eflags/flags непосредственно недоступен, команда popf является одной из немногих возможностей влияния на его содержимое.
;установить значение регистра flags в 03h mov ax,3h push ax popf |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popfd, push, pusha, pushad, pushf, pushfd
POPFD
(POP eFlags Double word register from the stack)
Извлечение расширенного регистра флагов из стека
Схема команды: | popfd |
Назначение: извлечение из стека двойного слова и восстановление его в регистр флагов eflags.
Синтаксис
Алгоритм работы:
- извлечь из вершины стека двойное слово и поместить его в регистр eflags;
- увеличить значение указателя стека esp на 4.
Состояние флагов после выполнения команды:
VM | RF | NT | IOPL | OF | DF | IF | TF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r | r | r | r | r | r | r |
Применение:
Команда popfd по принципу работы является обратной командой команде pushfd и используется для восстановления из стека содержимого регистра флагов eflags. Необходимо отметить, что команда popfd не влияет на состояние флагов vm и rf.
.386;установить значение регистра eflags в 03h mov eax,3h push eax popfd eax ;установить новое значение eflags |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, push, pusha, pushad, pushf, pushfd
PUSH
(PUSH operand onto stack)
Размещение операнда в стеке
Схема команды: | push источник |
Назначение: размещение содержимого операнда источник в стеке.
Синтаксис
Алгоритм работы:
- уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
- записать источник в вершину стека (адресуемую парой ss:esp/sp).
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. Заметьте, что в отличие от команды pop в стек можно включать значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды. В микропроцессоре i8086 по этой команде записывалось скорректированное значение sp. При записи в стек 8-битных значений для них все равно выделяется слово или двойное слово (в зависимости от use16 или use32).
my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, popfd, pusha, pushad, pushf, pushfd
PUSHA
(PUSH All general registers onto stack)
Размещение всех регистров общего назначения в стеке
Схема команды: | pusha |
Назначение: размещение в стеке регистров общего назначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di.
Синтаксис
Алгоритм работы:
- уменьшить значение указателя стека esp/sp на 32/16 (в зависимости от значения атрибута размера адреса — use16 или use32);
- включить в стек последовательно значения регистров общего назначения ax, cx, dx, bx, sp, bp, si, di.
Содержимое di при этом будет на вершине стека. В стек помещается содержимое sp по состоянию до выполнения команды.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда pusha используется совместно с командой popa для сохранения и восстановления всех регистров общего назначения. Эти команды удобно использовать при работе с процедурами, программами обработки прерываний, а также в других случаях для сохранения и восстановления регистров общего назначения как части контекста некоторого вычислительного процесса.
my_proc proc near pusha;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popa ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popad, popf, popfd, push, popa, pushad, pushf, pushfd
PUSHAD
(PUSH All general Double word registers onto stack)
Размещение всех регистров общего назначения в стеке
Схема команды: | pushad |
Назначение: размещение в стеке регистров общего назначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi, edi.
Синтаксис
Алгоритм работы:
- уменьшить значение указателя стека esp на 32;
- включить в стек последовательно значения регистров общего назначения eax, ecx, edx, ebx, esp, ebp, esi, edi. Содержимое edi при этом будет на вершине стека. Содержимое esp включается по состоянию на момент, предшествовавший выполнению данной команды.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда pushad используется совместно с командой popad для сохранения и восстановления всех регистров общего назначения. Эти команды используются аналогично командам popa и pusha.
.386my_proc proc near pushad;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popad ret endp |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popf, popfd, push, pusha, popad, pushf, pushfd
PUSHF
(PUSH Flags register onto stack)
Размещение регистра флагов в стеке
Схема команды: | pushf |
Назначение: размещение в вершине стека (ss:sp) содержимого регистра флагов flags.
Синтаксис
Алгоритм работы:
- уменьшить значение указателя стека sp на 2;
- поместить в вершину стека содержимое регистра flags.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команда pushf может использоваться для получения содержимого регистра флагов. Как известно, прямой доступ к регистру флагов невозможен, поэтому данная команда является одной из немногих команд, позволяющих получить доступ к регистру флагов как к содержимому обычного регистра. Обратное действие, то есть восстановление — возможно измененного слова — в регистр флагов, осуществляется командой popf. Эта команда может использоваться в программах обработки прерываний и в других случаях, когда необходимо сохранить локальный контекст процесса вычисления.
;извлечь значение регистра flags и изменить;значение флага cf на обратное pushf pop ax xor ax,01h push ax popf |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popfd, push, pusha, pushad, popf, pushfd
PUSHFD
(PUSH eFlags Double word register onto stack)
Размещение расширенного регистра флагов в стеке
Схема команды: | pushfd |
Назначение: размещение в стеке содержимого регистра флагов eflags.
Синтаксис
Алгоритм работы:
- уменьшить значение указателя стека esp на 4;
- записать в вершину стека двойное слово, представляющее собой содержимое регистра eflags.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команды pushfd и popfd используются аналогично командам pushf и popf. Команда pushfd применяется для получения содержимого регистра флагов. Как известно, прямой доступ к регистру флагов невозможен, поэтому данная команда является одной из немногих команд, позволяющих получить доступ к регистру флагов как к содержимому обычного регистра. Обратное действие, то есть восстановление — возможно измененного слова — в регистр флагов, осуществляется командой popfd. Эта команда может использоваться в программах обработки прерываний или в других случаях, когда необходимо сохранить локальный контекст процесса вычисления.
.386;извлечь значение регистра eflags и изменить;значение флага cf на обратное pushfd pop eax xor eax,01h push eax popfd |
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, popfd, push, pusha, pushad, pushf
RCL
(Rotate operand through Carry flag Left)
Циклический сдвиг операнда влево через флаг переноса
Схема команды: | rcl операнд,количество_сдвигов |
Назначение: операция циклического сдвига операнда влево через флаг переноса cf.
Синтаксис
Алгоритм работы:
- сдвиг всех битов операнда влево на один разряд, при этом старший бит операнда становится значением флага переноса cf;
- одновременно старое значение флага переноса cf вдвигается в операнд справа и становится значением младшего бита операнда;
- указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcl.
Состояние флагов после выполнения команды:
OF | CF |
?r | r |
Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcl флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcl).
Применение:
Команда rcl используется для циклического сдвига разрядов операнда влево. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, микропроцессором не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения всех битов счетчика, кроме первых пяти). Обратите внимание на еще один интересный эффект, связанный с поведением флага of. В операциях сдвига на один разряд по изменению этого флага можно судить о факте изменения знакового (старшего) разряда операнда:
- of=1, если текущее значение флага cf и выдвигаемого бита операнда слева различны;
- of=0, если текущее значение флага cf и выдвигаемого бита операнда слева совпадают.
;сдвиг операнда, занимающего два двойных слова;на четыре разряда влевоch_l dd ... ;младшая часть 64-битного операндаch-2 dd ... ;старшая часть 64-битного операнда... mov cx,4 ;счетчик сдвигов в cx mov eax,ch_l mov edx,ch_hm1: clc ;очистка флага cf rcl eax,1 ;старший бит eax в cf rcl edx,1 ;cf в младший бит edx, старший бит edx в cf loop m1 |
См. также: урок 9 и команды rcr, rol, ror, sal, sar, shl, shr
RCR
(Rotate operand through Carry flag Right)
Циклический сдвиг операнда вправо через флаг переноса
Схема команды: | rcr операнд,количество_сдвигов |
Назначение: операция циклического сдвига операнда вправо через флаг переноса cf.
Синтаксис
Алгоритм работы:
- сдвиг всех битов операнда вправо на один разряд; при этом младший бит операнда становится значением флага переноса cf;
- одновременно старое значение флага переноса — в операнд слева и становится значением старшего бита операнда;
- указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcr.
Состояние флагов после выполнения команды:
OF | CF |
?r | r |
Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcr флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcr).
Применение:
Команда rcr используется для циклического сдвига разрядов операнда вправо. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения битов счетчика старше пятого). Обратите внимание на еще один интересный эффект, связанный с поведением флага of, — его значение имеет смысл только в операциях сдвига на один разряд и обусловлено тем, что по изменению этого флага можно судить о факте изменения знакового разряда операнда:
- of=1, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда различны;
- of=0, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда слева совпадают.
;подсчет числа единичных битов в операндеoperand dw ...... mov cx,16 ;размер операнда xor al,al ;счетчик единичных битовcycl: rcr operand,1 jc $+4 ;переход, если очередной выдвинутый бит равен 1 jmp $+4 ;переход, если очередной выдвинутый бит равен 0 inc al ;увеличить счетчик единичных битов loop cycl |
См. также: урок 9 и команды rcl, rol, ror, sal, sar, shl, shr