Добавил:
vanya.tagaschev@ya.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
21.03.2021
Размер:
416.39 Кб
Скачать

МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное бюджетное образовательное учреждение высшего образования

УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет информационных систем и технологий Кафедра «Измерительно-вычислительные комплексы»

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

По дисциплине «Организация ЭВМ и систем»

Тема: «Регистры. Формат строки. Команды перемещения данных. Инициализация данных. Работа с отладчиком»

Выполнил: ст. гр. ИСТбд-22 Тагашев И.И.

Проверил: к.т.н., доцент ИВК Тамьяров А.В.

Ульяновск, 2021 г.

ЛАБОРАТОРНАЯ РАБОТА № 2

Цель работы: знакомство с архитектурой процессора, получение навыков работы с отладчиком.

Порядок выполнения работы:

РЕГИСТРЫ

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

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

16-разрядные регистры общего назначения (РОН) AX, BX, CX, DX используются при выполнении арифметических и логических операций. Эти регистры могут выполнять некоторые специальные функции.

AX – аккумулятор;

BX – базовый регистр (использование для ссылки на ячейку памяти);

CX – счетчик;

DX – регистр данных (используется в качестве указателя адреса вводавывода);

Эти РОН допускают раздельную адресацию и могут использоваться в виде набора 8-разрядных регистров.

16-разрядные регистры общего назначения (РОН) SP, BP, SI, DI называются адресными регистрами, так как в них храниться относительные адреса, используемые для определения адресов операндов в пределах одного из сегментов памяти.

В указателе стека (SP) и в указателе базы (BP) содержаться относительные адреса в пределах стекового сегмента памяти, а в регистре индекса источника (SI) и регистре индекса приемника (DI) хранятся индексные адреса в пределах сегмента данных.

Регистры CS, DS, SS, ES называются сегментными регистрами и используются при обращении к памяти для вычисления физических адресов ячеек.

Основное назначение этих регистров следующее:

Регистр программного или кодового сегмента (CS) определяет текущий программный сегмент; содержимое регистра CS вместе с содержимым указателя команд (IP) задает адрес очередной команды выполнения программы; регистр сегмента данных (DS) используется в командах при обращении к данным; регистр сегмента (SS) определяет текущий стековый сегмент и используется в командах при обращении к стеку, при обработке подпрограммы и прерываний; регистр дополнительного сегмента (ES) применяется как вспомогательный сегмент данных.

Любая программа содержит упрощенные директивы определения сегментов DOSSEG, MODEL, STACK, DATA, CODE, а также директиву END.

В каждой программе на Ассемблере, чтобы обеспечить определение сегментов и управление ими, необходимы определения сегментов (упрощенные и стандартные), а завершать программу на Ассемблере всегда должна директива

END.

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

mov [bx],al

Эти строки представляют собой мнемоники инструкций.

ФОРМАТ СТРОКИ

Строки исходного кода на языке Ассемблер имеют следующий формат:

<метка> <инструкция/директива> <операнды> <; комментарий>

где <метка> - представляет собой необязательное имя идентификатора;

<инструкция/директива> - это мнемоника инструкции или директивы;

<операнды> - содержат сочетание 0, 1, 2 (иногда больше) констант, ссылок на память или регистры, или текстовых строк, как это требуется в каждой конкретной инструкции или директиве;

<; комментарий> - необязательный комментарий.

В любом месте строки в качестве символа продолжения строки можно поместить символ обратной косой черты «\».

КОМАНДЫ ПЕРЕМЕЩЕНИЯ ДАННЫХ

Команды типа регистр - регистр и регистр – память.

Данные в процессоре перемещаются с помощью инструкции MOV. В действительности MOV (от слова переместить) – это не совсем удачное

название данной инструкции. Более точно было бы назвать её COPY (копировать), т.к. инструкция MOV на самом деле записывает копию операнда приемника в операнд-приемник.

Винструкции MOV можно использовать почти любую пару операндов.

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

Перемещение данных в стек и из стека

Стек работает по правилу «Первым пришел – последним ушел». На вершину стека всегда указывает регистр SP. К стеку обращаются с помощью инструкций PUSH и POP. Инструкция PUSH сохраняет операнд в вершине стека, а инструкция POP извлекает значение из вершины стека и сохраняет его в операнде.

Обмен данными

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

ВНИМАНИЕ! Любая написанная Вами программа должна содержать директивы управления сегментами памяти и выход в DOS. Перед директивой END программа должна содержать строки:

mov ah,4ch ; функция DOS завершения программы

int 21 ; завершить программу.

РАБОТА С ОТЛАДЧИКОМ

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

Наиболее простой способ начать отладку запустить его и загрузить необходимую программу.

На экране присутствуют окна отображающие: непосредственно сам программный код, текущее состояние всех регистров, в том числе и регистра флагов, а также содержимое стека.

Используя функции меню (вход в меня клавиша «alt») можно запустить программу в пошаговом режиме (режим трассировки) и наблюдать за изменением состояния регистров, тем самым, находить ошибки в коде.

ЗАДАНИЕ №1

 

segment .text

; сегмент когда

global_start ; должно быть объявлено для линкера

_start:

; сообщаем линкеру точку входа

mov

edx

,len ; длина сообщения

mov ecx,msg ; сообщение для написания mov ebx,1 ; файловый дескриптор (stdout)

mov eax,4 ; номер системного вызова (sys_write)

int 0x80

; вызов ядра

 

; номер системного вызова (sys_exit)

mov

eax

,1

int 0x80

; вызов ядра

segment .data

; сегмент данных

msg db 'Hello, world!',0xa ; наша строка

len equ $ - msg

; длина нашей строки

ЗАДАНИЕ №2

_STACK segment para stack

db 1024 dup(?) _STACK ends

_DATA segment

;Опредилить число -678,используя минимальную возможную директиву.

_s678 dw -678

;Описать переменную памяти cvb, длиной двойное слово и загрузить в нее число 4578995

cvb dd 4578995 _DATA ends

_TEXT segment

assume cs:_TEXT, ds:_DATA, ss:_STACK main proc

;инициализация сегментного регистра данных mov ax, _DATA

mov ds, ax

;Загрузить в DI число 3456h

mov

 

di

,

3456h

;Содержимое DI скопировать в AX

mov

 

ax

,

 

di

 

;Старшее слово переменной CVB скопировать в

BX,младшее слово переменной CVB скопировать в DX

mov

 

dx

,

 

word ptr [cvb+2]

mov

 

bx

,

 

word ptr [cvb+0]

;Переменную с числом -678 скопировать из памяти в CX

mov

 

cx

,

[_s678]

;Используя стек, осуществить обмен содержимого AX и DI

push

 

ax

 

 

 

 

mov

 

ax

,

 

di

 

 

 

 

pop

di

 

 

 

 

;Выполнить обмен содержимого старшего и младшего байта

AX

xchg al, ah

;завершение программы mov ax, 4C00h

int 21h

main endp

_ TEXT ends

end main

Инициализация массивов

В одной директиве определения данных может указываться несколько значений. Например, директива:

SampleArray DW 0, 1, 2, 3, 4

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

Турбо Ассемблер определить блок памяти, инициализированный указанными значениями, с помощью операции DUP. Например:

BlankArray DW 100h DUP (0)

Здесь создается массив BlankArray, состоящий из 255 (десят.) слов, инициализированных значением 0. Аналогично, директива:

ArrayOfa DB 92 DUP (‘A’)

Создает массив из 92 байт, каждый из которых инициализирован символом А.

Инициализация строк символов

Рассмотрим теперь создание строк символов. Символы представляют собой допустимые операнды директив определения данных, поэтому строку можно определить следующим образом:

String DB ‘A’, ‘B’, ‘C’, ‘D’

В турбо Ассемблере в этом случае предусмотрена также удобная сокращенная форма:

String DB ‘ABCD’

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

HelloString DB ‘Привет!’, 0dh, 0ah, ‘$’

Неинициализированные данные

Иногда нет смысла присваивать начальное значение. Предположим, например, что ваша программа считает следующие 10 набранных на клавиатуре символов и записывает их в массив с именем KeyBuffer. Инициализацию этого массива можно выполнить следующим образом:

KeyBuffer DB 10 DUP (0)

Но смысла в этом немного, т.к. начальное значение массива KeyBuffer будут немедленно перезаписаны.

В действительности нужно – это определить переменную в памяти, как неинициализированную. Турбо Ассемблер предусматривает такую возможность с помощью символа «знак вопроса». Он указывает, что вы резервируете ячейку памяти, но не инициализируете её. Например, в последнем примере KeyBuffer можно определить так:

KeyBuffer DB 10 DUP (?)

В данной строке резервируется 10 байт памяти, начиная с метки KeyBuffer, но этим байтам не присвоено никакого конкретного значения.

ЗАДАНИЕ №3

.MODEL Small

.STACK 100h

.DATA

MyByte db ? MyWord dw 100

.CODE Start:

; пролог

mov ax,@data

mov ds,ax ; DS = сегмент .DATA mov al, 99

mov MyByte, al

;эпилог

mov ax,4C00h

int 21h ; Выходим из программы

END Start

Вывод: Произошло знакомство с архитектурой процессора, получение навыков работы с отладчиком.

Соседние файлы в папке Тамьяров А. В.