ОСНОВЫ ПРОГРАММИРОВАНИЯ НА АССЕМБЛЕРЕ.
Заключительный этап поиска неисправности в устройствах компьютера, как правило, требует исследования электронных схем с помощью осциллографа. Это исследование можно производить в устойчивом состоянии электронных схем устройств и программы после отказа. Но наибольший эффект при исследовании осциллографом можно получить, если с помощью программы активизировать исследуемый процесс. Для получения устойчивого изображения динамических сигналов на экране осциллографа необходимо, чтобы исследуемые в данном процессе сигналы повторялись периодически с одной и той же частотой. То есть необходимо циклически повторять исследуемый процесс, а это в большинстве случаев достаточно просто обеспечивается с помощью "зацикливания" программы, запускающей исследуемый процесс.
Как получить такую информацию, как:
- коды ошибок устройств, формируемые программами-функциями BIOS;
- байты состояния устройства, формируемые аппаратурой контроллеров;
- содержимое регистра ошибок или регистра состояния контроллера?
Обычно, достаточно однократного выполнения в отладчике (например, AFD) небольшой специальной программы, запускающей контролируемый процесс в устройстве. Затем с помощью AFD прочитать, например, байты состояния устройства, регистры ошибок и состояний внешнего устройства, коды ошибок в регистре АН микропроцессора.
Процессор содержит программно-доступные регистры, которые принято объединять в три группы: регистры данных, регистры-указатели и сегментные регистры. Кроме того, в состав процессора входят счетчик команд и регистр флагов. Для процессоров, имеющих защищенный режим добавляются регистры системных адресов, отладочные регистры.
Разрядность регистров зависит от разрядности процессора: 8086 и 80286 - 16-и разрядные, 80386, 80486 и Pentium - 32-х разрядные, современные процессоры - 64-х разрядные. Содержимое 16-и разрядного регистра называют словом (два байта), 32-х разрядного регистра двойным словом (четыре байта) и т.д..
Для 32-х разрядных машин это регистры EAX, EBX, ECX, EDX; для 16-и разрядных машин это регистры AX, BX, CX, DX.
Регистры AX, BX, CX, DX допускают независимое обращение к старшим (AH, BH, CH, DH) и младшим (AL, BL, CL, DL) половинам. Программист может использовать эти регистры по своему усмотрению для временного хранения любых объектов (данных или адресов). Во многих случаях регистры данных вполне эквивалентны, однако предпочтительнее пользоваться регистром AX, поскольку многие команды занимают в памяти меньше места и выполняются быстрее, если их операндом является регистр AX. С другой стороны, ряд команд использует определенные регистры неявным образом. Например, команда цикла использует регистр CX в качестве счетчика циклов; в командах умножения и деления регистры AX и DX выступают в качестве неявных операндов; операции ввода-вывода можно осуществлять только через регистр AX (или AL).
Индексные регистры ESI, EDI (для 16-разрядных процессоров SI, DI) так же, как и регистры данных, могут использоваться произвольным образом. Однако их основное назначение - хранить индексы (смещения) относительно некоторой базы (т.е. начала массива) при выборке операндов из памяти. Адрес базы при этом может храниться в сегментных регистрах или в базовых регистрах BX или BP. Специальные команды работы со строками используют регистры SI и DI в качестве неявных указателей в обрабатываемых строках.
Регистр BP служит указателем базы при работе с данными в стековых структурах, но может использоваться и произвольным образом в большинстве арифметических и логических операций. Регистр SP - указатель стека. Используется как указатель вершины стека, обеспечивая выполнение стековых команд (PUSH, POP и др.), но может использоваться и произвольным образом в большинстве арифметических и логических операций. Регистры SI, DI, BP, SP не допускают побайтную адресацию.
Процессоры до 80386 имеют четыре 16-разрядных сегментных регистров CS, DS, ES, SS - начиная с 80386 добавлены еще два 16-и разрядных регистра FS, GS.
Эти регистры называются сегментными и обеспечивают адресацию 20-разрядного адресного пространства с помощью 16-и разрядных операндов.
Регистр сегмента программы CS указывает на сегмент, который содержит текущую последовательность выполняемых команд. Процессор выбирает команды из данного сегмента, используя содержимое счетчика команд (EIP) как относительный адрес. Регистр не может быть загружен явно.
Регистр сегмента стека SS указывает на сегмент в котором зарезервировано место под стек. Все стековые команды используют SS при обращении к стеку.
Регистры DS, ES, FS, GS являются регистрами сегментов данных. Они содержат адреса сегментов, в которых находятся данные программы.
Этот регистр в каждый момент времени содержит относительный адрес (смещение) команды, следующей за исполняемой. Регистр IP программно недоступен, наращивание адреса в нем производит сам процессор, учитывая при этом длину текущей команды. Команды переходов, прерываний, вызова подпрограмм и возврата из них изменяют содержимое IP, осуществляя тем самым переходы в требуемые точки.
Регистр флагов эквивалентен регистру состояния процессора других систем. Он содержит информацию о текущем состоянии процессора:
VM (бит 17) - обеспечивает режим виртуального 8086 в защищенном режиме;
RF (бит 16) - флаг возобновления, временно прекращает отладку, возвращая процессор к нормальному выполнению программы;
NT (бит 14) - вложенная задача, процессор использует этот флаг для управления последовательностью прерываемых и вызываемых задач;
IOPL (биты 13-12) - уровень привилегий ввода-вывода, используется в защищенном режиме;
OF (бит 11) - флаг переполнения, устанавливается, если операция привела к переносу (заему) в знаковый (самый старший) бит результата, но не привела к переносу (заему) из самого старшего бита, или наоборот;
DF (бит 10) - флаг направления, показывает должны ли регистры ESI и EDI инкрементироваться или декрементироваться во время операций над строками. Если флаг сброшен они инкрементируются, иначе - декрементируются;
IF (бит 9) - разрешение прерываний, очистка этого бита запрещает процессору реагировать на внешние маскируемые прерывания;
TF (бит 8) - флаг ловушки, установка флага переводит процессор в пошаговый режим для отладки;
SF (бит 7) - флаг знака, устанавливается если есть 1 в старшем бите результата;
ZF (бит 6) - флаг нуля, устанавливается если все биты результата равны 0;
AF (бит 4) - флаг вспомогательного переноса, используется для упрощения сложения и вычитания упакованных двоично-десятичных чисел. Независимо от длины операнда (8, 16 или 32 бита) флаг AF установлен, если операция привела к заему из бита 3 при вычитании или переносу из бита 3 при сложении, иначе он сброшен. Это связано с тем, что двоично-десятичные числа используют биты с 0 по 3 для представления десятичных цифр;
PF (бит 2) - флаг четности, устанавливается если младшие восемь бит результата содержат четное число единиц (проверка на четность);
CF (бит 0) - флаг переноса, устанавливается если операция привела к переносу из старшего бита при сложении или к заему в старший бит при вычитании.
Ниже показаны регистры процессоров поддерживающих 64-х битную архитектуру: