Stos/stosb/stosw/stosd
(Store String Byte/Word/Double word operands)
Сохранение строки байтов/слов/двойных слов
Схема команды: | stos приемник stosb stosw stosd |
Назначение: сохранение элемента из регистра-аккумулятора al/ax/eax в последовательности (цепочке).
Синтаксис
Алгоритм работы:
- записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd);
- изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df:
- df=0 — увеличить, что означает просмотр от начала цепочки к ее концу;
- df=1 — уменьшить, что означает просмотр от конца цепочки к ее началу.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команды сохраняют элемент из регистров al/ax/eax в ячейку памяти. Перед командой stos можно указать префикс повторения rep, в этом случае появляется возможность работы с блоками памяти, заполняя их значениями в соответствии с содержимым регистра ecx/cx.
;заполнить некоторую область памяти пробеламиstr db 'Какая-то строка'len_str=$-str... mov ax,@data mov ds,ax mov es,ax cld mov al,' ' lea di,str mov cx,len_strrep stosb ;заполняем пробелами строку str |
;пример совместной работы stosb и lodsb:;копировать одну строку в другую до первого пробелаstr1 db 'Какая-то строка'len_str1=$-strstr2 db len_str1 dup (' ')... mov ax,@data mov ds,ax mov es,ax cld mov cx,len_str1 lea si,str1 lea di,str2m1: lodsb cmp al,' ' jc exit ;выход, если пробел stosb loop m1exit: |
См. также: урок 11 и команды ins/insb/insw/insd, cmps/cmpsb/cmpsw/cmpsd, movs/movsb/movsw/movsd, outs, scas/scasb/scasw/scasd, lods/lodsb/lodsw/lodsd, rep/repe/repz/repne/repnz
SUB
(SUBtract)
Вычитание
Схема команды: | sub операнд_1,операнд_2 |
Назначение: целочисленное вычитание.
Синтаксис
Алгоритм работы:
- выполнить вычитание операнд_1=операнд_2-операнд_1;
- установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.
;выполнить вычитание 64-битных значений: vich_1-vich_2vich_1 dd 2 dup (0)vich_2 dd 2 dup (0)rez dd 2 dup (0)...;ввести значения в поля vich_1 и vich_2:;младший байт по младшему адресу... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата |
См. также: урок 8, приложение 7 и команду sbb
TEST
(TEST operand)
Логическое И
Схема команды: | test приемник,источник |
Назначение: операция логического сравнения операндов приемник и источник размерностью байт, слово или двойное слово.
Синтаксис
Алгоритм работы:
- выполнить операцию логического умножения над операндами приемник и источник: бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
- установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | PF | CF |
r | r | r |
Применение:
Команда test используется для логического умножения двух операндов. Результат операции, в отличие от команды and, никуда не записывается, устанавливаются только флаги. Эту команду удобно использовать для получения информации о состоянии заданных битов операнда приемник. Для анализа результата используется флаг zf, который равен 1, если результат логического умножения равен нулю.
test al,01h jnz m1 ;переход, если нулевой бит al равен 1 |
См. также: урок 9 и команды or, xor, and, bt
XADD
(eXchange and ADD)
Обмен и сложение
Схема команды: | xadd приемник,источник |
Назначение: суммирование и обмен двух значений.
Синтаксис
Алгоритм работы:
- копировать содержимое операнда приемник в операнд источник;
- выполнить сложение (приемник+источник);
- поместить сумму в операнд приемник.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда xadd используется для выполнения операции обмена и сложения двух операндов.
mov al,08h mov bl,01h xadd al,bl ;al=09h, bl=08h |
См. также: уроки 7, 8 и команды add, xchg
XCHG
(eXCHanGe)
Обмен
Схема команды: | xchg операнд_1,операнд_2 |
Назначение: обмен двух значений между регистрами или между регистрами и памятью.
Синтаксис
Алгоритм работы:
обмен содержимого операнд_1 и операнд_2.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду xchg можно использовать для выполнения операции обмена двух операндов с целью изменения порядка следования байт, слов, двойных слов или их временного сохранения в регистре или памяти. Альтернативой является использование для этой цели стека.
;поменять порядок следования байт в словеch1 label byte dw 0f85ch... mov al,ch1 xchg ch1+1,al mov ch1,al |
См. также: урок 7 и команды bswap, cmpxchg, xadd
XLAT/XLATB
(transLATe Byte from table)
Преобразование байта
Схема команды: | xlat адрес_таблицы_байтов xlatb |
Назначение: подмена байта в регистре al байтом из последовательности (таблицы) байтов в памяти.
Синтаксис
Алгоритм работы:
· вычислить адрес, равный ds:bx+(al);
· выполнить замену байта в регистре al байтом из памяти по вычисленному адресу.
Несмотря на наличие операнда адрес_таблицы_байтов в команде xlat, адрес последовательности байтов, из которой будет осуществляться выборка байта для подмены в регистре al, должен быть предварительно загружен в пару ds:bx(ebx). Команда xlat допускает замену сегмента.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду xlat можно использовать для выполнения перекодировок символов. Для формирования адреса таблицы в регистрах bx(ebx) можно использовать команду lea или оператор ассемблера offset в команде mov.
table db 'abcdef'int db 0 ;значение индекса... mov al,3 lea bx,table xlat ;(al)='c' |
См. также: урок 7 и команду lea
XOR
Логическое исключающее ИЛИ
ASCII-коррекция после сложения
Схема команды: | xor приемник,источник |
Назначение: операция логического исключающего ИЛИ над двумя операндами размерностью байт, слово или двойное слово.
Синтаксис
Алгоритм работы:
- выполнить операцию логического исключающего ИЛИ над операндами: бит результата равен 1, если значения соответствующих битов операндов различны, в остальных случаях бит результата равен 0;
- записать результат сложения в приемник;
- установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | ? | r |
Применение:
Команда xor используется для выполнения операции логического исключающего ИЛИ двух операндов. Результат операции помещается в первый операнд. Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов.
;изменить значение бита 0 регистра al на обратное xor al,01h |
См. также: урок 9 и команды and, or, not