Описание системы команд (1110646), страница 13
Текст из файла (страница 13)
На самом делемикропроцессор имеет три варианта команды возврата ret - это ret, ее синоним retn, атакже команда retf. Они отличаются типами процедур, в которых используются. Командыret и retn служат для возврата из процедур ближнего типа. Команда retf — командавозврата для процедур дальнего типа. Какая конкретно команда будет использоваться,определяется компилятором; программисту лучше использовать команду ret и доверитьтранслятору самому сгенерировать ее ближний или дальний вариант. Количество командret в процедуре должно соответствовать количеству точек выхода из нее.Некоторые языки высокого уровня, к примеру Pascal, требуют, чтобы вызываемаяпроцедура очищала стек от переданных ей параметров. Для этого команда ret содержитнеобязательный параметр число, который, в зависимости от установленного атрибутаразмера адреса, означает количество байт или слов, удаляемых из стека по окончанииработы процедуры.my_proc proc...retendp6См.
также: уроки 10, 14 и команду callROL(Rotate operand Left)Циклический сдвиг операнда влевоrol операнд,количество_сдвиговСхема команды:Назначение: операция циклического сдвига операнда влево.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда влево на один разряд, при этом старший бит операндавдвигается в операнд справа и становится значением младшего бита операнда;одновременно выдвигаемый бит становится значением флага переноса cf;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 00OF CF?r rПрименение:Команда rol используется для циклического сдвига разрядов операнда влево.
Отличиеэтого сдвига от rcl в том, что очередной сдвигаемый бит одновременно вдвигается воперанд справа и становится значением флага cf. Так же, как и для других сдвигов,значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Этообъясняется тем, что микропроцессор использует только пять младших разрядов операндаколичество_разрядов.
Аналогично другим командам сдвига сохраняется эффект,связанный с поведением флага of, значение которого имеет смысл только в операцияхсдвига на один разряд:••если of=1, то текущее значение флага cf и выдвигаемого слева бита операндаразличны;если of=0, то текущее значение флага cf и выдвигаемого слева бита операндасовпадают.Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицувсякий раз при изменении знакового разряда операнда.;поменять местами половинки регистраeax:movax,0ffff0000hmovcl,16roleax,cl ;eax=0000ffffhСм. также: урок 9 и команды rcr, rcl, ror, sal, sar, shl, shrRORЦиклический сдвиг операнда вправоASCII-коррекция после сложенияror операнд,количество_сдвиговСхема команды:Назначение: операция циклического сдвига операнда вправо.СинтаксисАлгоритм работы:••••сдвиг всех битов операнда вправо на один разряд, при этом младший бит операндавдвигается в операнд слева и становится значением старшего бита операнда;одновременно этот младший бит операнда становится значением флага переносаcf;старое значение флага переноса cf вдвигается в операнд слева и становитсязначением старшего бита операнда;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 00OF CF?r rПрименение:Команда ror используется для циклического сдвига разрядов операнда вправо.
Отличиеэтого сдвига от rcr в том, что очередной сдвигаемый бит одновременно вдвигается воперанд слева и становится значением флага cf. Так же, как и для других сдвигов,значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Этообъясняется тем, что микропроцессор использует только пять младших разрядов операндаколичество_разрядов. Аналогично другим командам сдвига сохраняется эффект,связанный с поведением флага of, значение которого имеет смысл только в операцияхсдвига на один разряд:••если of=1, то текущее значение флага cf и вдвигаемого слева бита операндаразличны;если of=0, то текущее значение флага cf и вдвигаемого слева бита операндасовпадают;Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицувсякий раз при изменении знакового разряда операнда.;поместить четыре младших бита ax наместо старших битов:rorax,4См.
также: уроки 9 и команды rcl, rcr, ror, sal, sar, shl, shrSAHF(Store AH register into register Flags)Загрузка регистра флагов eFlags/Flags из регистра AHsahfСхема команды:Назначение: запись содержимого регистра ah в младший байт регистра eflags/flags, вкотором содержатся пять флагов cf, pf, af, zf и sf.СинтаксисАлгоритм работы:Команда загружает младший байт регистра eflags/flags содержимым регистра ah. В битах7, 6, 4, 2 и 0 регистра ah должны, соответственно, содержаться новые значения флагов sf,zf, af, pf и cf.Состояние флагов после выполнения команды:07 06 04 02 00SF ZF AF PF CFrrrrrПрименение:Эта команда используется совместно с командой lahf.
Из-за того, что регистр флаговнепосредственно недоступен, сочетание этих команд можно применять для анализа — и,возможно, изменения — состояния некоторых флагов в регистре eflags/flags. Содержимоестаршей части регистра флагов не изменяется.;сбросить в ноль флаг cflahfandah,11111110bsahfСм. также: уроки 2, 7 и команду lahfSAL(Shift Arithmetic operand Left)Сдвиг арифметический операнда влевоsal операнд,количество_сдвиговСхема команды:Назначение: арифметический сдвиг операнда влево.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева битстановится значением флага переноса cf;одновременно справа в операнд вдвигается нулевой бит;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 00OF CF?r rПрименение:Команда sal используется для сдвига разрядов операнда влево. Так же, как и для другихсдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31.
Этообъясняется тем, что микропроцессор использует только пять младших разрядовколичество_разрядов. Аналогично другим командам сдвига сохраняется эффект,связанный с поведением флага of, значение которого имеет смысл только в операцияхсдвига на один разряд:••если of=1, то текущее значение флага cf и выдвигаемого слева бита операндаразличны;если of=0, то текущее значение флага cf и выдвигаемого слева бита операндасовпадают.Этот эффект, как вы помните, обусловлен тем, что флаг cf устанавливается в единицувсякий раз при изменении знакового разряда операнда.Команду sal удобно использовать для умножения целочисленных операндов без знака настепени 2. Кстати сказать, это самый быстрый способ такого умножения; умножитьсодержимое ax на 16 (2 в степени 4):movsalax,17ax,4См. также: уроки 8, 9 и команды rcr, rcl, ror, rol, sar, shl, shrSAR(Shift Arithmetic operand Right)Сдвиг арифметический операнда вправоsar операнд,количество_сдвиговСхема команды:Назначение: арифметический сдвиг операнда вправо.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда вправо на один разряд, при этом выдвигаемый справабит становится значением флага переноса cf;обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, азначение старшего бита операнда, то есть по мере сдвига вправо освобождающиесяместа заполняются значением знакового разряда.
По этой причине этот тип сдвигаи называется арифметическим;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 00OF CF?r rПрименение:Команда sar используется для арифметического сдвига разрядов операнда вправо. Так же,как и для других сдвигов, значение второго операнда (счетчика сдвига) ограниченодиапазоном 0...31. Это объясняется тем, что микропроцессор использует только пятьмладших разрядов операнда количество_разрядов. В отличие от других команд сдвигафлаг of всегда сбрасывается в ноль в операциях сдвига на один разряд.Команду sar можно использовать для деления целочисленных операндов со знаком настепени 2.movax,88;(ax) разделить на 2 во второй степени,то есть на 4sarax,2См.
также: урок 8, 9 и команды rcr, rcl, ror, rol, sal, shl, shrSBB(SuBtract with Borrow)Вычитание с заемомsbb операнд_1,операнд_2Схема команды:Назначение: целочисленное вычитание с учетом результата предыдущего вычитаниякомандами sbb и sub (по состоянию флага переноса cf).СинтаксисАлгоритм работы:••выполнить сложение операнд_2=операнд_2+(cf);выполнить вычитание операнд_1=операнд_1-операнд_2;Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFrrrrrrПрименение:Команда sbb используется для выполнения вычитания старших частей значениймногобайтных операндов с учетом возможного предыдущего заема при вычитаниимладших частей значений этих операндов.;выполнить вычитание 64-битныхзначений: vich_1-vich_2vich_1 dd2 dup (0)vich_2 dd2 dup (0)rezdd2 dup (0)...;ввести значения в поля vich_1 иvich_2:;младший байт по младшему адресу...moveax,vich_1subeax,vich_2;вычесть младшие половинки чиселmovrez,eax ;младшая частьрезультатаmoveax,vich_1+4sbbeax,vich_2+4;вычесть старшие половинки чиселmovrez+4,eax;старшая часть результатаСм.
также: урок 8, Приложение 7 и команды subSCAS/SCASB/SCASW/SCASDСканирование строки байтов/слов/двойных словASCII-коррекция после сложенияscas приемникscasbСхема команды:scaswscasdНазначение: поиск значения в последовательности (цепочке) элементов в памяти.СинтаксисАлгоритм работы:••выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочкилокализуется парой es:edi/di.