Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255), страница 95
Текст из файла (страница 95)
Отсюда следует, что в MASMкоманда перехода по метке воспринимается не как абсолютный переход,а как относительный.По короткому переходу можно передать управление только наближайшие команды программы - отстоящие от команды, следующейза командой перехода, до 128 байтов назад или до 127 байтов вперед.2) Внутрисегментныйотносительный длинный переходиспользуется для перехода на более дальние команды.JMP i16(IP:=IP+i16)Здесь i16 обозначает непосредственный операнд размером в слово,который рассматривается как знаковое целое от -32768 до 32767.
Этотпереход аналогичен короткому переходу.Отметим, что, встретив команду перехода с меткой, которой былапомечена одна из предыдущих (по тексту) команд программы,ассемблер вычисляет разность между адресом этой метки и адресомкоманды перехода и по этому сдвигу определяет, какую машиннуюкоманду относительного перехода - короткую или длинную - надосформировать. Но если метка еще не встречалась в тексте программы,т.е. делается переход вперед, тогда ассемблер, не зная еще адреса метки,не может определить, какую именно машинную командуотносительного перехода формировать, поэтому он на всякий случайвыбирает команду длинного перехода.
Однако эта машинная командазанимает 3 байта, тогда как команда короткого перехода - 2 байта, иесли автор программы на MASM стремится к экономии памяти и знаетзаранее, что переход вперед будет на близкую метку, то он долженсообщить об этом ассемблеру, чтобы тот сформировал командукороткого перехода. Такое указание делается с помощью оператораSHORT:JMP SHORT LДля переходов назад оператор SHORT не нужен: уже зная адресметки, ассемблер сам определит вид команды относительного перехода.3) Внутрисегментный абсолютный косвенный переход.JMP r16(IP:=[r]) илиJMP m16(IP:=[m16])Здесь r16 обозначает любой 16-битовый регистр общегоназначения, а m16 - адрес слова памяти. В этом регистре (слове памяти)должен находиться адрес, по которому и будет произведен переход.Например, по команде JMP BX осуществляется переход по адресу,находящемуся в регистре BX.4864) Межсегментный абсолютный прямой переход.JMP seg:ofs (CS:=seg, IP:=ofs)Здесь seg - начало (первые 16 битов начального адреса) некоторогосегмента памяти, а ofs - смещение в этом сегменте.
Пара seg:ofsопределяет абсолютный адрес, по которому делается переход. В MASMэта пара всегда задается конструкцией FAR PTR <метка>, которая"говорит", что надо сделать переход по указанной метке, причем этаметка - "дальняя", из другого сегмента. Отметим, что ассемблер самопределяет, какой это сегмент, и сам подставляет в машинную командуего начало, т.е. seg.5) Межсегментный абсолютный косвенный переход.JMP m32(CS:=[m32+2], IP:=[m32])Здесь под m32 понимается адрес двойного слова памяти, вкотором находится пара seg:ofs, задающая абсолютный адрес, покоторому данная команда должна выполнить переход. Напомним, что вI80Х86 величины размером в двойное слово хранятся в "перевернутом"виде, поэтому смещение ofs находится в первом слове двойного словаm32, а смещение seg - во втором слове (по адресу m32+2).Команды межсегментного перехода используются тогда, когдакоманды программы размещены не в одном сегменте памяти, а внескольких (например, команд столь много, что в совокупности онизанимают более 64Кб, т.е.
более максимального размера сегментапамяти). При переходе из одного такого сегмента в другой необходимоменять не только счетчик команд IP, но и содержимое регистра CS,загружая в последний начальный адрес второго сегмента. Такоеодновременное изменение обоих этих регистров и делают командымежсегментного перехода.При записи в MASM команд перехода следует учитывать, что онимогут восприниматься неоднозначно. Скажем, как восприниматькомандуJMP A- как переход по метке A или как переход по адресу,хранящемуся в ячейке с именем A?Кроме того,какой это переход- внутрисегментный илимежсегментный? Ответ зависит от того, как описано имя A, и от того,когда описано имя A - до или после команды перехода.Пусть A описано до команды перехода ("ссылка назад").
Еслиименем A помечена некоторая команда текущего сегмента команда (т.е.A - метка),тогда ассемблер формирует машинную командувнутрисегментного относительного перехода. Если же A - имяпеременной,тогда ассемблер формируетмашинную командукосвенного перехода - внутрисегментного, если A описано в директивеDW, или межсегментного, если A описано в директиве DD.487В случае же, если имя A описано после команды перехода("ссылка вперед"), ассемблер всегда формирует машинную командувнутрисегментного относительного длинного перехода. С учетом этогоимя A обязательно должно метить команду из текущего сегментакоманд, иначе будет зафиксирована ошибка. Если такая трактовкассылки вперед не удовлетворяет автора программы, тогда он обязан спомощью оператора SHORT или PTR уточнить тип имени A:JMP SHORT A;внутрисегментный короткий переход по меткеJMP WORD PTR A ;внутрисегментный косвенный переходJMP DWORD PTE A ;межсегментный косвенный переходОтметим, что переход по метке A из другого сегмента командвсегда должен указываться с помощью FAR PTR (независимо от того,описана метка A до или после команды перехода):JMP FAR PTR A ;межсегментный переход по меткеУсловные переходыПрактически во всех командах условного перехода проверяетсязначение того или иного флага (например, флага нуля ZF) и, если онимеет определенное значение, выполняется переход по адресу,указанному в команде.
Значение флага должно быть установленопредыдущей командой, например, командой сравненияCMP op1,op2которая вычисляет разность op1-op2, однако результат никуда незаписывает, а только меняет флаги, на которые и будет реагироватькоманда условного перехода.В MASM команды условного перехода имеют следующую форму:Jxx opгде xx - одна или несколько букв, в сокращенном виде отражающиепроверяемое условие (обычно в предположении, что перед этойкомандой находится команда сравнения). Примеры некоторыхмнемоник:JE - переход "по равно" (jump if equal)JL - переход "по меньше" (jump if less)JNL - переход "по неменьше" (jump if not less)Особенностьювсех машинных команд условного переходаявляется то, что они реализуют внутрисегментный относительныйкороткий переход, т.е.
добавляют к счетчику команд IP свой операнд,рассматриваемый как число со знаком от -128 до 127. В MASM этотоперанд всегда должен записываться как метка, которую ассемблерзаменит на соответствующий сдвиг.Такая особенностькоманд условного переходавызываетнеудобство при переходах на "дальние" команды. Например, если надосделать переход при A<B на команду, помеченную меткой L и488расположенную далекоот командыперехода,то приходитсяиспользовать команду длинного безусловного перехода:MOV AX,ACMP AX,B ;сравнение A и BJNL M;не меньше --> M (обход команды JMP)JMP L;меньше --> L (длинный переход)M: ...Команды управление цикломВI80Х86естьнесколькокоманд,упрощающихпрограммирование циклов с заранее известным числом повторений.Применение этих команд требует, чтобы к началу цикла в регистр CXбыло занесено число шагов цикла.
Сами команды размещаются в концецикла, они уменьшают значение CX на 1 и, если CX еще не равно 0,передают управление на начало цикла. Например, найти S - суммуэлементов массива X из 10 чисел-слов можно так:MOV AX,0 ;начальное значение суммы (накапливается в AX)MOV SI,0 ;начальное значение индексного регистраMOV CX,10 ;число повторений циклаL: ADD AX,X[SI] ;AX:=AX+X[i]ADD SI,2 ;SI:=SI+2LOOP L;CX:=CX-1; if CX<>0 then goto LMOV S,AX ;S:=AXПомимо команды LOOP есть еще две "циклические" команды LOOPZ и LOOPNZ (они имеют синонимичные названия LOOPE иLOOPNE), которых кроме регистра CX проверяют еще и флаг нуля ZF;например, команда LOOPZ "выходит" из цикла, если CX=0 или ZF=1.Эту команду можно, например, использовать при поиске в массивепервого нулевого элемента, где должно быть предусмотрено дваусловия выхода из цикла: либо будет найден нулевой элемент (ZF=1,если перед LOOPZ поставить команду сравнения очередного элемента с0), либо будет исчерпан весь массив (CX=0).Отметим, что все эти "циклические" команды реализуют короткийотносительный переход, как и команды условного перехода, поэтому ихможно использовать только для циклов с небольшим числом команд.В MASM есть еще две команды перехода - CALL (переход свозвратом) и RET (возврат из подпрограммы).Строковые операцииВ I80Х86 под строкой понимается последовательность соседнихбайтов или слов.