- •Горшков ю.Е.
- •Основы электронновычислительных машин Конспект лекций и лабораторные работы
- •Физические основы вычислительных процессов
- •1. Роль физики в развитии вычислительных систем и сетей
- •2. Информация и ее физические носители
- •5. Производство полупроводниковых микросхем
- •6. Современное состояние и перспективы развития вычислительных средств
- •7. Технические средства человеко-машинного интерфейса
- •8. Магнитные и оптические носители информации
- •9. Твердотельные носители информации – Flash-карты
- •Функционально-структурная организация и программное обеспечение персонального компьютера
- •Работа 6. Устройство и модернизация системного блока персонального компьютера.
- •Виртуальные вычислительные машины и устройства
- •Регистры и команды микропроцессора, основы языка ассемблер
- •Представление данных в пэвм
- •III. Вычислительные системы
- •1. Архитектура вычислительных систем
- •2. Основы программирования параллельных вычислений
- •3. Примеры вычислительных систем
- •V. Особенности архитектуры и программирования микропроцессоров Intel 80x86
- •V.1 Язык программирования asm-51
- •2. Директивы языка программирования asm-51
- •2. Структурное программирование на языке Assembler
- •3.Использование сегментов в ассемблере
- •4. Программы и подпрограммы. Связь по управлению и по данным
- •5. Прерывания и их обработка.
- •Контроллер прерываний и микропроцессоры 80х86.
- •6. Сопроцессор и его программирование
- •7. Виртуальная память
- •Лабораторная работа № 2. Программирование циклов и условий. Работа с массивами.
- •Лабораторная работа № 3. Программы и подпрограммы. Связь по управлению и по данным
- •Лабораторная работа № 4. Сопроцессор и его программирование
- •Лабораторная работа 5 Использование средств bios на языке Ассемблер
- •Краткие сведения о прерываниях bios
- •ПриложениЕ Государственный стандарт дисциплины “Вычислительные системы, сети и телекоммуникации”
- •Литература
- •Учебное издание Самарин Вячеслав Владимирович Серолапкин Александр Владимирович
Представление данных в пэвм
В ПК целые числа могут размещаться в байте, слове или двойном слове. Беззнаковые (неотрицательные) числа записываются в двоичной системе счисления, занимая все размеры ячейки. Например, если для целого числа 98 отведен байт, то содержимым байта будет двоичное число 0110010 (62h), а если отведено слово, то оно будет иметь вид 0062h. Поскольку в ячейке из k разрядов можно записать 2k различных комбинаций из 0 и 1, то в виде байта можно представить целые числа от 0 до 255 (=28-1), в виде слова целые от 0 до 65535 (=216-1), в виде двойного слова целые от 0 до 4294967 (=232-1).
целые от 0 до 65535 (=216-1), в виде двойного слова целые от 0 до 4294967 (=232-
Целые числа со
знаком (знаковые числа), занимающие
байт, могут лежать в диапазоне от -128 до
127, занимающие слово
от -32768 до +32767, занимающие двойное слово
от –2147483648 до 2147483647. В ПК знаковые числа
записываются в дополнительном коде:
неотрицательное число записывается
так же, как и беззнаковое число, а
отрицательное число х представляется
беззнаковым числом
,
где k
– количество разрядов в ячейке, отведенной
под число. Например, дополнительным
кодом числа +98 будет байт 62h
или слово 0062h,
а дополнительным кодом числа –98
байт 9Еh
(=158=256-98), имеющий в двоичной системе
запись 10011110, или слово FF9Eh
=216-98=10000h-62h.
В дополнительном коде самый левый бит
играет роль знакового: для неотрицательных
чисел он равен 0, а для отрицательных
1.
Арифметические операции над вещественными (не целыми) числами не входят в систему команд процессора Intel 8086, они выполняются специальным устройством математическим сопроцессором. Если надо выполнить такую операцию, центральный процессор посылает сигнал сопроцессору и передает ему соответствующие операнды. Сопроцессор выполняет указанную операцию, записывает результат в определенное место и возвращает управление центральному процессору, который после этого продолжает свою работу. Современные микропроцессоры содержат сопроцессор в своем составе. Ниже примеры операций с вещественными числами не рассматриваются.
Язык программирования ассемблер
Язык программирования ассемблер сейчас редко используется для решения прикладных задач, однако его изучение позволяет лучше понять принципы работы ЭВМ, операционных систем и трансляторов с языков высокого уровня. В разное время в большинстве ПЭВМ использовались и используются процессоры фирмы Intel (8086/8088, 80186, 80286, i386, i486, Celeron, Pentium и т.д., см. с. 23-25). Эти процессоры поддерживают преемственность на уровне машинных команд: программы, написанные для младших моделей процессоров, без всяких изменений могут быть выполнены на более старших моделях. При этом базовой является система команд процессора 8086. Язык ассемблера это символьная форма записи машинного языка, его использование существенно упрощает написание машинных программ. Приведем перевод английских слов:
assemble: 1. собирать, монтировать, 2. компоновать с помощью ассемблера, ассемблировать, транслировать с помощью ассемблера, транслировать программу с помощью ассемблера
assembling: 1. сборка, монтаж, 2. компоновка, ассемблирование, трансляция программы с помощью ассемблера
Для ПЭВМ разработаны разные языки ассемблера. Наиболее распространены язык фирмы Microsoft, названный языком макроассемблера (сокращенно MASM) и язык Turbo Assembler фирмы Borland (сокращенно TASM). Для того, чтобы программы на ассемблере случайно не нанесли вред операционной системе и программному обеспечению, последующие задания рекомендуется выполнять в виртуальной машине.
Работа со строками в ассемблере
Рассмотрим пример простейшей программы, выводящей на экран надпись Hello world (Здравствуй, мир, англ., greet - приветствие).
Программа |
Выполняемые действия |
Data SEGMENT Greet DB 'Hello world',13,10, '$' Data ENDS Assume CS: Code, DS:Data
Code SEGMENT Start: mov ax, Data
mov ds,ax;
mov dx, OFFSET Greet
mov ah,9
int 21h mov al,0 mov ah, 4ch
int 21h
Code ENDS Stack1 SEGMENT Stack DB 100h DUP(?) Stack1 ENDS END Start |
Начало сегмента данных
Конец сегмента данных Объявление, что регистры процессора CS и DS будут содержать номера сегментов с именами Code и Data Начало сегмента команд Метка Поместить в регистр АХ номер сегмента Data Переслать АХ в регистр DS (команды непосредственной загрузки регистра DS нет) В регистр dx помещается смещение надписи относительно DS В регистр ah помещается номер 9 функции DOS “выведи надпись” Прерывание (вывод надписи) Возвращение в систему: в регистр ah помещается номер функции “возврат в систему” Прерывание (окончание выполнения программы) Конец сегмента команд Начало сегмента стека
Конец сегмента стека Директива END заканчивает текст программы и предписывает начинать ее с команды, снабженной меткой Start |
Программа на ассемблере – это последовательность предложений, каждое из которых записывается в отдельной строке. Комментарии начинаются с символа “;”. Общий синтаксис предложений-команд:
[<метка>:] <мнемокод> [<операнды>] [;<комментарий>]
В квадратных скобках указаны необязательные части команды. Метка нужна для ссылок на команду из других мест программы. Разрешается указывать в строке только одну метку с двоеточием (например, Start: ) и больше ничего, тогда она метит следующую команду программы. Мнемокод (мнемонический код) – это служебное слово, указывающее в символьной форме операцию, которую должна выполнить команда. Примерами операндов являются числа и имена переменных. Если операндов несколько, они отделяются друг от друга запятыми. Операндами могут быть и выражения, составляемые из чисел, имен переменных и операторов. Основные операторы ассемблера приведены в табл. 2.1.
Таблица 2.1
Категория |
Operator |
What it is (or does) |
|
() [ ] |
Подвыражение (Subexpression) Ссылка на ячейку памяти (Memory reference) |
|
. |
Селектор структурных элементов (Structure member selector) |
Унарные |
+ - |
Унарный плюс (Unary plus) Унарный минус (Unary minus) |
|
: |
Переопределение сегмента (Segment override) |
|
OFFSET SEG TYPE
PTR |
Возвращает смещение (Returns offset part) Возвращает сегментную часть Returns segment part Возвращает тип (байтовый размер) Returns type (byte size) Приведение типа (Typecast) |
|
* / MOD SHL SHR |
Умножение (Multiplication) Целое деление (Integer division) Integer modulus (remainder) Логический сдвиг влево (Logical shift left) Логический сдвиг вправо (Logical shift right) |
Аддитивные |
+ - |
Двоичное сложение (Binary addition) Двоичное вычитание (Binary subtraction) |
Битовые |
NOT AND OR XOR |
Битовое НЕ Битовое И Битовое ИЛИ Битовое Исключающее ИЛИ |
В программе на ассемблере для описания переменных и их имен должны присутствовать предложения-директивы с общим синтаксисом:
[<имя>] <название директивы> [<операнды>] [;<комментарий>]
Имя (например, Greet) – это, как правило, имя константы или переменной, описываемой данной директивой. Название директивы – это служебные слова. Директива DB (define byte – определить байт) определяет данные размером в байт. При ее выполнении ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти, начиная с первого незанятого. Первому из байтов дается указанное имя, по которому на этот байт можно ссылаться из других мест программы. Когда ассемблер встретит в программе имя переменной, он заменит его на адрес, который принято называть значением имени. По описанию переменной запоминается также ее размер (тип). Например, директива Greet DB 'Hello world',13,10, '$' записывает последовательные байты памяти коды символов, помещенных в кавычки, код 10 (перевод строки), код 13 (возврат каретки) устанавливающий курсор на начало текущей строки, код символа конца строки '$'. Директивы определения помещаются в начале программы до команд.
Задания:
1. Найдите в тексте программы директиву определения данных и команды. В командах найдите и выпишите мнемокоды и операции, которые им соответствуют.
2. Выполните в программе-оболочке Far следующие действия (рис. 3.42):
1) Создайте в Far файл Greet.ASM и наберите программу.
Cкомпилируйте с помощью команды tasm greet.
Скомпонуйте с помощью команды tlink greet.
Получив исполняемый файл Greet.EXE выполните программу, например, введя имя Greet в командную строку.
Рис. 2.12. Команды и результаты компиляции и компоновки программы
3. Выполните то же самое задание с помощью интегрированной среды TASM. Скопируйте папку ТА из папки Student_MUPK_NW:\COMMON\LANGV в папку C:\Student, запустите файл ta.exe. Нажмите клавишу F10 для перехода в главное меню, выполните команду File-Load (Файл-Загрузить), нажмите Enter, выберите из списка нужный файл. Выполните настройку - отключите опцию создания com-файла (рис. 2.13) и сохраните ее командой Options-Save options.
Рис. 2.13. Изменение опций компоновщика с отключением опции создания com-файла
Затем выполните команды Compile to OBJ (компиляция), Make EXE file (компоновка) (рис. 2.14). В случае успеха выполните команду Run-Run program, затем Run-User screen.
Рис. 2.14. Создание exe-файла
В рассмотренных здесь и ниже примерах использованы вывод и ввод символов, реализуемых при выполнении одной из группы команд прерывания с шестнадцатиричным номером 21h дисковой операционной системы MS DOS. Перед выполнением команды прерывания INT в регистр AH записывают номер нужной функции. Функции с номерами 4Сh, 2 и 9 выполняют возврат управления операционной системе для продолжения выполнения программы, вывод одного символа на экран и вывод строки. Символ с кодами 10 (перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ 13 (возврат каретки) устанавливает курсор на начало текущей строки. Функция 0Ch прерывания 21h вводит с клавиатуры символы (с эхо-печатью их на экране) до тех пор, пока не будет нажата клавиша Enter, и записывает их в буфер размером 15 позиций. Пока не нажата клавиша Enter, набираемый текст можно редактировать клавишами Backspace (отмена последнего символа) и Esc (отмена всего набранного текста). Функции ввода 0Ah, 0Ch и другие считывают символы из начала буфера.
Изучение работы микропроцессора с помощью Турбо Отладчика (Borland Turbo Debugger)
Турбо Отладчик (входящий в состав среды Borland C++) позволяет прослеживать выполнение инструкций ассемблера, содержимое ячеек оперативной памяти и регистров процессора и математического сопроцессора [58]. Он также позволяет отлаживать программы на языках Си и Паскаль. Общий вид команды запуска отладчика
TD opt name args
где opt – опции, name – имя запускаемой программы, args – ее аргументы.
Задания
1.Запустите отладчик щелчком по файлу td.exe из папки BIN (без опций, имени программы и аргументов. Нажмите клавишу F5 для увеличения размера экрана. При вызове отладчика без указания имени файла на экране появляется визитная карточка программы (рис. 2.15, для ее снятия щелкните ОК или нажмите клавишу Esc) и окно процессора (CPU), содержащее команды ассемблера. Окно процессора состоит из пяти рамок, в которых выводятся: команды программы, данные выбранной области памяти в символьном и шестнадцатиричном виде, содержимое регистров процессора, содержимое стека процессора, а также биты регистра флажков. В верхней строке указан определенный программой тип процессора. Знак в виде стрелки вправо выделяет команду, которая будет выполнена следующей. В верхней строке рамки, содержащей команды, указываются адрес памяти и значения величины, указанной по этому адресу. Для перехода в главное меню программы можно использовать клавишу F10.
Рис. 2.15. Стартовое окно Турбо Отладчика
Выполните команду File-Open, укажите путь к ехе-файлу, полученному в первом примере (greet2.exe, рис. 2.16), щелкните ОК. В окне с надписью Program has no symbol table щелкните ОК, найдите команды программы (рис. 2.17).
Рис. 2.16. Выбор исполняемого файла для загрузки в Турбо Отладчик
Рис. 2.17. Программа в Турбо Отладчике
Спустите выделение на вторую строку, выполните команду Run-Go to cursor или просто нажмите клавишу F4, рис 2.18. В окне данных (справа) произойдет изменение содержимого регистра ах – в него будет занесено значение адреса сегмента Data (в данном случае это шестнадцатиричное число 61С7, в других случаях оно может быть иным). Одновременно изменилось содержимое регистра ip с адресом следующей выполняемой команды.
Рис. 2.18. Выполнение первой команды программы в Турбо Отладчике
Выделите третью строку, нажмите клавишу F4. В окне данных (справа) произойдут изменения – в регистр ds будет помещено содержимое регистра ах, изменится и содержимое регистра ip (рис. 2.19).
Рис. 2.19. Выполнение второй команды программы в Турбо Отладчике
Выделите пятую строку, нажмите клавишу F4. В окне данных (справа) произойдет изменение содержимого старшего регистра байта ах – в него будет занесено значение 09, изменится и содержимое регистра ip (рис. 2.20). Выделите восьмую строку (последнюю команду программы), нажмите клавишу F4. Появится сообщение об успешном завершении программы, содержимое регистра ip обнулится.
Рис. 2.20. Выполнение четвертой команды программы в Турбо Отладчике
Задания:
1. Введите следующую программу (комментарии не набирать):
; Turbo Assembler Copyright (c) 1988, 1991 By Borland International, Inc.
; HELLO2.ASM - Editted version of HELLO.ASM.
; Display greeting after accepting input.
; From the Turbo Assembler Users Guide - Getting started
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
TimePrompt DB 'Is it after 12 noon (Y/N)?$'
GoodMorningMessage LABEL BYTE
DB 13,10,'Good morning, world!',13,10,'$'
GoodAfternoonMessage LABEL BYTE
DB 13,10,'Good afternoon, world!',13,10,'$'
.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment
mov dx,OFFSET TimePrompt ;point to the time prompt
mov ah,9 ;DOS print string function
int 21h ;display the time prompt
mov ah,1 ;DOS get character function
int 21h ;get a single-character response
cmp al,'y' ;typed lowercase y for after noon?
jz IsAfternoon ;yes, it's after noon
cmp al,'Y' ;typed uppercase Y for after noon?
jnz IsMorning ;no, it's before noon
IsAfternoon:
mov dx,OFFSET GoodAfternoonMessage ;point to the afternoon greeting
jmp DisplayGreeting
IsMorning:
mov dx,OFFSET GoodMorningMessage ;point to the before noon greeting
DisplayGreeting:
mov ah,9 ;DOS print string function
int 21h ;display the appropriate greeting
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
END
В данной программе присутствуют два очень важных средства: возможность ввода и принятие решений. Эта программа запрашивает у вас, является ли вводимое время временем после полудня (Is it after 12 noon (Y/N)?), воспринимая ответ (один символ) с клавиатуры. Если таким ответом будет буква Y в верхнем или нижнем регистре (что означает ответ ДА), то программа выводит сообщение "Good afternoon, world!" - "Добрый день!", в противном случае выводится сообщение "Good morning, world" - "Доброе утро!". В данной программе имеются все основные элементы полезной программы: ввод из информации внешней среды, обработка данных и принятие решения.
Сохраните эту программу на диске, ассемблируйте и скомпонуйте программу, как в предыдущем примере. После запуска программы выведется сообщение на английском языке, приведем его перевод:
"Is it after 12 noon (Y/N)? " (Это время после полудня? (ДА/НЕТ) - [Y/N]).
Курсор будет мерцать у последнего символа в ожидании ввода ответа. Нажмите Y. Программа ответит: "Good afternoon, world!"
Повторите запуск программы, введите “N”.
Аналогично первому примеру проследите за выполнением команд программы в Турбо Отладчике.
2. Введите следующую программу REVERSE.ASM (комментарии не набирать):
; Turbo Assembler Copyright (c) 1988, 1991 By Borland International, Inc.
; REVERSE.ASM - Prints a string in reverse
; From the Turbo Assembler Users Guide - Getting started
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
MAXIMUM_STRING_LENGTH EQU 1000
StringToReverse DB MAXIMUM_STRING_LENGTH DUP(?)
ReverseString DB MAXIMUM_STRING_LENGTH DUP(?)
.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment
mov ah,3fh ;DOS read from handle function
mov bx,0 ;standard input handle
mov cx,MAXIMUM_STRING_LENGTH ;read up to maximum number of characters
mov dx,OFFSET StringToReverse ;store the string here
int 21h ;get the string
and ax,ax ;were any characters read?
jz Done ;no, so you're done
mov cx,ax ;put string length in CX, where
; you can use it as a counter
push cx ;save the string length
mov bx,OFFSET StringToReverse
mov si,OFFSET ReverseString
add si,cx
dec si ;point to the end of the
; reverse string buffer
ReverseLoop:
mov al,[bx] ;get the next character
mov [si],al ;store the characters in reverse order
inc bx ;point to next character
dec si ;point to previous location in reverse buffer
loop ReverseLoop ;move next character, if any
pop cx ;get back the string length
mov ah,40h ;DOS write from handle function #
mov bx,1 ;standard output handle
mov dx,OFFSET ReverseString ;print this string
int 21h ;print the reversed string
Done:
mov ah,4ch ;DOS terminate program function #
int 21h ;terminate the program
END
Выполните команды компиляции и компоновки. В случае вывода при ассемблировании сообщений об ошибках, внимательно проверьте исходный код, сравните его с приведенным текстом, а затем попытайтесь повторить процесс.
После запуска программы на экране останется мерцающий курсор - программа ожидает ввода. Попробуйте ввести:
ABCDEFG
а затем нажмите клавишу ENTER. Программа выведет на экран:
GFEDCBA
и завершит работу. Еще раз запустите программу, введите:
0123456789
и нажмите клавишу ENTER. Программа выведет на экран:
9876543210
Программа REVERSE.ASM изменяет порядок символов во введенной строке на обратный.
Аналогично первому примеру проследите за выполнением команд программы в Турбо Отладчике.
