Программирование целочисленного процессора х86

Отладка и использование программ, написанных на языке ассемблера. Исследование выполнения арифметических операций. Характеристика моделей 32-х разрядных процессоров х86. Анализ команды для обработки десятичных данных без перевода их в двоичный формат.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 07.06.2014
Размер файла 1,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования и науки, молодежи и спорта Украины

Харьковский национальный университет радиоэлектроники

Лабораторная работа № 1

по курсу «Архітектура комп'ютерів»

ПРОГРАММИРОВАНИЕ ЦЕЛОЧИСЛЕННОГО ПРОЦЕССОРА х86 P U)

Выполнила: Быкова Э.Н, гр. ИПЗпз-13-2

зачетная книжка 13.301345

Принял: Торба Александр Алексеевич

Харьков 2013

Содержание

Введение

1. Исследовать выполнение арифметических операций. Номер варианта выбирается в соответствии с последней цифрой номера зачетной книжки

2. Исследовать выполнение операций сравнения

3. Исследовать выполнение операций над массивами в памяти

4. Программная модель 32-х разрядных процессоров х86 (386+)

5. Зачем нужны форматы двоично-десятичных чисел?

6. Перечислите методы (способы) адресации данных в процессорах х86

7. Перечислите команды пересылки данных и расположение операндов-приемников и операндов-источников

8. Перечислите арифметические и логические команды

9. Где расположены операнды в командах умножения и деления? Куда записываются результаты умножений и делений?

10. Какие команды позволяют обрабатывать десятичные данные без перевода их в двоичный формат?

11. Как выполняются команды сдвигов?

12. Перечислите цепочечные (строковые) команды и особенности их выполнения

13. Как выполняются команды условных и безусловных переходов?

Введение

Цель работы:

- углубить и закрепить знания по архитектуре процессоров 8086+ и навыки по их программированию;

- приобрести практические навыки в составлении, отладке и выполнении программ, написанных на языке ассемблера для процессоров 8086+.

1. Исследовать выполнение арифметических операций. Номер варианта выбирается в соответствии с последней цифрой номера зачетной книжки

Вариант 5

Вычислить 6 значений функции:

Y = (2500 * х - 8) / (3 * х2 + 20) (х - изменяется от 4 с шагом 3).

Результат округлить до целого и разместить в памяти.

void main // начало программы на языке С++

long X=4; // ячейка памяти для аргумента

long REZ[6]; // 6 ячеек памяти для результатов

asm; начало ассемблерной вставки

lea EBX, REZ; загрузка адреса результатов в регистр EBX

mov ECX, 6 ; счетчик количества повторений цикла

m1:mov EAX, 3 ; EAX = 3

imul X; EAX = 3 * x

imul X; EAX = 3 * x2

add EAX, 20 ; EAX = 3 * x2 + 20

mov EDI, EAX ; пересылка знаменателя в регистр EDI

mov EAX, 2500 ; EAX = 2500

imul X; EAX = 2500 * x

sub EAX, 8 ; EAX = 2500 * x - 8

cdq; расширение операнда-делимого в EAX-EDX

div EDI; частное - EAX , остаток - EDX

shr EDI, 1; деление знаменателя (делителя) на 2

cmp EDI, EDX; сравнение половины делителя с остатком

adc EAX, 0; добавление к частному заема от сравнения

mov dword ptr[EBX], EAX; пересылка результата в память

add EBX, 4; увеличение адреса результатов

add X, 3; увеличение аргумента

loop m1; зацикливание по счетчику в ЕСХ // окончание ассемблерной вставки

Рис.1. Компиляция. Ошибок нет

Рис.1.1. Пошаговая отладка. Первое значение

Рис.1.2. Пошаговая отладка. Второе значение

Рис.1.3. Пошаговая отладка. Третье значение

Рис.1.4. Пошаговая отладка. Четвертое значение

Рис.1.5. Пошаговая отладка. Пятое значение

Рис.1.6. Пошаговая отладка. Шестое значение

Таблица 1. Проверка полученных значений ручным просчетом

№ пп

x (от 4 с шагом 3)

y

y округленное

1

4

146,9411765

147

2

7

104,742515

105

3

10

78,1

78

4

13

61,65464896

62

5

16

50,75126904

51

6

19

43,05711695

43

Файл проекта 1: File_CPU_1.cpp

2. Исследовать выполнение операций сравнения

Вариант 5

Найти целое значение аргумента, при котором функция

Y = (2000 + х) / (8 * x2 + 25) станет меньше 10.

void main // начало программы на языке С++

long X=-1; // ячейка памяти для аргумента

long Y=0; // ячейка для значения функции

asm; начало ассемблерной вставки

m1:inc X; увеличение аргумента

mov EAX, 8; EAX = 8

imul X; EAX = 8 * x

imul X; EAX = 8 * x2

add EAX, 25; EAX = 8 * x2 + 25

mov EDI, EAX; пересылка знаменателя в регистр EDI

mov EAX, 2000;EAX = 2000

add EAX, X; EAX = 2000+x

cdq; расширение операнда-делимого в EAX-EDX

div EDI; частное - EAX , остаток - EDX

mov Y, EAX ; пересылка результата в память

cmp Y, 10; сравнение значения с 10

jg m1; переход, если Y больше 10

// окончание ассемблерной вставки

Рис.2. Компиляция (F5) - успешно

Рис.2.1. Рассчитано значение Y=80 при Х=0

Рис.2.2. Выполнен переход к началу после сравнения Y с 10. Значение Х увеличено на 1

Рис.2.3. Выход из цикла после достижения Y<10 (после 5 прохождений цикла, при Х=5)

Файл проекта 2: File_CPU_2.cp

3. Исследовать выполнение операций над массивами в памяти

Вариант 6

В памяти задан массив из 8-ми элементов. Поместить в регистр EAX максимальный элемент массива, а в регистр ESI его адрес в памяти.

void main () {

long x[8]={62, 22, 68, 12, 70, 44, 89, 19}; //массив в памяти

_asm {; начало ассемблерной вставки

Lea EBX, x ; начальный адрес массива - в ЕВХ

Mov ECX, 7; счетчик повторений

Mov EAX, dword ptr[EBX] ; первый элемент - в ЕАХ

m2:add EBX, 4; увеличение адреса

cmp EAX, dword ptr[EBX]; сравнение со следующим элементомja m1; переход, если ЕАХ больше следующего

mov EAX, dword ptr[EBX]; больший элемент - в ЕАХ

mov ESI, EBX; адрес элемента - в ESI

m1: loop m2; зацикливание по счетчику

Рис.3. Восемь элементов массива внесены в память

Рис.3.1.Внесены значение и адрес первого элемента массива в ЕАХ и ЕВХ

Рис.3.2.При сравнении и нахождении большего элемента значения ЕАХ и ЕВХ меняются

Рис.3.3.Найдено максимальное значение и его адрес. После еще одного цикла - выход

Файл проекта 3: File_CPU_3.cpp

4. Программная модель 32-х разрядных процессоров х86 (386+)

МП 386+ имеет 31 регистр:

a) регистры общего назначения; это 8 32-битных регистров, их используют для хранения данных и адресов

eax/ax/ah/al -- аккумулятор.

Применяется для хранения промежуточных данных.

ebx/bx/bh/bl -- базовый регистр.

Применяется для хранения базового адреса некоторого объекта в памяти; программа язык ассамблер процессор

ecx/cx/ch/cl -- регистр-счетчик.

Его использование часто скрыто в команде. Например, команда цикла loop, кроме передачи управления анализирует и уменьшает на единицу значение регистра ecx/cx;

edx/dx/dh/dl -- регистр данных. Как и аккумулятор, он хранит промежуточные данные.

Следующие два регистра используются для поддержки операций, производящих последовательную обработку цепочек элементов, которые могут быть 32, 16, 8 бит.

esi/si -- индекс источника.

В цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;

edi/di -- индекс приемника (получателя).

В цепочечных операциях содержит текущий адрес элемента в цепочке-приемнике.

В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком существуют специальные регистры:

esp/sp -- регистр указателя стека.

Содержит указатель вершины стека в текущем сегменте стека.

ebp/bp -- регистр указателя базы кадра стека.

Предназначен для организации произвольного доступа к данным внутри стека.

b) сегментные регистры; их 6 шт.

cs, ds, ss, es, fs, gs;

Микропроцессор имеет сегментную память, то есть аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Эти регистры нужны, чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент.

cs -- сегментный регистр кода, он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор.

ds -- основной сегментный регистр данных, хранит адрес сегмента данных программы.

ss -- сегментный регистр стека, содержит адрес сегмента стека.

es, gs, fs - содержат адреса дополнительных сегментов данных, которые, в отличие от

основного, требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде.

c) указатель команд и регистр флагов

eip/ip - хранит смещение, которое всегда складывается со значением кодового сегментного регистра (CS) и определяет адрес следующей команды.

eflags/flags-- регистр флагов, его разрядность -- 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами.

Также предусмотрены:

d) управляющие регистры;

e) регистры системных адресов;

f) отладочные регистры;

g) тестовые регистры.

Перечислите форматы данных процессоров х86.

32-х разрядные процессоры (386+) работают с целыми двоичными числами длиной 8, 16 или 32 бита и двоично-кодированными десятичными числами (BCD-числами) длиной 8 бит. Двоичные числа допускают интерпретацию как целых без знака и целых со знаком, а десятичные (BCD) - знака не имеют.

Поддерживаются битовые данные:

байт -- восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом;

слово -- последовательность из двух байт, имеющих последовательные адреса. Размер слова -- 16 бит; биты в слове нумеруются от 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит - старшим байтом. Младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта

двойное слово -- последовательность из четырех байт (32 бита), расположенных по последовательным адресам.

учетверенное слово -- последовательность из восьми байт (64 бита), расположенных по последовательным адресам.

5. Зачем нужны форматы двоично-десятичных чисел?

BCD-числа нужны в приложениях, где числа должны быть большими и точными. При использовании только двоичных чисел возникают следующие проблемы:

a) значения величин в формате слова и двойного слова имеют ограниченный диапазон

b) наличие ошибок округления.

c) представление большого объема результатов в символьном виде (ASCII-коде) из двоичных чисел весьма сложно. Преобразование из BCD в символьный вид и обратно получается намного проще и быстрее.

6. Перечислите методы (способы) адресации данных в процессорах х86

Процессор 386+ обеспечивает 13 режимов адресации:

Неявная адресация

Режим регистровой адресации

Режим непосредственной адресации

Прямая адресация

Регистровый косвенный метод адресации

Базовая адресация

Индексная адресация

Индексная адресация с шагом

Базово-индексная адресация

Базово-индексная адресация с шагом

Базово-индексная адресация с отклонением

Базово-индексная адресация с отклонением и с шагом

Стековая адресация

7. Перечислите команды пересылки данных и расположение операндов-приемников и операндов-источников

Команды этой группы предназначены для пересылок байт, слов или двойных слов из памяти в регистр, из регистра в память и из регистра в регистр. В одной команде невозможно использование двух операндов, расположенных в памяти (за исключением цепочечных команд и операций со стеком).

MOV dest, src Пересылка (копирование) данных из регистра, памяти или непосредственного операнда в регистр или память

XCHG r/m, reg Обмен данными (взаимный) между регистрами или регистром и памятью

BSWAP reg32 Перестановка байтов в регистре из порядка младший-старший в порядок старший-младший (486+)

MOVSXB (MOVZXB) reg, r/m Копирование байта с расширением до слова или двойного слова, заполняя старшие биты знаком (нулем)

MOVSXW (MOVZXB) reg, r/m Копирование слова с расширением до двойного слова, заполняя старшие биты знаком знаком (нулем)

XLAT Трансляция (перекодирование) содержимого AL в значение из таблицы трансляции, адресуемой в (Е)BX: AL < [(E)BX+AL]

LEA reg16/32, mem Загрузка эффективного адреса в регистр

LDS (E/F/G/S) reg16/32, mem Загрузка в регистр (двойного) слова из памяти, а в

DS(E/F/G/S) - следующего 16-ти битового слова

IN AL(AX), port8(DX) Ввод в AL (или AX,EAX) из порта с адресом port8(DX)

OUT port8(DX), AL(AX) Вывод из AL (или AX,EAX) в порт с адресом port8(DX)

8. Перечислите арифметические и логические команды

ADD r/m, r/m/i Сложение двух операндов: r/m < (r/m + r/m/i)

XADD r/m, reg Обмен и сложение (486+)

ADC r/m, r/m/iСложение двух операндов с учетом переноса от предыдущей операции: r/m < (r/m + r/m/i + CF)

INC r/m Увеличение на 1: r/m < (r/m + 1)

SUB r/m, r/m/i Вычитание: r/m < (r/m - r/m/i)

SBB r/m, r/m/i Вычитание с заемом: r/m < (r/m - r/m/i - CF)

DEC r/m Уменьшение на 1: r/m < (r/m - 1)

CMP r/m, r/m/i Сравнение - вычитание без сохранения результата (устан.флагов)

NEG r/m Изменение знака операнда (преобразование в дополнительном коде)

MUL r/m Умножение AL/AX/EAX на беззнаковое целое значение из r/m

IMUL r/m Умножение AL/AX/EAX на целое знаковое значение из r/m

DIV r/m Деление расширенного аккумулятора на беззнаковое число из r/m

IDIV r/mЗнаковое деление расширен. аккумулятора на знаковое целое из r/m

Логические:

AND r/m, r/m/i Побитовое логическое И

TEST r/m, r/m/i Проверка бит (логическое И без записи результата - установка флагов)

OR r/m, r/m/i Побитовое логическое ИЛИ

XOR r/m, r/m/i Побитовое логическое ИСКЛЮЧАЮЩЕЕ ИЛИ

NOT r/m Побитовая инверсия

9. Где расположены операнды в командах умножения и деления? Куда записываются результаты умножений и делений?

Команды умножения могут иметь: одно-, двух- или трехадресную форму.

В одноадресных командах MUL и IMUL один из сомножителей по умолчанию размещается в аккумуляторе, а второй - указан в команде. Результат умножения в два раза длиннее операндов.

Разрядност операндов

Множитель

Результат

Старшая часть

Младшая часть

8

AL

AH

AL

16

AX

DX

AX

32

EAX

EDX

EAX

При двухадресной форме (IMUL reg16/32,r/m) или трехадресной форме (IMUL reg16/32, r/m, immed) команд умножения со знаком - результат размещается в регистре-приемнике. В этом случае старшие 16 (или 32) разряда произведения при умножении 16-ти (или 32-х) разрядных операндов теряются. Такие команды удобно применять для вычисления адресов элементов массивов.

Команды деления DIV и IDIV имеют только одноадресную форму, причем разрядность делимого (см. табл. 8) должна вдвое превышать разрядность делителя, указанного в команде.

Знак остатка при выполнении команды IDIV устанавливается равным знаку делимого.

Разрядность

делителя

Делимое

Частное

Остаток

Старшие разряды

Младшие разряды

8

AH

AL

AL

AH

16

DX

AX

AX

DX

32

EDX

EAX

EAX

EDX

10. Какие команды позволяют обрабатывать десятичные данные без перевода их в двоичный формат?

Система команд процессоров х86 позволяет выполнять арифметические действия над числами, представленными в BCD коде или в коде ASCII. Для этих чисел допустимы значения от 0 до 9 в младшей тетраде.

DAA (DAS) Коррекция AL после BCD-сложения (вычитания)

AAA (AAS) Коррекция AL после ASCII- сложения (вычитания)

AAM Коррекция AL после ASCII-умножения

AAD Коррекция AL,AH перед ASCII-делением

11. Как выполняются команды сдвигов?

Команды сдвигов и циклических сдвигов выполняют сдвиг 8/16/32-х битового операнда на 1 бит или на произвольное число бит (но не больше длины операнда). Для сдвигов более, чем на один бит, число сдвигов может быть записано предварительно в регистр CL или задано непосредственным операндом в команде (286+). Во всех командах сдвигов последний выдвигаемый бит помещается во флаг CF.

В командах двойного сдвига операндом-приемником (dest) может быть содержимое reg16/32 или mem16/32, операндом-источником (src) - только содержимое РОНа (с разрядностью 16/32). Для сдвигов более, чем на один бит, число сдвигов может быть записано предварительно в регистр CL или задано непосредственным операндом в команде.

Логический сдвиг влево/вправо SHL/SHR

Арифметический сдвиг влево/вправо SAL/SAR

Циклический сдвиг влево/вправо ROL/ROR

Циклический сдвиг ч/з флаг CF влево/вправо RCL/RCR

Двойной сдвиг влево/вправо SHLD/SHRD

12. Перечислите цепочечные (строковые) команды и особенности их выполнения

Цепочечной (строковой) называется операция, которая выполняется над каждым элементом цепочки.

Перед выполнением цепочечных команд необходимо:

a) загрузить начальный (конечный) адрес цепочки-источника в регистры DS:(E)SI;

b) загрузить начальный (конечный) адрес цепочки-приемника в регистры ES:(E)DI

c) сбросить флаг DF=0 (командой CLD), если цепочки обрабатываются по возрастанию адресов, или установить флаг DF=1 (командой STD), если цепочки обрабатываются по убыванию адресов;

d) при использовании префикса повторения REP в регистр (E)СХ загрузить количество повторений цепочечной операции;

e) при работе с портами в регистр DX загрузить адрес порта.

MOVS mem(DI) mem(SI), Модифицировать SI, DI

CMPS mem(SI) - mem(DI), FLAGS, Модифицировать SI, DI

SCAS A - mem(DI), FLAGS, Модифицировать DI

LODS A mem(SI), Модифицировать SI

STOS mem(DI) A, Модифицировать DI

INS mem(DI) port(DX), Модифицировать DI (286+)

OUTS port(DX) mem(SI), Модифицировать SI (286+)

13. Как выполняются команды условных и безусловных переходов?

Команда безусловного перехода имеет 5 форм, различающихся расстоянием до адреса назначения от текущей команды и способом задания целевого адреса - target.

a) В коротком (SHORT) внутрисегментном переходе двухбайтовая команда JMP rel8 содержит во втором байте смещение в дополнительном коде (максимально возможный переход: назад - 128 или вперед +127 от адреса команды, находящейся после команды JMP).

b) Команда прямого внутрисегментного перехода (NEAR) аналогична предыдущей, но полное смещение в дополнительном коде содержит 16 (32) бита, которое прибавляется к текущему значению (E)IP. Эта форма команды передает управление в любую точку текущего сегмента кода.

c) В команде косвенного внутрисегментного перехода JMP r/m адрес целевого назначения (target) загружается в (E)IP из регистра или ячейки памяти.

d) Команда прямого межсегментного перехода JMP prt содержит непосредственный операнд, содержащий: 16-ти битовый селектор, который загружается в регистр CS, и 16-ти (или 32-х) битовое смещение, загружаемое в (E)IP.

e) Команда косвенного межсегментного перехода адресует в памяти полный 32-х (или 48-ми) битовый указатель - селектор: смещение. Селектор загружается в регистр CS, а смещение - в регистр (E)IP.

Команды условного перехода осуществляют передачу управления в зависимости от результатов предыдущих операций.

Все команды условных переходов производят передачу управления только в пределах текущего сегмента кода (т.е. содержимое сегментного регистра CS не изменяется), если заданное в команде условие удовлетворяется. Переход реализуется прибавлением находящегося в команде смещения (в дополнительном коде) к содержимому регистра (E)IP. В процессорах 86/286 8-ми битовое смещение обеспечивает диапазон перехода от - 128 до +127 байт. В процессорах 386+ наряду с таким смещением допускается также полное 16-ти или 32-х битовое смещение в дополнительном коде. Этим обеспечивается переход в любую точку текущего сегмента кода.

Чем отличаются команды JMP и CALL

Команда CALL имеет такие же формы (относительную, прямую и косвенную), как и команда JMP; отсутствует только короткая (SHORT) форма.

По воздействию на регистры CS и (E)IP команда CALL также соответствует команде JMP, но дополнительно включает в текущий сегмент стека адрес возврата с соответствующей коррекцией указателя стека (E)SP.

Размещено на Allbest.ru


Подобные документы

  • Исследование общих принципов программирования на языке Assembler для 32-х разрядных и 64-х разрядных процессоров. Изучение основных отличий архитектур i686 и amd64. Работа со стеком. Передача параметров в функции. Смена способа адресации внутри программы.

    контрольная работа [118,2 K], добавлен 10.02.2015

  • Ознакомление с языком ассемблера процессора Neuro Matrix NM 6403, его возможности, особенности работы, содержание операций в регистрах, архитектура. Разработка программы для заполнения блока памяти, компилирование и отладка файла, фиксирование его адреса.

    лабораторная работа [48,2 K], добавлен 18.10.2012

  • Модели параллельного программирования; отладка параллельных программ. Реализация экспериментальной версии системы сравнительной отладки Fortran-OpenMP программ: получение, сбор и запись трассы, инструментарий программ, используемый формат файлов трассы.

    дипломная работа [92,8 K], добавлен 17.10.2013

  • Структурное программирование, схема алгоритма. Программа на языке Си для int, float. Подпрограмма ввода и вывода целых чисел на Ассемблере IBM. Тестирование и отладка, инструкция пользователя. Язык программирования Си (для int и float), этапы трансляции.

    курсовая работа [1,5 M], добавлен 21.10.2014

  • Двоично-десятичный формат (BCD - Binary Coded Decimal). Преобразование ASCII формата в двоичный формат. Арифметические инструкции и флаги. Форматы арифметических данных. Выполнение арифметических операции. Сложение. Вычитание. Умножение. Деление.

    доклад [16,2 K], добавлен 22.09.2008

  • Управление взаимодействием всех устройств ЭВМ. История создания и развития производства процессора. Структура центрального процессора. Регистры общего назначения. Обозначения популярных моделей процессоров Intel и AMD. Команды центрального процессора.

    реферат [111,2 K], добавлен 25.02.2015

  • Программирование микро ЭВМ на МП БИС КР580ИК80. Арифметические команды. Представление чисел в различных системах счисления и отображение их на дисплее. Сложение массива однобайтных чисел. Вычитание одинаковых чисел. Сложение двух десятичных чисел.

    лабораторная работа [263,8 K], добавлен 03.03.2009

  • Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.

    курсовая работа [461,0 K], добавлен 03.07.2011

  • Анализ уязвимостей в многопоточных программах, написанных на языке С++. Создание программного обеспечения, выполняющего анализ многопоточных программ, написанных на С++, на предмет наличия в них ошибок синхронизации типа "гонки" и "заброшенные замки".

    курсовая работа [755,9 K], добавлен 20.09.2016

  • Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.

    курсовая работа [233,5 K], добавлен 14.12.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.