Конспект лекций Системное программирование (семестр 2) Возле названия каждой лекции написано число пар, в течение которых она будет читаться (+ ср обозначает

Вид материалаКонспект
См. также
Схема команды
Состояние флагов после выполнения команды
См. также
Схема команды
См. также
Подобный материал:
1   ...   38   39   40   41   42   43   44   45   ...   57

STI


(SeT Interrupt flag)

Установка флага прерывания

 

Схема команды: 

sti 

Назначение: установка флага прерывания if в единицу.

Синтаксис

Алгоритм работы:

установить флаг if в единицу.

Состояние флагов после выполнения команды:

09

IF

1

Применение:

Данная команда используется для установки флага if в единицу. Такая необходимость может возникнуть при разработке программ обработки прерываний.

...

        sti             ;if=1

        

См. также: урок 2, 15, 17 и команду cli

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_str

rep     stosb           ;заполняем пробелами строку str

        

 

;пример совместной работы stosb и lodsb:

;копировать одну строку в другую до первого пробела

str1    db      'Какая-то строка'

len_str1=$-str

str2    db      len_str1 dup (' ')

...

        mov     ax,@data

        mov     ds,ax

        mov     es,ax

        cld

        mov     cx,len_str1

        lea     si,str1

        lea     di,str2

m1:     lodsb

        cmp     al,' '

        jc      exit    ;выход, если пробел

        stosb

        loop    m1

exit:

        

См. также: урок 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;
  • установить флаги.

Состояние флагов после выполнения команды:

11

07

06

04

02

00

OF

SF

ZF

AF

PF

CF

r

r

r

r



r

Применение:

Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.

;выполнить вычитание 64-битных значений: vich_1-vich_2

vich_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