Описание системы команд (1110646), страница 6
Текст из файла (страница 6)
Большинство языков высокого уровня хранят локальные данныеблоков в стеке. Эти переменные называют еще автоматическими или динамическими.Память для них резервируется путем уменьшения значения регистра-указателя стекаesp/sp на величину, равную длине области, занимаемой этими динамическимипеременными. Доступ к этим переменным осуществляется посредством регистра ebp/bp.Если один блок вложен в другой, то для его динамических (локальных) переменных такжевыделяется место (кадр) в стеке, но в этот кадр помещается указатель на кадр стека длявключающего его блока.
Команды enter и leave как раз и позволяют поддержать в языкеассемблера принципы работы с переменными блоков как в блочно-структурированныхязыках. Дисплей организуется с помощью второго операнда команды enter и стека.Например, в начале работы главной процедуры A и после вызова процедуры B кадр стекабудет выглядеть так.Соответственно, после вызова процедур C и D стек будет выглядеть, как показано ниже.Таким образом, видно, что используя дисплей, мы фактически имеем адреса областейинициализации, доступных по признаку вложенности объемлющих блоков. Обратныйпроцесс завершения работы с блоками и удаления соответствующих областейинициализации поддерживается командой leave..286proc1proc;зарезервировать в стеке место длялокальных переменных;proc1 16 байт;лексический уровень вложенности 0enter16,0...leaveretproc1endpСм. также: урок 14 и команды leave, retHLT(HaLT)ОстановкаhltСхема команды:Назначение: остановка микропроцессора до прерывания или перезагрузки.СинтаксисАлгоритм работы:перевод микропроцессора в состояние остановки.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:В результате выполнения команды микропроцессор переходит в состояние остановки.
Изэтого состояния его можно вывести сигналами на входах RESET, NMI, INTR. Если длявозобновления работы микропроцессора используется прерывание, то сохраненноезначение пары cs:eip/ip указывает на команду, следующую за hlt. Для иллюстрацииприменения данной команды рассмотрим еще один способ переключениямикропроцессора из защищенного в реальный режим и его возврата обратно в реальныйрежим (см.
урок 16). Как известно, в микропроцессоре не предусмотрено специальныхсредств для подобного переключения. Сброс микропроцессора можно инициировать, есливывести байт со значением 0feh в порт клавиатуры 64h. После этого микропроцесорпереходит в реальный режим и управление получает программа BIOS, котораяанализирует байт отключения в CMOS-памяти по адресу 0fh. Для нас интереспредставляют два значения этого байта — 5h и 0ah:••5h — сброс микропроцессора инициирует инициализацию программируемогоконтроллера прерываний на значение базового вектора 08h (см.
уроки 15 и 17).Далее управление передается по адресу, который находится в ячейке областиданных BIOS 0040:0067;0ah — сброс микропроцессора инициирует непосредственно передачу управленияпо адресу в ячейке области данных BIOS 0040:0067 (то есть безперепрограммирования контроллера прерываний).Таким образом, если вы не используете прерываний, то достаточно установить байт 0fh вCMOS-памяти в 0ah. Предварительно, конечно, вы должны инициализировать ячейкуобласти данных BIOS 0040:0067 значением адреса, по которому необходимо передатьуправление после сброса.
Для программирования CMOS-памяти используются номерапортов 070h и 071h. Вначале в порт 070h заносится нужный номер ячейки CMOS-памяти,а затем в порт 071h — новое значение этой ячейки.;работаем в реальном режиме, готовимсяк переходу;в защищенный режим:pushesmovax,40hmoves,axmovword ptres:[67h],offset ret_real;ret_real — метка в программе, скоторой должно;начаться выполнение программы послесбросаmoves:[69h],csmoval,0fh ;будемобращаться к ячейке 0fh в CMOSout70h,aljmp$+2;чутьзадержимся, чтобы аппаратура отработала;сброс без перепрограммированияконтроллераmoval,0ahout71h,al;переходим в защищенный режимустановкой;бита 0 cr0 в 1 (см. урок 16);работаем в защищенном режиме;готовимся перейти обратно в реальныйрежимmoval,01fchout64h,al ;сбросмикропроцессора hlt;остановка до физического окончанияпроцесса сбросаret_real:...;метка,на которую будет передано;управлениепосле сбросаСм. также: уроки 15, 16, 17IDIV(Integer DIVide)Деление целочисленное со знакомidiv делительСхема команды:Назначение: операция деления двух двоичных значений со знаком.СинтаксисАлгоритм работы:Для команды необходимо задание двух операндов — делимого и делителя.
Делимоезадается неявно, и размер его зависит от размера делителя, местонахождение которогоуказывается в команде:•••если делитель размером в байт, то делимое должно быть расположено в регистреax. После операции частное помещается в al, а остаток — в ah;если делитель размером в слово, то делимое должно быть расположено в паререгистров dx:ax, причем младшая часть делимого находится в ax. После операциичастное помещается в ax, а остаток — в dx;если делитель размером в двойное слово, то делимое должно быть расположено впаре регистров edx:eax, причем младшая часть делимого находится в eax.
Послеоперации частное помещается в eax, а остаток — в edx;Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов(старших разрядов) делимого и делителя.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CF??????Применение:Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов.Результатом деления являются частное и остаток от деления. При выполнении операцииделения возможно возникновение исключительной ситуации: 0 — ошибка деления.
Этаситуация возникает в одном из двух случаев: делитель равен 0 или частное слишкомвелико для его размещения в регистре eax/ax/al.;деление словmovmovcwdделимого dx:axidivостаток в dxax,1045 ;делимоеbx,587 ;делитель;расширениеbx;частное в ax,См. также: урок 8, приложение 7 и команду divIMUL(Integer MULtiply)Умножение целочисленное со знакомimul множитель_1imul множ_1,множ_2imul рез-т,множ_1,множ_2Назначение: операция умножения двух целочисленных двоичных значений со знаком.Схема команды:СинтаксисАлгоритм работы:Алгоритм работы команды зависит от используемой формы команды.
Форма команды содним операндом требует явного указания местоположения только одного сомножителя,который может быть расположен в ячейке памяти или регистре. Местоположение второгосомножителя фиксировано и зависит от размера первого сомножителя:•••если операнд, указанный в команде, — байт, то второй сомножитель располагаетсяв al;если операнд, указанный в команде, — слово, то второй сомножительрасполагается в ax;если операнд, указанный в команде, — двойное слово, то второй сомножительрасполагается в eax.Результат умножения для команды с одним операндом также помещается в строгоопределенное место, определяемое размером сомножителей:•при умножении байтов результат помещается в ax;••при умножении слов результат помещается в пару dx:ax;при умножении двойных слов результат помещается в пару edx:eax.Команды с двумя и тремя операндами однозначно определяют расположение результата исомножителей следующим образом:••в команде с двумя операндами первый операнд определяет местоположениепервого сомножителя.
На его место впоследствии будет записан результат. Второйоперанд определяет местоположение второго сомножителя;в команде с тремя операндами первый операнд определяет местоположениерезультата, второй операнд — местоположение первого сомножителя, третийоперанд может быть непосредственно заданным значением размером в байт, словоили двойное слово.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFr????rКоманда imul устанавливает в ноль флаги of и cf, если размер результата соответствуетрегистру назначения.
Если эти флаги отличны от нуля, то это означает, что результатслишком велик для отведенных ему регистром назначения рамок и необходимо указатьбольший по размеру регистр для успешного завершения данной операции умножения.Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:•••для однооперандной формы команды imul регистры ax/dx/edx являются знаковымирасширениями регистров al/ax/eax;для двухоперандной формы команды imul для размещения результата умножениядостаточно размерности указанных регистров назначения r16/r32;то же для трехоперандной команды умножения.Применение:Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов.Для выполнения этой операции необходимо наличие двух сомножителей. Размещение изадание их местоположения в команде зависит от формы применяемой командыумножения, которая, в свою очередь, определяется моделью микропроцессора. Так, длямикропроцессора i8086 возможна только однооперандная форма команды, дляпоследующих моделей микропроцессоров дополнительно можно использовать двух- итрехоперандные формы этой команды..486...movbx,186imuleax,bx,8;если результату не хватило размерностиоперанда1,;то перейдем на m1, где скорректируемситуацию:jcm1См.
также: урок 8, приложение 7 и команду mulIN(INput operand from port)Ввод операнда из портаin аккумулятор,ном_портаСхема команды:Назначение: ввод значения из порта ввода-вывода.СинтаксисАлгоритм работы:Передает байт, слово, двойное слово из порта ввода-вывода в один из регистров al/ax/eax.Состояние флагов после выполнения команды: выполнение команды не влияет на флаги.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команда применяется для прямого управления оборудованием компьютера посредствомпортов. Номер порта задается вторым операндом в виде непосредственного значения илизначения в регистре dx. Непосредственным значением можно задать порт с номером вдиапазоне 0-255.
При использовании порта с большим номером используется регистр dx.Размер данных определяется размерностью первого операнда и может быть байтом,словом, двойным словом. В качестве примера применения рассмотрим фрагментобработчика прерывания от клавиатуры 9. Это прерывание вызывается всякий раз принажатии любой клавиши на клавиатуре. Обработчик этого прерывания должен прочитатьскан-код клавиши, подтвердить микропроцессору клавиатуры факт приема скан-кода,преобразовать этот код в соответствии с клавишами-переключателями и поместитьпреобразованный код в буфер клавиатуры, находящийся в области BIOS. Действия чтенияи подтверждения приема скан-кода могут выглядеть, к примеру, так:al,60h;читаем скан-pushaxна времяinal,61h61horal,80hбайта из порта 61h в 1out61h,alфакт приема скан-кодаpopaxout61h,alбайт в порту 61h;сохраним егокодin;читаем порт;старший бит;подтверждаем;восстановилиСм.
также: урок 7 и команды out, ins/insb/insw/insd, outsINC(INCrement operand by 1)Увеличить операнд на 1inc операндСхема команды:Назначение: увеличение значения операнда в памяти или регистре на 1.СинтаксисАлгоритм работы:команда увеличивает операнд на единицу.Состояние флагов после выполнения команды:11 07 06 04 02OF SF ZF AF PFrrrrrПрименение:Команда используется для увеличения значения байта, слова, двойного слова в памятиили регистре на единицу. При этом команда не воздействует на флаг cf.incaxзначение в ax на 1;увеличитьСм. также: урок 8 и команды dec, add, adcINS/INSB/INSW/INSD(Input String Byte/Word/Double word operands)Ввод строк байтов/слов/двойных слов из портаins приемник,портinsbСхема команды:inswinsdНазначение: ввод из порта в память последовательности байт, слов, двойных слов.СинтаксисАлгоритм работы:•••передать данные из порта ввода-вывода, номер которого загружен в регистр dx, впамять по адресу es:edi/di;в зависимости от состояния флага df изменить значение регистров edi/di:o если df=0, то увеличить содержимое этих регистров на длину структурногоэлемента последовательности;o если df=1, то уменьшить содержимое этих регистров на длину структурногоэлемента последовательности;при наличии префикса выполнить определяемые им действия (см.