|
Средства разработки программного обеспечения на языке низкого уровняСтр 1 из 9Следующая ⇒ Лабораторная работа №1 Средства разработки программного обеспечения на языке низкого уровня Цель работы Изучить основные характеристики, области применения ЭВМ различных классов. Получить основные навыки по использованию программного обеспечения на языке низкого уровня ассемблер. Теоретические основы Основные средства разработки программного обеспечения на языке ассемблера В состав основных средств следует включить следующие программы: • ассемблер (assembler) - компилятор с языка ассемблера, т.е. программа, переводящая исходный текст программы на языке, понятном человеку (точнее сказать "на языке понятном программисту") в язык, понятный компьютеру (машинный код). Так как программы обычно составляются из нескольких частей, написанных независимо друг от друга и, зачастую, на разных языках и разными программистами, то компилятор любого языка из любого пакета создает так называемые объектные модули, т.е. файлы специального формата, содержащие помимо машинного кода другую информацию, необходимую для работы компоновщика и отладчика. В DOS и Windows такие файлы получают расширение obj, а в Unix – o; • компоновщик (linker) - программа, предназначенная для создания исполняемой программы из объектных модулей; • отладчик (debuger) - программа для поиска и локализации в программе логических ошибок или для тестирования программы (проверки на правильность работы). Может также использоваться для изучения работы "чужих" программ, которые недоступны в исходных текстах. К числу других средств следует отнести: • дизассемблер (disassembler) - программа, переводящая исполняемый машинный код в исходный текст на языке ассемблера. В принципе, часть функций дизассемблера выполняют отладчики, но для получения листинга все же потребуется дизассемблер. Такая утилита может понадобится, если необходимо убедиться в правильности машинного кода или "расшифровать" программу, для которой недоступен исходный текст; • шестнадцатиричный редактор (hex editor) - редактор бинарных файлов (программ, библиотек, архивов, изображений и т.д.), в котором содержимое редактируемого файла представляется в шестнадцатиричном формате. Подобный редактор может использоваться, например, для того, чтобы исправить без перекомпиляции программы какую-нибудь команду или константу; • библиотекарь (librarian) - программа для превращения специально подготовленных объектных модулей в библиотеки подпрограмм. Как правило в библиотеки объединяются несколько объектных модулей, содержащих подпрограммы, написанные в соответствии с соглашениями по передаче параметров, принятые в языках программирования и на данной системе. В DOS и Windows библиотеки имеют расширение lib, а в Unix - a или la; • эмулятор (emulator) – программа, которая может понадобиться при кроссразработке, например, при программировании микроконтроллеров. Позволяет запускать машиный код “неродной” архитектуры. Пакет OpenWatcom Данный лабораторный практикум ориентируется на использование открытого программного обеспечения в лице пакета OpenWatcom. Его "домашняя страничка" - http://www.openwatcom.org/. Здесь можно получить исходные тексты пакета и установочные программы для Windows и OS/2. Плюсы данного подхода: • бесплатность и общедоступность полнофункционального программного обеспечения; • совместимость в разных смыслах с популярными, но закрытыми пакетами Borland Turbo Assembler (TASM) и Microsoft Macro Assembler (MASM); • использование для ассемблера синтаксиса Intel, позволяющее продолжать разрабатывать программы на ассемблере, написанные для пакетов TASM и MASM, и использовать широко распространенную и доступную документацию и литературу (прежде всего на русском языке); • постоянное развитие и совершенствование пакета, выражаемое в лучшей поддержке средствами разработчика современных аппаратных платформ по сравнению с пакетами TASM и MASM. Недостатки данного подхода: • ориентация пакета на платформы DOS, Windows и OS/2, т.е. невозможность использования данного пакета на платформе Unix и, как следствие, невозможность использования навыков программирования на языке ассемблера, полученных в среде Unix; • отставание в поддержке современных платформ по сравнению с другими открытыми средствами разработчика, такими как, Netwide Assembler (NASM), Flat Assembler (FASM) и GNU Assembler (GNU as).
Основные инструментальные средства, входящие в состав пакета В состав пакета OpenWatcom входят следующие базовые средства разработки программного обеспечения на языке ассемблера: • wasm - компилятор с языка ассемблера; • wlink - компоновщик объектных модулей в исполняемую программу; • wd - интегрированная среда предназначенная для отладки и дизассемблирования программ.
Компиляция и компоновка Будем считать, что файл программы на языке ассемблера называется main.asm. Для выполнения последующих команд необходимо установить корректное значение переменной окружения PATH, чтобы операционная система могла определить местонахождение этих команд. По умолчанию пакет OpenWatcom устанавливается в каталог c:\watcom. Тогда переменную PATH нужно дополнить значением c:\watcom\binw. set PATH=c:\watcom\binw;%PATH% Компиляция ассемблерного модуля осуществляется следующей командой: Wasm main.asm А компоновка в исполняемую программу формата exe операционной системы DOS: Wlink file main.obj form dos Для компиляции и компоновки можно также воспользоваться следующим пакетным файлом DOS/Windows (compile.bat): @echo off Cls c:\watcom\binw\wasm main.asm If errorlevel 1 goto ERROR c:\watcom\binw\wlink file main.obj form dos If errorlevel 1 goto ERROR Exit :ERROR echo ERROR! Кроме того, необходимо убедиться, что в файле c:\autoexec.bat присутствуют следующие команды: SET PATH=C:\WATCOM\BINNT;C:\WATCOM\BINW;%PATH% SET WATCOM=C:\WATCOM SET EDPATH=C:\WATCOM\EDDAT SET INCLUDE=C:\WATCOM\H;C:\WATCOM\H\NT SET FINCLUDE=C:\WATCOM\SRC\FORTRAN Если это не так, то эти команды следует включить в вышеприведенный файл compile.bat. (Это необходимо для нормальной работы OpenWatcom.) Отладка Отладчик запускается командой Wd main.exe Можно также воспользоваться таким командным файлом (debug.bat): @echo off Cls if not exist main.exe echo main.exe не существует! If not exist main.exe goto EXIT c:\watcom\binw\wd main.exe :EXIT The Open Watcom Debugger является полноэкранным визуальным отладчиком, позволяющим одновременно наблюдать исходный текст программы, ее машинный код, содержимое регистров, ячеек памяти и стека. Пошаговое выполнение программы осуществляется с помощью клавиш F8 (с заходом в процедуры) и F10 (без захода в процедуры). Ниже кратко описаны три постоянно развивающихся и совершенствующихся многоплатформенных компилятора использующих оригинальный синтаксис языка ассемблера. Компилятор Flat Assembler Простой и многоплатформный (DOS, Windows и Unix) компилятор с оригинальным синтаксисом базирующимся на синтаксисе Intel. Домашняя страничка - http://www.flatassembler.net/. 2.5 Компилятор GNU Assembler и синтаксис AT&T Основной компилятор ассемблера для Unix-подобных операционных систем GNU, Linux, FreeBSD, NetBSD и OpenBSD. Разработан в рамках проекта GNU (http://www.gnu.org/). Пакет Turbo Assembler Пакет Turbo Assembler (TASM) фирмы Borland не имеет единой интегрированной среды, но по популярности не уступает пакету MASM. Задание 1. Ознакомиться с пакетом OpenWatcom и с пакетом Turbo Assembler (TASM), воспользовавшись следущей программой: Begin: mov AX, DataSg mov DS, AX; Mov AH, 09h Mov DX, offset message int 21h; Mov AX, 4C00h int 21h; CodeSg ends;------------------------------------ DataSg segment 'DATA'; message db 'Hello World!', '$'; DataSg ends;------------------------------------ StackSg segment stack 'STACK' Db 256 dup(0) StackSg ends;------------------------------------ end begin __ 2. Произвести компиляцию и компановку данной программы, с использованием обоих пакетов 3. Произвести отладку программы.
Лабораторная работа №2 Режимы адресации. Цель работы Основные характеристики, области применения ЭВМ различных классов. Изучение устройства компьютера: 2-чная и 16-ричная арифметика. Регистры процессора. Теоретические основы Регистры Процессоры, программно совместимые с Intel 8086-80286, имеют 14 регистров, используемых для управления выполняющейся программой, для адресации памяти и для обеспечения арифметических вычислений. Каждый регистр имеет длину 16 бит (одно слово) и адресуется по имени. Биты регистра принято нумеровать слева направо:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Процессоры семейства x86-32 (32-х разрядные программно совместимые с процессором Intel i386) расширяют большинство основных регистров до 32-х разрядов, оставаясь при этом программно совместимыми снизу-вверх с прежними 16-ти разрядными процессорами. Поэтому будемобозначать все семейство процессоров начиная с 8086 и заканчивая Pentium 4 и AMD Athlon как семейство x86. Регистры процессоров семейства x86 можно поделить по назначению на следующие категории: • сегментные регистры; • регистры общего назначения; • регистры-указатели; • индексные регистры; • регистр командного указателя; • регистр флагов. Сегментные регистры Каждый сегментный регистр имеет 16-ть разрядов и обеспечивает адресацию непрерывного участка памяти объемом 64 Кбайт, который называется сегментом. Сегменты выравниваются на границу параграфа (16 байт) и таким образом адрес сегмента предполагает наличие справа четырех нулевых битов (xxxx xxxx 0000). Это позволяет иметь максимально адресуемое пространство памяти 1 Мб (2 в степени 20). Сегменты могут пересекаться и использоваться для хранения кода, данных и под стек. Процессор Intel 8086 имел сегментные регистры CS, DS, SS и ES. Начиная с процессора Intel 80286 стали доступны также два дополнительных: FS и GS. Ниже описано назначение каждого сегментного регистра. Регистр CS. Регистр сегмента кода CS содержит начальный адрес сегмента кода. Этот адрес плюс значение смещения в командном указателе IP определяет адрес команды, которая должна быть выбрана для выполнения. Для многих программ нет необходимости делать ссылки на регистр CS. Регистр DS. Регистр сегмента данных DS содержит начальный адрес сегмента данных. Этот адрес плюс смещение, определенное в команде, указывают на конкретную ячейку в сегменте данных. Регистр SS. Регистр сегмента стека SS содержит начальный адрес сегмента стека. Регистр ES. Некоторые операции над строками используют дополнительные сегментный регистр ES для управления адресацией памяти. В данном контексте этот регистр связан с индексным регистром DI. Если необходимо использовать регистр ES, ассемблерная программа должна его инициализировать. Регистры FS и GS. Позволяют иметь до 4-х одновременно доступных сегментов данных (включая адресуемые через DS и ES). Регистры общего назначения При программировании на языке ассемблера регистры общего назначения являются основными рабочими регистрами. Особенностью этих регистров является то, что возможна использование их не только как единого целого, но и по частям. Так 32-х разрядные регистры имеют в качестве младшей половинки соответствующий 16-ти разрядный регистр (однако, старшая половинка не адресуема). А 16-ти разрядные, в свою очередь имеют адресуемые младшие и старшие одно байтовые половинки. Регистры EAX и AX. Регистры EAX и AX являются аккумуляторами и применяются для всех основных операций ввода-вывода, некоторых операций над строками и некоторых арифметических операций. Например, команды умножения, деления и сдвига предполагают использование регистров EAX и AX. Некоторые команды генерируют более эффективный код, если они имеют ссылки на регистры EAX и AX. EAX AX AH AL Регистры EBX и BX. Регистры EBX и BX являются базовыми регистрами. Эти регистры общего назначения могут использоваться в качестве "индекса" для расширенной адресации. Другое общее их применение - вычисления. EBX BX BH BL Регистры ECX и CX. Регистры ECX и CX являются счетчиками. Они необходимы для управления числом повторений циклов и для операций сдвига влево или вправо. Эти регистры используется также для вычислений. ECX CX CH CL Регистры EDX и DX. Регистры EDX и DX являются регистрами данных. Они применяется для некоторых операций ввода-вывода и тех операций умножения и деления над большими числами, которые используют регистровые пары EDX:EAX или DX:AX. EDX DX DH DL Все регистры общего назначения могут участвовать в операциях сложения и вычитания как 8-ми, 16-ти и 32-х битовых значений. Регистры-указатели Регистры-указатели ESP/SP и EBP/BP обеспечивают системе прямой доступ к данным в сегменте стека. Иногда их используют для операций сложения и вычитания. Регистры SP и BP в 32-х разрядных процессорах являются младшими половинками ESP и EBP соответственно. Регистры ESP и SP - указатели стека. Указывают на текущую вершину стека. ESP SP Регистры EBP и BP - указатели базы. Используются в адресации по базе. Можно использовать для доступа к данным в стеке без использования команд push/pop. EBP BP При этом регистры SP и BP используется при 16-ти разрядном режиме адресации, а ESP и EBP – при 32-х разрядном. Индексные регистры Индексные регистры ESI/SI и EDI/DI используются в индексной адресации. Иногда их используютдля операций сложения и вычитания. Регистры ESI и SI - индекс источника при операциях со строками. ESI SI Регистр EDI и DI - индекс приемника при операциях со строками. EDI DI Регистр флагов Флаговые регистры (EFLAGS/FLAGS) определяют текущее состояние машины и содержат результаты выполнения некоторых команд (многие арифметические команды и команды сравнения изменяют состояние флагов). Флаг Назначение o (переполнение) ситуация переполнения возникает, когда результат умножения или деления не помещается в приемнике d (направление) указывает на левое или правое направление при операциях со строками i (прерывание) указывает на возможность внешних прерываний t (пошаговый режим) переводит процессор в пошаговый режим выполнения команд s (знак) содержит знак результата последней арифметической операции (0 - плюс, 1- минус) z (ноль) содержит 1, если результат последней арифметической операции 0, и 0 – в противном случае a (внешний перенос) содержит результат переноса из 3-го бита в байте при операциях с целыми числами в BCD-формате c (перенос) содержит результат переноса из старшего бита после арифметических операций p (четность) содержит 1, если в младших 8-ми битах 16-ти разрядных регистров четное количество единиц, и 0 - в противном случае Mov AX, DataSg Mov DS, AX ; Ваш код ; нормальное завершение DOS-программы Mov AX, 4C00h Int 21h CodeSg ends ;-------------------------------------------- ; Сегмент данных: ;-------------------------------------------- DataSg segment 'DATA' ; Ваши данные DataSg ends ;-------------------------------------------- ; Сегмент стека: ;-------------------------------------------- StackSg segment stack 'STACK' ; резервируем под стек 256 байт, ; заполненых нулями: Db 256 dup(0) StackSg ends ;------------------------------------ End begin
Режимы адресации В зависимости от того откуда и куда передаются данные и каким способом, различаются несколько режимов адресации: • регистровая; • непосредственная; • прямая; • косвенная; •по базе со смещением; •по базе с индексированием; •стековая. Регистровая адресация Этот вид адресации предполагает передачу данных из одного регистра в другой. Непосредственная адресация При этом виде адресации происходит загрузка в регистр константы непосредственно записанной в команде. Mov CX, 10 ; нельзя инициализировать сегментный регистр непосредственным значением: mov DS, 0000h; недопустимо! ; можно сделать так: Mov AX, 0000h Mov DS, AX ; загрузка адресов в индексные регистры: Lea SI, X Lea DI, Y Прямая адресация Здесь предполагается передача данных из ячейки памяти в другую ячейку памяти, или из ячейки памяти в регистр, или из регистра в ячейку памяти. Пример 3 (прямая адресация) ; скопировать в BX слово по адресу 0000:0000h: Mov AX, 0000h Mov ES, AX Mov BX, ES:0000h ; если в сегменте, на который указывает DS, есть переменная с именем X и ; размера слово, то значение хранящееся в DX можно скопировать в X так: Mov X, DX Косвенная адресация Этот вид адресации предполагает использование базового регистра BX, используемого в качестве указателя. Mov BX, 0000h mov AX, [BX] Mov BX, 0002h mov CX, [BX] Mov BX, offset X Mov SI, 0000h mov AX, [BX][SI]; 1 Add SI, 4 mov AX, [BX][SI]; 3 Add SI, 4 mov AX, [BX][SI]; 5 Стековая адресация Стековая адресация предназначена для передачи данных из стека и в стек. Для этого предназначены команды push и pop, адресующие ячейки памяти посредством регистра SP, и команды mov, использующие регистр BP. Использующие eax Push ds Pop es Задание В соответствии с представленной программы в лабораторной работы произвести следующие режимы адресации: - регистровую; - непосредственную; - прямую; - косвенную; - адресацию по базе со смещением; - адресацию по базе с индексированием. 5 Контрольные вопросы 1. Регистры процессоров семейства x86. 2. Структура регистра флагов. 3. Сегментная организацию памяти реального режима процессоров семейства x86. 4. Форматы и алгоритмы работы следующих команд: mov, lea, lds, les, lfs, lgs, lss; xchg. 5. Форматы и алгоритмы работы команд работы с флагами: lahf, sahf, clc/stc, cld/std, cmc, cli/sti. 6. Режимы адресации, применяемые в процессорах семейства x86. 7.Режим регистровой адресации. 8.Режим непосредственной адресации. 9.Режим прямой адресации. 10.Режим косвенной адресации. 11.Режим адресации по базе со сдвигом. 12.Режим адресации по базе с индексированием. 13.Общее понятие стека. 14.Особенности реализации стека в семействе микропроцессоров x86. 15.Форматы, предназначение и алгоритмы работы команд стека: push, pop, pusha/pushad, popa, popad.
Лабораторная работа №3 Организация памяти. Цель работы Основные характеристики, области применения ЭВМ различных классов. Изучение устройства компьютера: Сегментация памяти Пример описания данных X db 11110000b Y dw 0FFFFh Z dd 100 Push ds Pop es Mov bp, sp mov ax, [bp]+2 Флаговые операции Иногда необходимо в процессе выполнения программы изменять состояние процессора. Для этого предназначены команды работы с флагами. Пример 4 Stc; устанавливаем флаг c Clc; сбрасываем флаг c Cmc; инвертируем флаг c Std; устанавливаем флаг d Cld; сбрасываем флаг c Cli; сбрасываем флаг i Sti; устанавливаем флаг i Задание В соответствии с представленной программы в лабораторной работе №2 произвести следующие операции: - копирование содержимого одного сегментного регистра в другой; - выделение старшей части расширенного регистра данных; - извлечение данных из произвольной ячейки стека; - изменить состояние процессора, с использованием флагового регистра. 5 Контрольные вопросы 1. Как проинициализировать сегментный регистр? 2. Как поместить в регистр адрес переменной, а не ее значение? 3. Как получить содержимое ячейки зная ее сегмент и смещение? 4.Примеры использования команд работы со стеком. 5.Шаблон DOS-программы EXE-формата.
Лабораторная работа №4 Микропроцессора Цель работы Основные характеристики, области применения ЭВМ различных классов. Изучение устройства компьютера: Простейшие программы на ввод/вывод информации Теоретические основы Команды двоичной арифметики • команды сложения add и adc; inc; xadd; • команды вычитания sub и sbb; dec; • команды умножения mul и imul; • команды деления div и idiv; • команда изменения знака neg.
Пример Пример c_e_l_l_s_программы, вычисляющей следующее арифметическое выражение: где X и Y - двойное слово. CodeSg segment 'CODE' Begin: mov AX, DataSg mov DS, AX; mov BX, X; X -> BX (BX=10=Ah) mov AX, BX; X -> AX (AX=10=Ah) mul AX; AX = X^2 (AX=100=64h) mov CX, AX; X^2 -> CX (CX=100=64h) mov AX, BX; X -> AX (AX=10=Ah) mov BX, Y; Y -> BX (BX=3) mul BX; AX = X*Y (AX=30=1Eh) sub AX, 2; AX = X*Y - 2 (AX=28=1Ch) add AX, CX; AX = (X*Y - 2) + X^2 (AX=128=80h) mov CX, AX; (X*Y - 2) + X^2 -> CX (CX=128=80h) ; inc BX; Y + 1 (BX=4) mov AX, BX; (Y+1) -> AX (AX=4) mul AX; AX = (Y+1)^2 (AX=16=10h) mul BX; AX = (Y+1)^2 * (Y+1) (AX=64=40h) mov BX, AX; (Y+1)^3 -> BX (BX=64=40h) ; mov AX, CX; (X*Y - 2) + X^2 -> AX (AX=128=80h) mov DX, 0; 0 -> DX (DX=0) div BX; AX = AX / BX (AX=2) ; neg AX; -AX (AX=-2=FFFEh) ; mov Z, AX; AX -> Z ; Mov AX, 4C00h Int 21h CodeSg ends ;------------------------------------ DataSg segment 'DATA' X DW 10 Y DW 3 Z DW? DataSg ends ;------------------------------------ StackSg segment stack 'STACK' Db 256 dup(0) StackSg ends ;------------------------------------ End begin Задание Выполните 5 (пять) упражнений из ниже приведенного списка, выбирая по следующему принципу: пусть номер студента с списке группы N, тогда выполняются упражнения с номерами N, N+1, N+2, N+3, N+4. Написать программу, вычисляющую Z для заданных X и Y двумя способами (с помощью команд двоичной и двоично-десятичной арифметики). 1. Z = (X^2 + 2*Y - 45) / (X^3); 2. Z = 1 / Y + X^3 - 32; 3. Z = (3 + X/Y) / (X-Y+1); 4. Z = X / (X - Y + X*Y); 5. Z = (4 - (X+3)/(Y-1))*(-XY); 6. Z = ((X+1)/Y - 1)*2X; 7. Z = Y*(2-(Y+1)/X); 8. Z = (XY - 1)/(X+Y); 9. Z = X^3 + Y -1; 10.Z = (XY + 1)/ X^2; 11.Z = (X+Y)/(X-Y); 12.Z = - 1/X^3 + 3; 13.Z = X - Y/X +1; 14.Z = ((X+Y)/Y^2 - 1)*X; 15.Z = (X-Y)/(XY+1); 16.Z = - X/Y+Y^2 +3; 17.Z = Y^2 + XY + X/Y; 18.Z = (1 + X * Y)/2; 19.Z = -(1-Y)/(1+X); 20.Z = -X*(1-XY); 21.Z = Y+X/Y-1; 22.Z = 5/XY+X^3; 23.Z = -X + Y^3 - 1; 24.Z = X^3 / (X-Y); 25.Z = X^3 -2X^2*Y+1; 26.Z = -3X + Y^2 +1; 27.Z = -(X/Y +1)/Y^2; 28.Z = 1+X^2/3Y; 29.Z = Y-X/3+1; 30.Z = (XY)^3 +1/Y. 5 Контрольные вопросы 1. Двоичная форма представления целых чисел. 2. Дополнительный код. 3. Шестнадцатиричная форма представления целых чисел. 4. BCD и ASCII-форматы целых чисел; 5. Как объявляются поля данных размера DB, DW, DD. 6. Структура флагового регистра. 7. Форматы, предназначение и алгоритмы работы арифметических команд целочисленного устройства: add, adc, xadd, sub, sbb, imul, mul, idiv, div, inc, dec, neg; aaa, aas, aam, aad; or, xchg.
Лабораторная работа №5 Цель работы Определение типа и состава компьютера
Общие сведения Для наиболее распространенных моделей персональных компьютеров конфигурация аппаратных средств задается установкой перемычек на системной плате (motherboard) и платах контроллеров периферийных устройств, а также записывается в область данных BIOS и в энергонезависимую память CMOS специальной программой BIOS Setup. Программа HDWCFG Программа HDWCFG определяет конфигурацию аппаратных средств компьютера, пользуясь для этого описанными выше функциями BIOS. Полученная конфигурация отображается на консоли, как это показано ниже: Configuration word: C823 HDD present NPU present RAM banks: 0 Video Mode: 2 Nubber of FDD: 1 Nubber of COM ports: 2 Number of LPT ports: 3 RAM istalled: 640 Kbytes Extended RAM istalled: 0 Программа BIOSINFO Программа BIOSINFO получает и отображает на консоли дату изготовления версии BIOS, а также содержимое таблицы конфигурации, адрес которой определяется с помощью функции C0h прерывания BIOS INT 15h: BIOS data: 10/01/13 BIOSINFO address: 0212:0190 BIOSINFO Size: 8 Model: FC SubModel: 1 BIOS Revision: 0 Hardvare Cfg: 70 Reserved1: 00 Reserved2: 00 Hardware configuration ---------------------- Second IRQ Controller 8259 Real Time Clock Used function 4Fh INT 15h ISA Bus installed CPU model: 5 Vendor ID: GenuineIntel CPU Signature 00000619 CPU Feature EDX 0000F9FF CPU type: 0 CPU family: 6 CPU model: 1 CPU stepping: 9 FPU detected В листинге 1.1 вы найдете исходный текст модуля, составленного на языке ассемблера. В этом модуле определены все функции, необходимые для распознавания процессора и получения его характеристик. Листинг 1.1. Файл cpuinfo\askcpu.asm Model small CPU_ID MACRO Db 0fh Db 0a2h ENDM Stack 100h Data Public _vendor_id_msg Public _cpu_model Public _cpu_signature Public _features_ecx Public _features_edx Public _features_ebx Public _get_cpu_model _vendor_id_msg db "............", 0dh, 0ah, "$" _cpu_model db 0 _cpu_signature dd 0 _features_ecx dd 0 _features_edx dd 0 _features_ebx dd 0 Code ; ============================================ ; _get_cpu_model ; ============================================ .8086 _get_cpu_model proc Call cpu_8086 Cmp ax, 0 Jz try_80286 Mov _cpu_model, 0 Jmp end_of_detect try_80286: Call cpu_80286 Cmp ax, 0 Jz try_80386 Mov _cpu_model, 2 Jmp end_of_detect try_80386: Call cpu_80386 Cmp ax, 0 Jz try_80486 Mov _cpu_model, 3 Jmp end_of_detect try_80486: Call cpu_80486 Cmp ax, 0 Jz Pent_CPU Mov _cpu_model, 4 Jmp end_of_detect Pent_CPU: Mov _cpu_model, 5 .386 Pusha Mov eax, 00h CPU_ID Cmp eax, 1 Jl end_of_detect Mov eax, 1 CPU_ID Mov _cpu_signature, eax Mov _features_ebx, ebx Mov _features_edx, edx Mov _features_ecx, ecx Popa end_of_detect: .8086 Ret _get_cpu_model endp ; ============================================ ; cpu_8086 ; ============================================ Cpu_8086 proc Pushf Pop ax Mov cx, ax And ax, 0fffh Push ax Popf Pushf Pop ax And ax, 0f000h Cmp ax, 0f000h Je is_8086 Mov ax, 0 Ret is_8086: Mov ax, 1 Ret Cpu_8086 endp ; ============================================ ; cpu_80286 ; ============================================ .286 Cpu_80286 proc Mov ax, 0f000h Push ax Popf Pushf Pop ax And ax, 0f000h Jz is_80286 Mov ax, 0 Ret is_80286: Mov ax, 1 Ret Cpu_80286 endp ; ============================================ ; cpu_80386 ; ============================================ .386 Cpu_80386 proc Pushfd Pop eax Mov ecx, eax Xor eax, 40000h Push eax Popfd Pushfd Pop eax Xor eax, ecx Jz is_80386 Mov ax, 0 Ret is_80386: Push ecx Popfd Mov ax, 1 Ret Cpu_80386 endp ; ============================================ ; cpu_80486 ; ============================================ Cpu_80486 proc Pushfd Pop eax Mov ecx, eax Xor eax, 200000h Push eax Popfd Pushfd Pop eax Xor eax, ecx Je is_80486 Mov ax, 0 Ret is_80486: Mov ax, 1 Ret Cpu_80486 endp End Задание 1. Определите тип центрального процессора. 2. Получить и отобразить на консоли дату изготовления версии BIOS, а также содержимое таблицы конфигурации. 3. Получить информации о конфигурации компьютера при помощи BIOS 5 Контрольные вопросы 1. Определение конфигурации с помощью BIOS 2. Программа HDWCFG Программа BIOSINFO Лабораторная работа №6 Цель работы Организация арифметико-логических устройств (АЛУ), устройств управлений (УУ), системы прерываний.Арифметические операции с использованием сопроцессора Теоретические основы Логические команды Команда NOT Форматы команды NOT r/m8 NOT r/m16 NOT r/m32 Команда выполняет инверсию битов указанного в команде операнда. Команда NOT не влияет на флаги. Пример: MOV AL, 00001111b NOT AL; AL = 11110000b Команда AND Форматы команды AND AL, imm8 AND AX, imm16 AND EAX, imm32 AND r/m8, imm8 AND r/m16, imm16 AND r/m32, imm32 AND r/m16, imm8 AND r/m32, imm8 AND r/m8, r8 AND r/m16, r16 AND r/m32, r32 AND r8, r/m8 AND r16, r/m16 AND r32, r/m32 Команда может быть использована для сброса битов. Пример: Mov AL, 11111111b and AL, 00001111b; AL = 00001111b Команда OR Форматы команды те же, что и у AND. Команда может быть использована для установки битов. Пример: Mov AL, 00001111b or AL, 11110000b; AL = 11111111b Команда XOR Форматы команды те же, что и у AND. Команда может быть использована для обнуления регистров, а также для инвертирования битов. Пример: xor AX, AX; AX = 0000000000000000b Mov AL, 00001111b xor AL, 11111111b; AL = 11110000b Команда TEST Форматы команды те же, что и у AND. Команда выполняет операцию AND, но не изменяет операнд-приемник. Воздействует на флаги SF, ZF и PF. Mov CX, AX; копия X Xor CX, BX; X xor Y Not CX; not(X xor Y) and CX, BX; Y and... not CX; not(Y and...) or CX, AX; X or not(...) ;---------------------------------------- X dw 0FFFFh Y dw 00000h Виды сдвигов В зависимости от того, куда переносятся выдвинутые биты и как заполняются освободившиеся биты, команды сдвигов делятся на два вида: • линейный сдвиг; • циклический сдвиг. По направлению сдвига команды делятся на команды сдвига влево и, соответственно, вправо. Команды сдвига могут быть 8-ми, 16-ти и 32-х разрядными. В зависимости от разрядности могут сдвигать, соответственно, на 7, 15 или 31 разряд. Кол-во сдвигаемых бит может указываться непосредственным значением или в регистре CL. При этом флаг CF содержит значение последнего выдвинутого бита . Команды линейных сдвигов 3.5 3.4.1 Команды SHR\SHL (логический сдвиг вправо \влево) Форматы команд shr r/m8, 1 shr r/m8, CL shr r/m8, imm8 shr r/m16, 1 shr r/m16, CL shr r/m16, imm8 shr r/m32, 1 shr r/m32, CL shr r/m32, imm8 Команды осуществляют сдвиг битов с потерей выдвинутых битов и обнулением освободившихся. Могут применяться для умножения \ деления беззнаковых целых чисел на степени числа 2 (2d=10b). Shl AX, 3
Считается, что применение команд сдвига вместо команд умножения \деления эффективнее с точки зрения быстродействия. Кроме того, две команды Shl AX, 1 Shl AX, 1 эффективнее команд Mov CL, 2 Shl AX, CL 3.4.2 Команды SAR\SAL (команды арифметического сдвига вправо\влево) Форматы команд Форматы команд те же, что и у SHR\SHL. Команды арифметического сдвига оставляют на месте знаковый разряд. А при сдвиге вправо ещё и размножают его. Результат сдвига вправо не совпадает с результатом деления, выполняемого командой idiv. Сравните: Sar AX, 3 и Idiv 8 3.4.3 Команды SHRD\SHLD (команды сдвига вправо\влево с двойной точностью) Форматы команд shrd r/m16, r16, imm8 shrd r/m32, r32, imm8 shrd r/m16, r16, CL shrd r/m32, r32, CL Приемник сдвигается вправо\влево на число бит указанное в счетчике. Старший (для SHRD) или младший (для SHLD) бит не обнуляется, а считывается из источника, значение которого не изменяется. Например, если приемник содержит 00101001b, источник - 1010b, счетчик - 3, SHRD даст в результате 01000101b, а SHLD - 01001101b (проверьте это). Команды циклического сдвига 3.5.1 Команды ROR\ROL (циклический сдвиг вправо\влево) Форматы команд ror r/m8, 1 ror r/m8, CL ror r/m8, imm8 ror r/m16, 1 ror r/m16, CL ror r/m16, imm8 ror r/m32, 1 ror r/m32, CL ror r/m32, imm8 Осуществляют сдвиг битов без потери выдвинутых битов. Выдвинутые биты переносятся на место освободившихс< ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычислить, когда этот... Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|