Кодирование команд
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 5. Кодирование команд
В этой лекции будут рассмотрены практические вопросы, связанные с машинным представлением команд
различных форматов и с различными режимами адресации операндов, с дизассемблированием команд, с
оценкой влияния структуры программы на время ее выполнения.
Кодирование команд переходов
Кодирование
команд переходов и циклов
представление этих команд подробнее.
имеет
определенную
специфику.
Рассмотрим
машинное
При безусловном внутрисегментном прямом переходе новое значение IP равно сумме 8- или 16разрядного смещения и текущего значения IP. В качестве текущего значения IP используется адрес команды,
записанной вслед за командой перехода. Схема выполнения операции представлена на рис. 5.1, где
предполагается, что перед вычислением адреса перехода содержимое IP уже указывает на команду,
следующую за командой перехода.
Команда, имеющая 8-разрядное смещение, называется командой короткого перехода и имеет в
символической записи после мнемоники команды префикс short. Смещение записывается в дополнительном
коде, который перед сложением с текущим значением IP расширяется знаком до 16 разрядов. Таким образом,
диапазон адресов переходов для команды короткого перехода составляет -128...+127 байтов относительно
текущего значения IP.
Рис. 5.1. Схема внутрисегментного прямого перехода
Пример 1.
Команда JMP short L осуществляет передачу управления команде, помеченной меткой L.
Пусть эта команда перехода записана по адресу 010A. Тогда если метке L соответствует, например, адрес
011A, то смещение в команде перехода будет равно:
011A - (010A+2)=011A-010C=011A+FEF4=0E
Здесь операция вычитания заменена сложением с использованием дополнительного кода отрицательного
числа. Перенос за пределы разрядной сетки в операциях, связанных с вычислением смещения, игнорируется.
Машинное представление команды следующее:
Обратим внимание на то, что в качестве текущего значения IP взят адрес команды перехода, увеличенный на
2, так как длина самой команды перехода равна 2 байтам.
Если команда, помеченная меткой L, располагается по адресу 00C1, то смещение будет равно:
00C1-010C=00C1+FEF4=FFB5
Полученное смещение имеет длину 2 байта, что недопустимо для данного формата команды. Но так как
старший байт представляет собой знаковое расширение младшего байта ( FFB5h = 11111111 10110101b ),
то это смещение можно закодировать в 1 байте, и команда будет иметь машинное представление: EBB5h.
Если метке L соответствует адрес 0224, то необходимая величина смещения, равная 0224-010C=0118, не
может быть записана в 8-разрядном формате. Следовательно, с помощью команды короткого перехода
осуществить переход на указанный адрес невозможно.
Пример 2.
По машинному представлению команды перехода можно определить, на какой адрес в сегменте команд будет
передано управление. Так команда, имеющая машинный код EB4Ch и расположенная по адресу 0100h,
осуществляет передачу управления на команду с адресом: (0100+2)+004C=014E, а команда с кодомEBC4h,
расположенная по тому же адресу, осуществляет передачу управления по адресу (0100+2)+FFC4=00C6.
Для осуществления безусловного перехода по любому адресу в пределах данного командного сегмента
необходимо задавать 16-разрядное смещение. Команда, имеющая такую величину смещения,
называется командой близкого перехода и имеет префикс near. Значение IP и 16-разрядное смещение
суммируются как числа со знаком в дополнительном коде. При этом, как и в предыдущем случае, перенос из
16-го разряда игнорируется. Поэтому увеличение или уменьшение величины IP при выполнении этой
команды зависит не от знака смещения, а от соотношения текущего значения IP и смещения.
Рассмотрим это положение на следующем примере.
Пример 3.
Пусть команда JMP near L имеет машинное представление E964A6h. Тогда если она расположена по
адресу 310A, то управление будет передано на команду с адресом:
(310A+3)+A664=D771
Если команда перехода находится по адресу C224, то управление будет передано на команду с
адресом 688B ( C224+3+A664 с учетом игнорирования переноса за пределы 16-разрядной сетки).
В первом случае переход произошел в сторону больших, а во втором - в сторону меньших адресов.
Отметим, что здесь текущее значение IP на 3 больше адреса команды близкого прямого перехода, так как
сама эта команда имеет длину 3 байта.
Внутрисегментную прямую адресацию часто называют относительной адресацией, так как здесь смещение
вычисляется относительно текущего значения IP.
При внутрисегментном косвенном переходе содержимое IP заменяется значением 16-разрядного
регистра или слова памяти, которые адресуются полями md и r/m постбайта с помощью любого режима
адресации, кроме непосредственного. Схема этого действия представлена на рис. 5.2.
Рис. 5.2. Схема внутрисегментного косвенного перехода
Пример 4.
Команда JMP BX осуществляет переход к ячейке памяти, адрес которой равен содержимому регистра BX.
Машинное представление этой команды:
Если в BX записано число 2976, то вне зависимости от текущего значения IP управление будет передано на
команду, записанную, начиная с адреса 2976.
Пример 5.
Команда JMP [BX]+A4h имеет машинное представление:
Если содержимое регистра BX равно 2976, то адрес перехода будет взят из слова оперативной памяти,
содержащегося в сегменте данных по адресу: 2976+A4=2A1A.
Команды межсегментных переходов меняют как содержимое IP, так и содержимое CS.
Команда межсегментного прямого перехода имеет в символической записи префикс far и заносит
в IP и CS новые значения, заданные в самой команде.
Пример 6.
Пусть необходимо осуществить передачу управления на команду, помеченную меткой L и располагающуюся в
другом программном сегменте со следующими координатами: (CS)=AA66, (IP)=11C2. Символическая запись
такой команды перехода будет следующей:
JMP far L
а ее машинное представление:
При межсегментном косвенном переходе новые значения IP и CS содержатся не в самой команде, а в
двух смежных словах оперативной памяти. Адрес этой области памяти определяется постбайтом команды
перехода в любом режиме адресации, кроме непосредственного и прямого регистрового. Схема выполнения
команды представлена на рис. 5.3.
Рис. 5.3. Схема межсегментного косвенного перехода
Отличие внутрисегментного косвенного перехода от межсегментного косвенного в символической записи
команды определяется типом используемого операнда. Если операнд определен как слово, предполагается
внутрисегментный переход, а если как двойное слово - межсегментный.
В сомнительных случаях тип перехода может задаваться явным образом с помощью префиксов word
ptr и dword ptr соответственно для внутрисегментного и межсегментного переходов.
Пример 7.
Пусть (BX)=24A4, [24A4]=11, [24A5]=12, [24A6]=13, [24A7]=5A.
Тогда команда JMP dword ptr [BX] имеет машинное представление
и передает управление команде, расположенной в кодовом сегменте (CS)=5A13 со смещением (IP)=1211.
Команда JMP word ptr [BX] имеет машинное представление
и передает управление команде, расположенной в том же кодовом сегменте со смещением (IP)=1211.
Команды условных переходов являются только внутрисегментными. В них значение указателя команд IP,
соответствующее адресу перехода, формируется при выполнении определенных условий, то есть при
определенном значении флагов регистра состояния процессора. При невыполнении проверяемого условия
вIP остается его текущее значение, то есть адрес команды, следующей за командой условного перехода.
Пример 8.
Пусть команда JZ L расположена по адресу 2010h, а метка L соответствует адресу 2072h. Получим
машинное представление этой команды.
Смещение будет равно:
2072 - (2010+2)=2072+DFEE=0060
Это число со знаком может быть закодировано в 1 байте, следовательно, такой переход возможен. Используя
код команды из табл. 6.4 (лекция 6), получим машинное представление этой команды: 7460 h.
Рассматриваемая команда передаст управление по адресу 2072, если к моменту ее выполнения ZF=1. При
состоянии признака ZF регистра флагов, равном нулю, управление будет передано следующей команде, то
есть по адресу 2012.
Теперь рассмотрим пример кодирования команд, представляющих собой некоторый законченный в смысловом
отношении фрагмент программы.
Необходимо сложить l слов a[i], расположенных последовательно в оперативной памяти, начиная с
адреса [31A6h], а результат записать по адресу [3000h].
Один из возможных вариантов программы, не использующий команду цикла, представлен в табл. 5.1. В
программе предполагается, что конечный и промежуточные результаты не превышают длины слова.
Количество слагаемых также занимает слово и записано перед исходным массивом, то есть по адресу 31A4h.
Начальное значение IP взято произвольно.
Таблица 5.1. Пример программы
Машинное представление
Символическая запись
Комментарий
IP
2-й код
MOV CX,[31A4h]
SUB AX,AX
MOV SI,AX
10001011
8B
00001110
0E
10100100
A4
S = 0
00110001
0104 00101001
31
29
i = 0
11000000
0106 10001011
C0
8B
11110000
0108 00000011
F0
03
10000100
84
10100110
A6
00110001
010C 10000011
31
83
11000110
C6
00000010
010F 01001001
0110 01110101
02
49
75
11110110
0112 10100001
F6
A1
00000000
00
00110000
30
CX = l
CYC: ADD AX,[SI+31A6h] S = S+a[i]
ADD SI,2
DEC CX
JNZ CYC
MOV [3000h],AX
16-й код
i = i+1
l = l-1
перейти, если
SUM = S
0100
Отметим некоторые особенности использования отдельных команд этой программы. Обнуление
регистра AX осуществляется вычитанием его содержимого из самого себя. Переход к новому слагаемому
достигается использованием регистровой относительной адресации с изменением на каждом шаге
содержимого индексного регистра на длину слагаемого, то есть на 2. Последняя команда, засылка результата,
закодирована в специальном формате работы с аккумулятором.
Восстановление символической записи команды по ее машинному
представлению
Для специалиста, работающего с компьютером как на программном, так и на аппаратном уровне, иногда
возникает необходимость идентифицировать командную информацию, хранящуюся в оперативной памяти.
Это может потребоваться, например, в случае программно-аппаратного сбоя, причину и место которого
трудно определить традиционными методами и средствами тестирования и отладки программ. Так как
исполняемый модуль программы хранится в памяти в машинном представлении, то для лучшего понимания
действий, выполняемых компьютером в определенный момент, целесообразно преобразовать команду к
символическому виду. Программы, выполняющие такое преобразование, называются дизассемблерами.
Рассмотрим несколько примеров подобных преобразований. Для правильной интерпретации команды
необходимо знать положение ее первого байта. В рассматриваемых примерах будем полагать, что оно
известно.
Пример 9.
Представить символическую запись команды, имеющей следующую машинную форму: 0000h.
Так как поля команды определяются с точностью до бита, то необходимо сначала перейти от
шестнадцатеричного к двоичному представлению команды и, исходя из общих принципов кодирования
команд, определить назначение всех ее разрядов:
По таблице машинного представления команд (см. табл. 4.4, лекция 4) определим, что КОП= 000000
b соответствует общему формату операции сложения ADD. Тогда два младших бита первого байта кодируют
признаки d и w, а второй байт является постбайтом, определяющим режимы адресации операндов,
участвующих в операции. Значение полей в постбайте позволяет определить, что операндами будут
регистр AL ( reg=000, w=0 ) (см. табл. 4.1, лекция 4) и байт памяти, адресуемый с помощью базовоиндексной
адресации через
регистры BX и SI (md=00, r/m=000 ) (см. табл. 4.2, лекция
4).
Значение d=0указывает, что регистр AL является операндом-источником.
Следовательно, символическая запись команды имеет вид:
ADD [BX+SI],AL
Пример 10.
Представить символическую запись команды, имеющей следующую машинную форму: 81475D398B h.
Переходим к двоичному представлению команды:
Первый байт, согласно таблице машинного представления команд, соответствует команде сложения с
непосредственным операндом. Постбайт в этом случае кодирует местоположение лишь одного операнда,
которое
определяется
полями md и r/m: (BX)+disp8 (см.
табл.
4.2,
лекция
4),
а
среднее
поле постбайтаявляется расширением кода операции.
Адресация операнда требует указания в команде 8-разрядного смещения. Оно помещается сразу же за
постбайтом. Последние байты команды кодируют непосредственный операнд. Значение sw=01 в первом байте
команды указывает на то, что непосредственный операнд - 16-разрядный. Учитывая, что при кодировании в
команде двухбайтовых величин сначала записывается их младший байт, получим следующую символическую
запись команды:
ADD [BX+5D],8B39h
Пример 11.
Пусть машинная форма представления команды следующая: 0445h. Тогда ее двоичный вид:
По таблице машинного представления команд определяем, что это команда специального формата,
обеспечивающая суммирование аккумулятора с непосредственным операндом.
Так как w=0, то непосредственный операнд имеет длину 1 байт, а в качестве аккумулятора используется
регистр AL. При этом команда имеет следующий вид:
ADD AL,45h
Оценка влияния структуры программы на время ее выполнения
Время выполнения программы складывается из времен выполнения каждой команды программы. Время
выполнения команды можно определить, умножая число тактов синхронизации, необходимых для выполнения
команды, на длительность такта. Это время можно выразить в виде суммы базового времени выполнения,
которое зависит от типа команды, и времени вычисления эффективного адреса, если операнд располагается в
памяти. При определении базового времени предполагается, что выполняемая команда уже выбрана из
памяти и находится в очереди команд. В противном случае требуется учесть длительность дополнительных
тактов синхронизации, необходимых для выборки команды.
Базовые времена выполнения некоторых команд приведены в табл. 5.2. Время вычисления эффективного
адреса (ЕА) зависит от режима адресации (табл. 5.3). Последний столбец в табл. 5.2 показывает число
обращений к памяти, необходимых для выполнения команды. Чтобы определить время выполнения команды,
следует учесть выравнивание операнда, то есть его расположение в оперативной памяти. Обращение к
однобайтному операнду не требует дополнительных тактов синхронизации. Время обращения к слову памяти
зависит от его адреса. Если слово имеет нечетный адрес, то его передача из оперативной памяти занимает
2цикла шины, длящихся по 4 такта синхронизации каждый. Следовательно, каждое обращение к слову с
нечетным адресом требует четырех дополнительных тактов синхронизации.
Таблица 5.2.
Команды
Адресация
Число обращений к
памяти
Число тактов
RR
3
RS
9+EA
1
SR
16+EA
2
RI, AI
4
SI
SA, AS
16+EA
10
2
1
RR
2
RS
8+EA
1
SR
9+EA
1
RI
4
ADD, SUB, AND, OR
MOV
SI
MUL
10+EA
множитель 8 бит - R 70…77
1
множитель 16 бит - 118…133
R
(76…83)+EA 1
множитель 8 бит - S
(124…139)+EA 1
множитель 16 бит S
RR
3
RS, SR
9+EA
1
RI, AI
4
SI
10+EA
1
16 бит - R
2
8 бит - R
3
S
нет перехода
15+EA
2
4
LOOP
есть переход
нет перехода
16
5
JMP
есть переход
короткий
17
15
внутрисегментный
-
-
прямой
15
косвенный
18+EA
1
регистровый
11
межсегментный
-
-
прямой
15
косвенный
24+EA
2
CMP
INC, DEC
Условные переходы,
кроме JCXZ
Примечание: R - адресация к регистру; A - к аккумулятору; S - к памяти; I - непосредственная адресация
Таблица 5.3.
Число тактов синхронизации для
вычисления эффективного адреса
Режим адресации
Прямой
6
Косвенный
5
Относительный
9
Базово-индексный
-
(BP)+(DI) или (BX)+(SI)
7
(BP)+(SI) или (BX)+(DI)
Относительный базово-индексный
8
-
(BP)+(DI)+disp или (BX)+(SI)+disp 11
(BP)+(SI)+disp или (BX)+(DI)+disp 12
Если при вычислении физического адреса производится замена сегментного регистра (вместо заданного по
умолчанию
используется
другой,
определенный
префиксом
замены),
то время
выполнения
команды увеличивается на 2 такта.
Базовое время выполнения некоторых команд зависит также от значения операндов. Типичными примерами
этого служат команды умножения и деления (см. табл. 5.2). Так, время выполнения команды умножения,
реализованной по алгоритму умножения дополнительных кодов с пропуском такта суммирования,
определяется количеством пар соседних несовпадающих разрядов (01 или 10), так как при комбинациях 00
или 11 такт суммирования с нулевым слагаемым отсутствует. Поэтому, например, для 8-разрядных операндов
максимальное время умножения будет при значении множителя 01010101, а минимальное - при ненулевом
множителе 10000000 (напомним, что числа в персональной ЭВМ представляются в дополнительном коде,
поэтому указанный код соответствует числу -128). То есть в первом случае команда умножения будет
выполняться на 7 тактов суммирования дольше, что соответствует значениям, приведенным в табл. 5.2.
Для команд условного перехода в табл. 5.2 приведено два времени: меньшее соответствует случаю, когда
условие не выполняется и переход не производится, а большее соответствует реализации перехода. Во
втором случае учитывается необходимость нового заполнения очереди команд и выборки следующей
команды. Это же относится и к командам циклов.
Проиллюстрируем сказанное несколькими примерами. Для всех примеров будем полагать для простоты
расчетов, что частота синхронизации равна 100 МГц (длительность такта 10 нс).
Пример 1.
ADD ES:[BX],DX
Команда формата "память-регистр".
Базовое время: 16+EA.
Время вычисления EA (регистровая косвенная адресация): 5 тактов.
Обозначение "ES:" в символической записи команды показывает, что в процессе формирования физического
адреса операнда происходит замена сегментного регистра. Вместо используемого по умолчанию при
данном режиме адресации сегментного регистра DS используется регистр ES. Эта операция требует 2 тактов
синхронизации.
Команда обрабатывает слово. Если слово имеет нечетный адрес, то
Т=16+5+2+2*4=31 (такт)=310 (нс)
Если слово имеет четный адрес, то
Т=16+5+2=23 (такта)=230 (нс)
Пример 2.
MUL [BX]
Умножение без знака содержимого AL на операнд, адрес которого задан в команде. Операнд находится в
памяти.
Базовое время: (76...83)+EA.
Время вычисления EA (регистровая косвенная адресация): 5 тактов.
Т=(76...83)+5 = (81...88) тактов = (810...880) нс
Пример 3.
JZ MET ; перейти на MET, если "ноль"
Базовое время: 4 такта, если нет перехода, и 16 тактов, если переход выполняется.
Других затрат времени нет.
Т=4 такта=40 нс
перехода нет.
Т=16 тактов=160 нс переход выполняется.
Пример 4.
JMP dword ptr [SI+15] ; межсегментный косвенный переход.
Базовое время: 24+EA.
Время вычисления EA (регистровая относительная адресация): 9 тактов.
Имеются 2 обращения к памяти за новыми значениями IP и CS.
Если адрес слова четный, то
Т=24+9=33 (такта)=330 (нс).
Если адрес слова нечетный, то
Т=24+9+2*4=41 (такт)=410 (нс).
Время выполнения линейного участка программы равно сумме времен выполнения всех команд этого участка.
Оценим время выполнения ветвящейся программы на примере следующей задачи:
Ниже представлен текст соответствующей программы в предположении, что A, B и y - переменные длиной
1 байт, имеющие идентификаторы MA, MB и MY соответственно. Здесь и далее полагаем, что используемые
адреса в сегменте данных - четные. Рядом с каждой командой указано количество тактов синхронизации,
необходимое для ее выполнения (идентификаторы соответствуют прямому режиму адресации ):
MOV BL,5
MOV
CMP
JG
INC
OUT: MOV
; 4
AL,MA
AL,MB
OUT
BL
MY,BL
;
;
;
;
;
10
15
4/16
3
15
Таким образом, если A>B, то программа выполняется за 60 тактов, в противном случае - за 51 такт.
Если оба случая равновероятны, то
Тср = (Т1+Т2)/2 = 55.5 (такта).
В общем случае для данной программы
Тср = 4+10+15+16*p1+(4+3)*p2+15=44+16*p1+7*p2.
где p1 и p2 - вероятности перехода в
соответственно ( p1+p2=1 ).
команде JG в
случае
выполнения
и
невыполнения
условия
Если известна количественная или хотя бы качественная оценка соотношения p1 и p2, то можно
минимизировать среднее время выполнения данного фрагмента программы.
Пусть известно, что A>B при 90% различных исходных данных. Тогда для рассмотренной программы:
Тср = 44+0.9*16+0.1*7=59.1 (такта).
При обратном соотношении, то есть при p1=0.1:
Тср = 44+0.1*16+0.9*7=51.9 (такта).
Следовательно, при p1=0.1 быстрее будет выполняться программа, меняющая условие перехода:
MOV BL,6
MOV
CMP
JNG
DEC
OUT: MOV
; 4
AL,MA
AL,MB
OUT
BL
MY,BL
;
;
;
;
;
10
15
4/16
3
15
Она дает то же самое среднее время выполнения программы при p1=p2, но выигрыш при p1>p2 и проигрыш
при p1
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Кодирование команд
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ