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

Наши рекомендации