Описание системы команд (1110646), страница 10
Текст из файла (страница 10)
Она может быть использована для согласованияоперандов различной размерности. Но не следует думать, что все эти разнотипныепересылки делает одна машинная команда. На самом деле существует несколькомашинных команд, каждая из которых работает со своими размерами операндов.Генерацию же нужной команды обеспечивает транслятор на основе анализа исходноготекста программы..datasl.code...db?movmovzxal,0ffhbx,al;bx=00ffh...;или из памяти:movzxeax,byte ptr slСм. также: урок 8 и команды mov, movs/movsb/movsw/movsd, movsx, cbw, cwd, cdqMUL(MULtiply)Умножение целочисленное без учета знакаmul множитель_1Схема команды:Назначение: операция умножения двух целых чисел без учета знака.СинтаксисАлгоритм работы:Команда выполняет умножение двух операндов без учета знаков.
Алгоритм зависит отформата операнда команды и требует явного указания местоположения только одногосомножителя, который может быть расположен в памяти или в регистре. Местоположениевторого сомножителя фиксировано и зависит от размера первого сомножителя:•••если операнд, указанный в команде — байт, то второй сомножитель долженрасполагаться в al;если операнд, указанный в команде — слово, то второй сомножитель долженрасполагаться в ax;если операнд, указанный в команде — двойное слово, то второй сомножительдолжен располагаться в eax.Результат умножения помещается также в фиксированное место, определяемое размеромсомножителей:•••при умножении байтов результат помещается в ax;при умножении слов результат помещается в пару dx:ax;при умножении двойных слов результат помещается в пару edx:eax.Состояние флагов после выполнения команды (если старшая половина результатанулевая):11 07 06 04 02 00OF SF ZF AF PF CF0????0Состояние флагов после выполнения команды (если старшая половина результатаненулевая):11 07 06 04 02 00OF SF ZF AF PF CF1????1Применение:Команда mul выполняет целочисленное умножение операндов без учета их знаковыхразрядов.
Для этой операции необходимо наличие двух операндов-сомножителей,размещение одного из которых фиксировано, а другого задается операндом в команде.Контролировать размер результата удобно используя флаги cf и of.mn_1mn_2...dbdb1525movmulal,mn_1mn_2См. также: урок 8 и команду imulNEG(NEGate operand)Изменить знак операндаneg источникСхема команды:Назначение: изменение знака (получение двоичного дополнения) источника.СинтаксисАлгоритм работы:••выполнить вычитание (0 – источник) и поместить результат на место источника;если источник=0, то его значение не меняется.Состояние флагов после выполнения команды (если результат нулевой):11 07 06 04 02 00OF SF ZF AF PF CFrrrrr0Состояние флагов после выполнения команды (если результат ненулевой):11 07 06 04 02 00OF SF ZF AF PF CFrrrrr1Применение:Команда используется для формирования двоичного дополнения операнда в памяти илирегистре.
Операция двоичного дополнения предполагает инвертирование всех разрядовоперанда с последующим сложением операнда с двоичной единицей. Если операндотрицательный, то операция neg над ним означает получение его модуля.moval,2negal;al=0feh —число -2 в дополнительном кодеСм. также: уроки 6, 8 и команду notNOP(No OPeration)Нет операцииСхема команды:Назначение: пустая команда.nopСинтаксисАлгоритм работы:не производит никаких действий.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команда nop, занимая один байт, может использоваться для резервирования места всегменте кода или организации программной задержки.
В качестве иллюстрации можнообратиться к примеру, приведенному в описании команды hlt. В этом примере командуnop можно использовать вместо jmp $+2. Назначение jmp $+2 в этом фрагменте —задержка для синхронизации работы микропроцессора и аппаратуры компьютера.NOT(NOT operand)Инвертирование операндаnot источникСхема команды:Назначение: инвертирование всех битов операнда источник.СинтаксисАлгоритм работы:инвертировать все биты операнда источника: из 1 в 0, из 0 в 1.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команду not можно использовать для изменения байта, выполняющего роль некоторогофлага, с целью отслеживания некоторых логических условий в программе. Но такойспособ не оптимален, эту ситуацию мы обсуждали в книге на уроках 9 и 12.flagистина...cycl:...db0ffh ;значение флага —cmpjeflag,0m1...m1:notфлаг в истинуflag;установитьСм.
также: уроки 9, 12 и команду negOR(logical OR)Логическое включающее ИЛИor приемник,маскаСхема команды:Назначение: операция логического ИЛИ над битами операнда назначения.СинтаксисАлгоритм работы:•••выполнить операцию логического ИЛИ над битами операнда назначения,используя в качестве маски второй операнд — маска. При этом бит результатаравен 0, если соответствующие биты операндов маска и назначения равны 0, впротивном случае бит равен 1;записать результат операции в источник (операнд маска остается неизменным);установить флаги.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CF0rr?r0Применение:Команду or можно использовать для работы с операндами на уровне битов. Типичноеиспользование команды — установка определенных разрядов первого операнда вединицу.moval,01horbl,alнулевой бит в 1;установитьСм. также: урок 9 и команды and, xor, notOUT(OUT operand to port)Вывод операнда в портout ном_порта,аккумуляторСхема команды:Назначение: вывод значения в порт ввода-вывода.СинтаксисАлгоритм работы:Передать байт, слово, двойное слово из регистра al/ax/eax в порт, номер которогоопределяется первым операндом.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команда применяется для прямого управления оборудованием компьютера посредствомпортов.
Номер порта задается первым операндом в виде непосредственного значения илизначения в регистре dx. Непосредственным значением можно задать порт с номером вдиапазоне 0...255. Для указания порта с большим номером используется регистр dx.Размер данных определяется размерностью второго операнда и может быть байтом,словом или двойным словом.out64h,alСм. также: уроки 2, 7, 16, 17 и команды in, ins/insb/insw/insd, outsOUTS/OUTSB/OUTSW/OUTSD(OUTput Byte/Word/Double word String to port)Вывод строки байтов/слов/двойных слов в портouts порт,источникoutsbСхема команды:outswoutsdНазначение: вывод в порт из памяти последовательности байт, слов, двойных слов.СинтаксисАлгоритм работы:•••передать данные в порт ввода-вывода, номер которого загружен в регистр dx, изячейки памяти по адресу ds:esi/si;в зависимости от состояния флага df изменить значение регистров esi/si:o если df=0, то увеличить содержимое этих регистров на длину структурногоэлемента последовательности;o если 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 db10 dup(0)adr_str ddstr_10ldssi,adr_strmovdx,300hrepoutsbСм. также: уроки 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/repnzPOP(POP operand from the stack)Извлечение операнда из стекаpop приемникСхема команды:Назначение: извлечение слова или двойного слова из стека.СинтаксисАлгоритм работы:Алгоритм работы команды зависит от установленного атрибута размера адреса — use16или use32:••загрузить в приемник содержимое вершины стека (адресуется парой ss:esp/sp);увеличить содержимое esp/sp на 4 (2 байта) для use32 (соответственно для use16).Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команда применяется для восстановления содержимого вершины стека в регистр, ячейкупамяти или сегментный регистр.