Chapter_06 (1110558), страница 4
Текст из файла (страница 4)
В последующих же моделях возможности этого формата были расширены, но за счёт увеличения длины команды. В своих программах мы будем пользоваться и другимивидами формата регистр-регистр, например, командой mov ds,ax , но выписывать их внутреннеепредставление не будем.Как видно из приведённой выше таблицы, архитектурой нашего компьютера не предусмотреныоперации формата КОП r8,r16 , т.е. операции над регистрами разной длины запрещены, например,команды типа add AL,BX являются неправильными. Исходя из этого, для проведения операций надчислами разной длины появляется необходимость преобразования типов из короткого целого вдлинное, и из длинного в сверхдлинное (и наоборот).
Такое преобразование, как можно (и нужно!)понять, зависит от знаковой или беззнаковой трактовки числа.Беззнаковое число всегда расширяется из короткого формата в более длинный приписываниемслева двоичных нулей, а для знакового числа слева размножается его знаковый (крайний слева) бит.Таким образом, Вам необходимо понять, что для знаковых чисел незначащими левыми двоичнымицифрами будут 0 для неотрицательных и 1 для отрицательных значений.
Для преобразования знаковых целых чисел из более короткого формата в более длинный в языке машины предусмотрены безадресные команды, имеющие в Ассемблере такую мнемонику:cbw(convert byte to word)иcwd(convert word to double),которые производят знаковое расширение соответственно значения регистра AL до AX и AX до значения пары регистров <DX,AX> (так называемой регистровой пары), которые в этом случае рассматриваются как один длинный 32-х битный регистр.Преобразование целого значения из более длинного формата в более короткий (усечение) производится путём отбрасывания соответствующего числа левых битов целого числа. Усечённое числополучится правильным, т.е.
будет иметь то же значение, что и исходной число, если слева будут отброшены только незначащие биты. Вам нужно обязательно понять, что для беззнаковых чисел незначащими будут всегда нулевые биты, а для знаковых – это биты, совпадающие по значению сознаковым битом усечённого числа. Формат регистр–память (и память-регистр).КОПr1A2Второй операнд A2 может в этом формате иметь один из приведённых ниже трёх видов:1. A2 = A,2.
A2 = A[M1],3. A2 = A[M1][M2].Здесь A – задаваемое в команде число (смещение) длиной 1 или 2 байта (заметим, что нулевое смещение иногда может не задаваться и совсем не занимать места в команде), M1 и M2 – так называемыерегистры-модификаторы. Как мы сейчас увидим, значение адреса второго операнда A2 будетвычисляться по определённым правилам, поэтому этот адрес часто называют исполнительнымадресом.Стоит отметить один факт.
До сих пор в учебных ЭВМ адресом мы обычно называли физический номер ячейки в основной (оперативной) памяти компьютера. В нашей новой машине адресомпринято называть смещение ячейки относительно начала того сегмента, в котором она в данный10момент находится. Для обозначения же полного адреса будем употреблять термин физический адрес.Рассмотрим подробнее каждый их трёх возможных видов второго операнда A2. При A2 = Aфизический адрес операнда вычисляется центральным процессором по формуле:Aфиз := (SEG*16 + A)mod 220,где SEG обозначает значение одного из сегментных регистров (как именно для конкретной командывыбирается один из четырёх существующих сегментных регистров мы будем говорить далее).Запись A2 = A[M1] означает использование в команде регистра-модификатора, которымможет быть любым из следующих регистров: BP, BX, SI, DI.
Адрес операнда в сегменте при этомбудем называть исполнительным адресом Aисп , он вычисляется так:Aисп := (A + M1)mod 216,где вместо M1 подставляется содержимое одного из четырёх указанных выше регистров модификаторов. В этом случае физический адрес операнда A2 будет вычисляться по формулеAфиз := (SEG*16 + Aисп)mod 220Запись A2 = A[M1][M2] обозначает использование в команде двух регистров-модификаторов1и вычисление исполнительного и физического адресов по формулам:Aисп := (A + M1 + M2)mod 216Aфиз := (SEG*16 + Aисп)mod 220На месте M1 можно указывать любой из регистров BX или BP, а на месте M2 – любой из регистров SI или DI (вообще говоря, на Ассемблере можно сделать и, наоборот, на месте M1 указывать SIили DI, а на месте M2 указывать BX или BP).
Заметьте, однако, что использование, например, регистров BX и BP (как и SI и DI) одновременно в качестве модификаторов запрещено (мы вскоре поймём, почему так происходит). Регистры bx и bp называются базовыми регистрами (на что указываетбуква b в их названии), а регистры di и si – индексными (на это указывает буква i). Поэтому легкозапомнить правило: при использовании для адресации сразу двух регистров-модификаторов один изних должен быть базовым, а другой – индексным.Таким образом, смещение операнда в сегменте вычисляется как сумма двух или трёх чисел (взятая по модулю 216).
Такой адрес, как мы указали выше, называется исполнительным адресом операнда и по аналогии с физическим адресом обычно обозначается как Aисп. Скажем также, что встарших моделях нашего семейства ЭВМ почти все ограничения на использование регистров в качестве модификаторов также были сняты (за счёт увеличения длины новых команд).Возвращаясь к способу вычисления исполнительного и физического адресов можно заметить,что память сегмента, как и вся оперативная память, как бы замкнута в кольцо. Другими словами, припоследовательном увеличении исполнительного адреса мы с последнего байта сегмента попадаем вначало этого же сегмента (на его нулевой байт).
Важно понять, что это касается только сегментовмаксимальной длины 216 байт. В языке Ассемблера можно описывать и использовать сегменты именьшей длины, которые, конечно, уже нельзя считать замкнутыми в кольцо. Как уже отмечалось,это же касается и всей оперативной памяти, которая тоже может, как и в нашей учебной машине,считаться замкнутой в кольцо.Регистры-модификаторы имеют и другое широко используемое название – индексные регистры,так как эти регистры часто используются для доступа к элементам массивов (как говорят, для индексации элементов массивов). При этом сам способ задания адресов с использованием индексных регистров называется индексированием.
По сути, базирование и индексирование, – очень похожиеспособы адресации, однако, они преследуют разные цели. Как мы уже говорили, базирование используется для уменьшения объёма программного кода, в то время как индексирование предоставляет программисту удобный инструмент для работы с элементами массивов. Заметим, что при использовании индексирования отпадает необходимость делать самомодифицирующиеся программы для1В нашем языке Ассемблера MASM допускается эквивалентная запись выражения A[M1][M2] в видеA[M1+M2] и даже, к сожалению, в виде [A+M1+M2], в то время как, например, похожая на принятую в Паскале запись A[M1,M2] запрещена, так как имеет другой смысл (обращение к элементы матрицы), что вноситсумятицу в головы учащихся.11обработки массивов.
Теперь, изменяя значение индексного регистра, мы получаем доступ к нужнымнам элементам массивов без изменения внешнего вида самой команды.В качестве примера вычислим физический адрес второго операнда команды сложения форматаRX, на языке Ассемблера эту команду можно записать в виде add ax,6[bx][di] . Пусть регистры имеют следующие значения (эти значения, как это часто делается в Ассемблере, записаны в шестнадцатеричном виде, напомним, что в этом случае перед числом записывается цифра ноль, еслионо начинается с шестнадцатеричных цифр A–F):bx = 0FA00h, di = 0880h, ds = 2000hТогдаAисп := (6 + 0FA00h + 0880h)mod 216 = 0286hAфиз := (2000h*16 + Aисп)mod 220 = (20000h + 0286h)mod 220 = 20286hЕсли, например, в байте с адресом 20286h хранится число 56h, а в байте с адресом 20287h –число 32h, то наша команда реализует операцию сложения ax:=ax+3256h.Рассмотрим теперь внутреннее машинное представление формата команды регистр-память.Длина этой команды 2, 3 или 4 байта:КОП8 битDw2 битаmod3 битаR13 битаMem8 битa88 битa8->a16где mod – двух битовое поле, называемой полем модификатора, mem – трёх битовое поле способа адресации, a8 и a16 – это обозначение одно- или двухбайтного смещения.
Биты d и w уже знакомынам из предыдущего формата регистр-регистр и имеют тот же смысл. Все возможные комбинациизначения полей mod и mem приведены в таблице 6.1.Таблица 6.1. Значения полей mod и mem в формате регистр-память.mem \ mod011 доп. байт[BX+SI]+a8[BX+DI]+a8[BP+SI]+a8[BP+DI]+a8[SI]+a8[DI]+a8[BP]+a8[BX]+a8102 доп. байта[BX+SI]+a16[BX+DI]+a16[BP+SI]+a16[BP+DI]+a16[SI]+a16[DI]+a16[BP]+a16[BX]+a1611Это уже формат RR000001010011100101110111000 доп. Байт.[BX+SI][BX+DI][BP+SI][BP+DI][SI][DI]a16[BX]Данная таблица показывает, как зависит способ адресации от значения полей mem и mod.
Видно,что поле с именем mod фактически определяет, сколько байт в команде отводится под запись собственно смещения A (0, 1 или два байта). Как видим, эта таблица полностью объясняет ограничения навыбор регистров-модификаторов, которые мы сформулировали ранее.Мы не будем рассматривать машинный вид остальных форматов команд, будем изучать ихтолько на языке Ассемблера. Напомним только, что рассматриваемые нами форматы команд имеютследующие мнемонические обозначения: RR – (регистр – регистр); RX – (регистр – память или память – регистр, в зависимости от значения бита d в команде); RI – (регистр – непосредственный операнд в команде); SI – (память – непосредственный операнд в команде); SS – (память – память, т.е.