А.А. Вылиток - Сегментирование в ПК. Префиксы замены сегмента (1056129), страница 2
Текст из файла (страница 2)
Настройкаделается с помощью команд программы (автоматически настраиваются к началувыполнения программы только CS и SS ).Теперь подробно рассмотрим вопрос, как выбираются сегментные регистры притрансляции команд∗.В команде ЯА операнд, находящийся в ОП, может быть задан следующими способами:(1) <адресное выражение>,(2) <SR>:<адресное выражение>,(3) <SR>:<константное выражение>,∗Напомним, что в некоторых командах вопрос о выборе сегментного регистра не стоит.Например, в команде прямого перехода: jmp <метка>. Действие этой команды таково: еслиметка близкая (типа near), то изменяется только IP (он станет равным адресу (смещению)метки), если метка дальняя (типа far), то соответственно изменяются и CS, и IP.
Абсолютныйадрес не вычисляется.Другой пример — movsb. В этой команде схема вычисления абсолютных адресов жесткозафиксирована: байт по адресу (DS·16 + SI) mod 220 пересылается на место байта по адресу(ES·16 + DI) mod 220, и нет возможности использовать для задания адресов другие регистры3где <SR> — это сегментный регистр (CS, SS, DS или ES).
Адресные выражения в (1)-(2)и константное выражение в (3) задают исполнительный адрес (Aисп).Для команд ЯА с явно заданным операндом в ОП возникает вопрос:Какой именно сегментный регистр будет использован при вычисленииабсолютного адреса операнда данной команды во время выполнения программы?Если сегментный регистр указан в команде (способы (2)-(3)), то именно он ибудет использован. Например, для операнда DS:0001h будет использован DS, для ES:Yбудет использован ES.Если сегментный регистр не указан в команде (способ (1)), то он определяетсяпо следующему алгоритму.АлгоритмВход : адресное выражение — операнд команды из программы на ЯА.Выход: сегментный регистр SR, который будет использован при вычисленииабсолютного адреса операнда.Введём обозначения:expr — адресное выражение, задающее операнд команды, находящийся в памятиЗамечание. Адресное выражение считаем заданным в «канонической форме»:<имя> + [<модификаторы>] + <константное выражение>.
Каждая из трехчастей (имя переменной, модификаторы, константное выражение) можетотсутствовать, но обязательно наличие хотя бы одой из двух первый частей, т.е.имени или модификаторов.• name — имя, т.е. первая часть expr (если она присутствует)• R — множество сегментных регистров, связанных к моменту трансляции даннойкоманды директивой ASSUME с программным сегментом, содержащимописание имени name. R может быть пустым (R = ∅).• M — множество модификаторов, содержащихся в expr. Может быть пустым(M = ∅).•Пример.data segmentx dw ?,?data endscode segmentassume cs:code…mov x, 100h; R=∅,assume cs:code, ds:data…mov x[bx], 200h; R={ds},expr=name=x,expr=x[bx],M=∅,name=x, M={bx}assume cs:code, ds:data, es:data…mov x[bx,si], 300h ; R={ds,es}, expr=x[bx,si], name=x, M={bx,si}code ends4Методв expr естьимя (name)в expr нетимени (name)name ужеописаноname ещене описаноSR := SSBP∈ MBP∉ MSS∈ RBP∈ MR≠∅R=∅SS∉ RBP∉ MERRORSR := DSSR := первый изсписка <DS,SS,ES,CS>,содержащийся в RSR := <DS,SS,ES,CS>DS∈ RDS∉ RЗамечание.
Если name описано ниже транслируемой команды, есть два случая,когда трансляция все же пройдет успешно: (1) BP ∉ M и DS ∈ R; (2) BP ∈ M и SS ∈ R.Итак, мы теперь знаем, как ассемблер определяет сегментный регистр, которыйдолжен использоваться при выполнении данной команды.Остался последний вопрос: если в команде должен использоваться сегментныйрегистр SR, вставит ли ассемблер при трансляции этой команды соответствующийпрефикс замены сегмента? Ответ дает следующая таблица.Используемыйсегментный регистрBP ∈ M ?DSESCSSSданетданетданетданетБудет ли вставленпрефиксданетдадададанетдаПример.s segment stacka dw ?dw 128 dup (?)s endsd1 segmentb dw ?d1 endsd2 segmentc dw ?d2 endscode segmentassume ss:s, ds:d1, cs:code, es:d25d dw ?start:mov ax,d1mov ds,ax; команды программы...mov ax, b[bp] ; вставит префикс ds...mov ax, a; вставит префикс ss...mov ax, c; вставит префикс es...mov ax, b; не вставит префикс, используется ds...mov ax, d; вставит префикс cs...fin:finishcode endsend start6.