Кодирование команд (часть 2)
Восстановление символической записи команды по ее машинному представлению
Для специалиста, работающего с компьютером как на программном, так и на аппаратном уровне, иногда возникает необходимость идентифицировать командную информацию, хранящуюся в оперативной памяти. Это может потребоваться, например, в случае программно-аппаратного сбоя, причину и место которого трудно определить традиционными методами и средствами тестирования и отладки программ. Так как исполняемый модуль программы хранится в памяти в машинном представлении, то для лучшего понимания действий, выполняемых компьютером в определенный момент, целесообразно преобразовать команду к символическому виду. Программы, выполняющие такое преобразование, называются дизассемблерами.
Рассмотрим несколько примеров подобных преобразований. Для правильной интерпретации команды необходимо знать положение ее первого байта. В рассматриваемых примерах будем полагать, что оно известно.
Пример 9.
Представить символическую запись команды, имеющей следующую машинную форму: 0000h.
Так как поля команды определяются с точностью до бита, то необходимо сначала перейти от шестнадцатеричного к двоичному представлению команды и, исходя из общих принципов кодирования команд, определить назначение всех ее разрядов:
По таблице машинного представления команд (см. табл. 6.4, лекция 6) определим, что КОП= 000000 b соответствует общему формату операции сложения ADD. Тогда два младших бита первого байта кодируют признаки d и w, а второй байт является постбайтом, определяющим режимы адресации операндов, участвующих в операции. Значение полей в постбайте позволяет определить, что операндами будут регистр AL ( reg=000, w=0 ) (см. табл. 6.1, лекция 6) и байт памяти, адресуемый с помощью базово-индексной адресации через регистры BX и SI (md=00, r/m=000 ) (см. табл. 6.2, лекция 6). Значение d=0 указывает, что регистр AL является операндом-источником.
Следовательно, символическая запись команды имеет вид:
ADD [BX+SI],AL
Пример 10.
Представить символическую запись команды, имеющей следующую машинную форму: 81475D398B h.
Переходим к двоичному представлению команды:
Первый байт, согласно таблице машинного представления команд, соответствует команде сложения с непосредственным операндом. Постбайт в этом случае кодирует местоположение лишь одного операнда, которое определяется полями md и r/m: (BX)+disp8 (см. табл. 6.2, лекция 6), а среднее поле постбайта является расширением кода операции.
Адресация операнда требует указания в команде 8-разрядного смещения. Оно помещается сразу же за постбайтом. Последние байты команды кодируют непосредственный операнд. Значение sw=01 в первом байте команды указывает на то, что непосредственный операнд - 16-разрядный. Учитывая, что при кодировании в команде двухбайтовых величин сначала записывается их младший байт, получим следующую символическую запись команды:
ADD [BX+5D],8B39h
Пример 11.
Пусть машинная форма представления команды следующая: 0445h. Тогда ее двоичный вид:
По таблице машинного представления команд определяем, что это команда специального формата, обеспечивающая суммирование аккумулятора с непосредственным операндом.
Так как w=0, то непосредственный операнд имеет длину 1 байт, а в качестве аккумулятора используется регистр AL. При этом команда имеет следующий вид:
ADD AL,45h