
- •Конспект лекций по дисциплине
- •Часть 1. Устройство и общая архитектура персонального компьютера Лекция 1. Основные понятия и определения дисциплины
- •1.1. Что такое персональный компьютер
- •1.2. Зачем необходим персональный компьютер радиоинженеру?
- •1.3. Персональные компьютеры, совместимые с ibm pc
- •1.4. Конструктивные особенности персональных компьютеров
- •Настольные компьютеры
- •Малогабаритные компьютеры
- •Промышленные и инструментальные компьютеры
- •Лекция 2. Общая структура персонального компьютера
- •2.1. Центральный процессор cpu
- •2.2. Элементы памяти
- •2.3. Периферийные устройства
- •2.4. Устройства ввода-вывода и коммуникаций
- •2.5. Адаптеры, контроллеры и иерархия подключений периферийных устройств
- •Лекция 3. Архитектура пэвм ibm pc и способы подключения внешних устройств
- •3.1. Функциональная схема пэвм ibm pc/xt Шинная организация персональных компьютеров
- •Организация системных шин pc/xt
- •3.2. Способы подключения внешнего устройства к компьютеру
- •Включение через последовательный порт
- •Включение через параллельный порт
- •Включение в системную шину
- •Подключение через современные интерфейсы
- •3.3. Программное обеспечение
- •Лекция 4. Архитектура системной платы современного
- •4.1. Шинно-мостовая архитектура
- •4.2. Хабовая архитектура
- •4.3. Архитектура HyperTransport
- •4.4. Чипсеты и системные платы
- •Лекция 5. Центральный процессор современных pc. Структура и режимы работы
- •5.1. Архитектура и микроархитектура процессоров
- •5.2. Режимы работы процессоров
- •5.3. Программная модель процессоров x86
- •Регистры общего назначения
- •Индексные регистры
- •Сегментные регистры
- •Регистры состояния и управления
- •Лекция 6. Структура программы на языке Ассемблера
- •6.1. Организация сегментов
- •6.2. Директивы управления сегментами и моделями памяти
- •6.3. Структура программ на ассемблере masm
- •Лекция 7. Основы программирования на языке Ассемблера
- •7.1. Структура команды языка Ассемблера
- •7.2. Операнды команд языка Ассемблера
- •7.3. Способы адресации памяти языка Ассемблера
- •7.4. Псевдокоманды языка Ассемблера
- •Псевдокоманды db, dw и dd
- •Псевдокоманда equ
- •Псевдокоманды resb, resw и resd
- •Псевдокоманда times
- •Лекция 8. Команды пересылки данных и логические команды языка Ассемблера
- •8.1. Команды пересылки данных
- •8.2. Логические команды языка Ассемблера
- •8.3. Массивы битов (разрядные матрицы)
- •Лекция 9. Команды целочисленной арифметики в языке Ассемблера
- •9.1. Арифметические команды сложения и вычитания
- •Инструкции сложения add и вычитания sub
- •Команды инкрементирования inc и декрементирования dec
- •9.2. Команды для работы с отрицательными числами
- •9.3. Арифметические команды умножения и деления
- •Команды mul и imul
- •Команды div и idiv
Лекция 9. Команды целочисленной арифметики в языке Ассемблера
9.1. Арифметические команды сложения и вычитания
Процессор 80386 не содержит математического сопроцессора, поэтому мы рассмотрим только целочисленную арифметику, которая полностью поддерживается процессором 80386. Каждая арифметическая команда изменяет регистр признаков.
Инструкции сложения add и вычитания sub
Команда ADD требует двух операндов, как и команда MOV:
add o1,о2
Команда ADD складывает оба операнда и записывает результат в o1, предыдущее значение которого теряется. Точно так же работает команда вычитания – SUB:
sub o1,o2
Результат, o1-o2, будет сохранен в o1, исходное значение o1 будет потеряно.
Рассмотрим примеры использования инструкций ADD и SUB:
add eax,8 ; EAX = EAX + 8
sub ecx,ebp ; ECX = ECX - EBP
add byte [number],4 ; добавляем значение 4 к переменной
; number размером в 1 байт (0-255)
sub word [number],4 ; number = number - 4 размером в 2 байта
; (диапазон значений 0-65535)
add dword [number],4 ; добавляем значение 00000004 к "number"
sub byte [number],al ; вычитаем значение регистра AL из "number"
sub ah,al ; АН = АН - AL
При работе с большими диапазонами чисел, чем могут поддерживать регистры в арифметических командах используется признак переноса – флаг CF.
Полезны для этого команды ADC (Add With Carry – сложение с переносом) и SBB (Subtract With Borrow – вычитание с займом):
adc o1,o2 ; o1 = о1 + о2 + CF
sbb o1,o2 ; o1 = o1 - о2 - CF
Эти команды работают так же, как ADD и SUB, но соответственно добавляют или вычитают флаг переноса CF.
В контексте арифметических операций очень часто используются так называемые пары регистров. Пара – это два регистра, использующихся для хранения одного числа. Часто используется пара EDX:EAX (или DX:AX) – обычно при умножении. Регистр АХ хранит младшие 16 битов числа, a DX – старшие 16 битов. Таким способом даже древний 80286 может обрабатывать 32-разрядные числа, хотя у него нет ни одного 32-разрядного регистра. Пример: пара DX:AX содержит значение 0xFFFF (АХ = 0xFFFF, DX = 0).
Добавим 8 к этой паре и запишем результат обратно в DX:AX:
mov ax,0xffff ; AX = 0xFFFF
mov dx,0 ; DX = 0
add ax,8 ; AX = AX + 8
adc dx,0 ; добавляем 0 с переносом к DX
Первая команда ADD добавит 8 к регистру АХ. Полностью результат не помещается в АХ, поэтому его старший бит переходит в CF. Вторая команда добавит к DX значение 0 и значение CF. После выполнения ADC флаг CF будет добавлен к DX (DX теперь равен 1). Результат сложения 0xFFFF и 8 (0x10007) будет помещен в пару DX:AX (DX=0x1,AX=0x0007).
Процессор 80386+ может работать с 32-разрядными числами напрямую – безо всяких переносов:
mov eax,0xffff ; ЕАХ = 0xFFFF
add eax,8 ; ЕАХ = ЕАХ + 8
После выполнения этих инструкций в ЕАХ мы получим 32-разрядное значение 0x10007. Для работы с 64-разрядными числами мы можем использовать пару EDX:EAX – точно так же, как мы использовали пару DX:AX.
Отрицательные целые числа в ПК представлены в так называемом дополнительном коде. Процесс отображения отрицательных чисел в дополнительный код иногда называют маппингом (mapping).
Один байт может содержать числа в диапазоне от 0 до 255. Код дополнения заменяет этот диапазон другим – от -128 до 127. Дополнительный код может быть расширен до 2 байтов (от 0 до 65535). Он будет охватывать диапазон чисел от -32768 до 32767. Если дополнительный код расширить до 4 байтов, то получим диапазон от -2147483648 до 2147483647. Во многих языках программирования именно этот диапазон используется для код целочисленного типа данных (integer).
Выполнять арифметические операции над отрицательными числами в дополнительном коде можно при помощи обычных команд ADD и SUB. Единственное отличие от операций с положительными числами – необходимо игнорировать установку флага переноса. При этом результат операции является истинным и представлен в дополнительном коде.
Механизм дополнительного кода ввели именно для того, чтобы при сложении и вычитании отрицательных чисел не приходилось выполнять дополнительных действий.
Отрицательные числа также могут использоваться при адресации памяти. Например, регистр ВХ содержит адрес, а нам нужен адрес предыдущего байта, но мы не хотим изменять значение регистра ВХ (предполагается, что процессор находится в реальном режиме):
mov ах,[bх-1] ; поместить в АХ значение по адресу, который
; на единицу меньше, чем значение в ВХ
Значение -1 будет преобразовано в 0xFFFF, и инструкция будет выглядеть так:
mov ax,[bx+0xFFFF]
При вычислении адреса не учитывается флаг CF, поэтому мы получим адрес, на единицу меньший.