Легко использовать байты, слова или двойные слова для представления целых положительных чисел — от 0 до 255, 65 535 или 4 294 967 295 соответственно. Чтобы использовать те же самые байты или слова для представления отрицательных чисел, существует специальная операция, известная как дополнение до двух. Для изменения знака числа выполняют инверсию, то есть заменяют в двоичном представлении числа все единицы нулями и нули единицами, а затем прибавляют 1. Например, пусть используются переменные типа слова:
150 = 0096h = 0000 0000 1001 0110b
инверсия дает: 1111 1111 0110 1001b
+1 = 1111 1111 0110 1010b = 0FF6Ah
Проверим, что полученное число на самом деле -150: сумма с +150 должна, быть равна нулю:
+150 + (-150) = 0096h + FF6Ah = 10000h ;
Единица в l6-м разряде не помещается в слово, и значит, мы действительно получили 0. В этом формате старший (7-й, 15-й, 31-й для байта, слова, двойного слова соответственно) бит всегда соответствует знаку числа 0 — для положительных и 1 — для отрицательных. Таким образом, схема с использованием дополнения до двух выделяет для положительных и отрицательных чисел равные диапазоны: -128 — +127 — для байта, -32 768 — +32 767 — для слов, -2 147 483 648 — +2 147 483 647 — для двойных слов.
Для представления всех букв, цифр и знаков, появляющихся на экране компьютера, обычно используется всего один байт. Символы, соответствующие значениям от 0 до 127, то есть первой половине всех возможных значений байта, были стандартизованы и названы символами ASCII (хотя часто кодами ASCII называют всю таблицу из 256 символов). Сюда входят некоторые управляющие коды (символ с кодом 0Dh — конец строки), знаки препинания, цифры (символы с кодами 30h – 39h), большие (41h – 5Ah) и маленькие (61h – 7Ah) латинские буквы. Вторая половина символьных кодов используется для алфавитов других языков и псевдографики, и набор и порядок символов в ней различаются в разных странах и даже в пределах одной страны. Например, для букв одного только русского языка существует пять разных вариантов размещения во второй половине таблицы символов ASCII. Эти таблицы символов приведены в приложении 1. Существует также стандарт, использующий слова для хранения кодов символов, известный как UNICODE или UCS-2, и даже двойные слова (UCS-4), но мы пока не будем на нем останавливаться.
Лабораториялық жұмыс 4
Тема: Структура адресного пространства и программно
доступные регистры центрального процессора
Описание работы
Debug – это системная программа, позволяющая выполнять побайтное тестирование и побайтную обработку основной памяти машины и дисковых файлов. Debug также обеспечивает возможность выполнения отлаживаемых программ небольшими порциями.
Основные функции программы Debug:
- загрузка файлов, содержащих программы или данные. в памть машины;
- вывод на экран содержимого памяти в 16-ричном коде и в символьном виде в соответствии с кодом ASCII;
- изменение участков памяти и портов;
- перенос блоков данных из одного места основной памяти в другое;
- генерация и вывод на экран команд ассемблера по коду, загруженному в память машины;
- контроль за выполнением команд отлаживаемой программы;
- вывод на экран и корректировка содержимого регистров процессора;
- сохранение содержимого участков памяти на гибких и жестких дисках;
- выполнение с помощью встроенного калькулятора 16-ричного сложения и вычитания.
Запуск Дебаггера:
- перейти в режим эмуляции MS DOS;
- ввести команду debug;
-готовность программы означает появившийся знак дефиса:
С>debug
-
Введите команду запуска дебаггера.
Выход из дебаггера выполняется командой q(quit):
-q
Выполните выход из дебаггера.
Работа с регистрами
REGISTER (r) – команда вывода на экран и корректировки значений регистров и флагов состояний процессора. Команда также дает информацию о следующей выполняемой команде.
Запустите дебаггер введите команду
- r
1. Первые две строки выведенной таблицы – это 16-ричные значения всех регистров процессора.
Регистры сегмента DS, ES, SS,CS содержат одно и то же значение 10D4h – это селектор (номер сегмента). Он указывает на адрес 10D4h ближайшего свободного сегмента памяти (число может быть другим).
Значение регистра SP равно FFEEh, а регистра IP - 0100h. В остальных регистрах записаны нули.
2. В правой части второй строки находятся значения восьми флагов состояния процессора. При загрузке дебаггера все флаги, кроме IF, очищаются.
Флаги состояния процессора
Наименование флага
|
Обозначение
|
Установлен
|
очищен
|
Переполнение (да/нет)
|
OF
|
OV
|
NV
|
Направление(уменьшение/увелич)
|
DF
|
DN
|
UP
|
Прерывание(возможно/невозможно)
|
IF
|
EI
|
DI
|
Знак(отриц/полож)
|
SF
|
NG
|
PL
|
Ноль(да/нет)
|
ZF
|
NG
|
NZ
|
Арифметический перенос(да/нет)
|
AF
|
AC
|
NA
|
Четность(четная/нечетная)
|
PF
|
PE
|
PO
|
Перенос(да/нет)
|
CF
|
CY
|
NC
|
Выполняемая программа есть последовательность кодов машинных команд. Адрес машинного кода команды, к-ая будет выполняться следующей, фиксируется в регистрах CS и IP. В нашем примере это адрес CS:IP = 10D4:0100.
3. В третьей строке – справочная информация о команде. Адрес , записанный в регистрах CS:IP - в начале строки, далее расположен машинный код команды, содержащийся в поле памяти, которое начинается с адреса, указанного в начале строки, т.е. 00h и 00h, представленные как 0000. Этому машинному коду соответствует мнемокод команды ассемблера ADD[BX+SI],AL. Эта команда выполняет такие действия: значение регистра AL складывается со значением байта, имеющего в сегменте данных смещение, равное сумме значений регистров BX и SI. Результат 0000 записывается по этому же адресу DS:0000. Текущее значение байта DS:0000 (до выполнения команды) выводится в конце третьей строки и равен СD.
Изменение значений регистров
r[имя регистра] – команда изменения значения регистра.
Введите команду rсx. Дебаггер выведет, его значение и двоеточие, после которого нужно ввести новое значение регистра. Введите значение 89АВ. Командой r просмотрите новое значение регистра. Восстановите прежнее значение регистра.
Просмотр значений флагов
rf – команда вывода на экран значений флагов
Введите команду -rf
На экран будут выведены значения флагов, которые можно изменить. Новые значения вводятся в любом порядке через пробел или без разделителя. Установите значения флагов переполнения, знака и переноса (введите подчеркнутые значения).
NV UP EIPL NZ NA PO NC-OV NG CY
Командой r просмотрите изменения. Восстановите прежнее состояние флагов.
Лабораториялық жұмыс 5
Вывод содержимого участков памяти на экран
Dump(D или d) – команда отображения содержимого участка памяти на экране. Получаемый при этом участок памяти – дамп (от слова dump) есть последовательность значений байтов в 16-ричном представлении, а также в коде ASCII.
Введите команду d
- Первое число в левом верхнем углу экрана (10D4:0100) – это начальный адрес дампа, записанный в сегментном виде.
Адрес читается так «селектор 10D4h, смещение 0100h».
-Первые две цифры , расположенные за адресом, показывают, что в байте с адресом
10D4:0100 записано значение 00h. Следующие две цифры означают, что значение байта с адресом, на единицу большим предыдущего (10D4:0101), также равно 00h и т.д. Подсчитав общее число таких цифр в строке, можно убедиться, что в ней отображены значения 16-ти (10h) последовательно расположенных в памяти байтов. При этом, начального байта в верхней строке равен 10D4:0100, а адрес последнего - 10D4:010F.
- Следующие 7 строк ( каждой строке предшествует первого в строке байта) – оставшаяся часть дампа. Можно подсчитать, что весь дамп содержи 128 (80h) последовательно расположенных байтов. Начальный адрес дампа 10D4:0101, конечный - 10D4:017F.
- Введите еще раз команду d , появившиеся 128 байтов памяти будут иметь другой адрес, в левом верхнем углу стоит адрес 10D4:0180 (превышает на единицу конечный адрес предыдущего дампа).
- В командной строке можно указать начальный адрес дампа. Он состоит из селектора сегмента и смещения внутри этого сегмента, к-ые разделены двоеточием.
Например, введем команду, к-ая выводит 128 байтов, начиная с байта, находящегося по адресу 10D40h (это абсолютный адрес; сегментный адрес можно записать как 10D4:0000).
- d10D4:0000
В результате выполнения команды на экране появится дамп, начинающийся с указанного в команде адреса. Справа от каждой строки расположено по 16 символов (значения байтов в ASCII-кодах) Коды, значения к-х больше 7Fh , как и коды, не являющиеся символами, обозначаются точками (как и сама точка). (Коды букв русского алфавита находятся в диапазоне 80h-FFh). В нашем примере значение байта 10D4:000Е равно 2Fh, в коде ASCII- это наклонная черта «/».
Просмотр содержания файла
Выйти из дебаггера, перейти в MS DOS, создать текстовый файл на английском языке, схранить под именем primer.txt. Для просмотра с помощью дебаггера введите команду
C:>debug primer.txt
-d
После выдачи данных, введите команду повторно.
Запишите адрес, по которому размещен текстовый файл, конечный адрес файла.
Например, 10D4:0100, 10D4:01F0
Просмотр требуемого участка памяти
Укажите начальный и конечный адреса требуемого участка памяти, например, первой строки.
-d10D4:01AD 01D3
Почему первая строка заканчивается байтом 10D4:0100 ?
Обратите внимание, что начальный адрес представлен в команде длинным, а конечный – коротким. Если и начальный адрес указать коротким, то дебаггер по умолчанию принимает номер сегмента, указанный в регистре DS. Т.е. последнюю команду можно было записать короче - 1AD1D3
Требуемый участок памяти можно задать начальным адресом и длиной участка:
-d1AD L27
получим тот же результат. Т.о. можно просматривать и короткие ячейки памяти (1-2 байта) и очень длинные поля, приостанавливая вывод клавишами Ctrl+Num Lock и продолжая его нажатием любой клавиши. Прекратить длинный вывод можно комбинацией клавиш Ctrl+Scroll Lock
Выведите один байт по адресу по адресу 10D4:01B1 командой
–d1b1 L1
Выведите участок памяти длиной в 1 К, начинающийся с абсолютного адреса 0приостанавливая вывод:
–d0:0 L400
Ввод данных в оперативную память
Формат команды ввода: -е [начальный адрес] [список значений]
начальный адрес – указывает на первый байт корректируемого поля памяти
список значений – задает значения для присвоения байтам поля
Элементами списка м. б. 8-разр двоичные коды, представленные парами 16-ричных цифр, и/или строки символов в апострофах, элементы списка отделяются пробелом или запятой.
Пример: -е0 2А 20 44 41 54 41 20 ‘IS’ 20 48 45 52 45 20 2A
Команда вводит значения побайтно начиная с адреса 10d4:0000.
Просмотр введенных значений: - d
Выведем 16 (10Н) байтов, начиная с адреса 10d4:0000
-d0 L10
Эту команду можно записать так: -е0 2А 20 44 41 54 ‘A IS H’ 45 52 45 20 2A
или
-e0 `*DATA IS HERE *`
Команду -е[начальный адрес] можно использовать для отображения и, в случае необходимости, для корректировки отдельного байта. Введем, например, команду
-е2
10D4:0002 44
В ответ появится адрес байта и его значение, далее при нажатии пробела появляется значение следующего байта. Нажав на пробел три раза получим
-е2
10D4:0002 44. 41. 54. 41.
Изменение значения байта: изменим значение последнего байта на 61Н, для этого наберем 61 нажмем пробел.
Для перехода к предыдущему байту, нужно нажать клавишу «-».
Завершите команду нажатием Enter.
Снова введите команду –d0 L10.
Лабораториялық жұмыс 6
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
Установите следующие значения регистров:
DS=1000+N; SS=1000; BP=A+N; SI=10+2*N; DI=1A+3*N;
где N – ваш номер в списке группы.
При установленных в 1 значениях регистров , получите тот же дамп, который может быть получен командой –dcs:0000 (используйте команду DUMP в формате dхххх, где хххх- смещение).
Установите такое значение регистра ES, чтобы дамп, получаемый командой -dcs:0020 при CS=10D4, совпадал с дампом, получаемым по команде
а) –des:0ABO;
б) –des:FED0.
4. Установите флаги знака, нуля и четности. С помощью команды r убедитесь, что установка выполнена верно. Верните флаги в исходное состояние.
5. а) Выведите на экран содержимое двойного слова, начинающегося с байта, абсолютный адрес которого равен 4* N. Это двойное слово содержит сегментный (длинный) адрес. Определите значение абсолютного адреса, на который указывает данный сегментный адрес.
б) Выполните то же задание для двойного слова 4* N+10.
6. Введите в ОП, начиная с абсолютного адреса 20000+100* N, ваши фамилию, имя, отчество и дату рождения в формате день/месяц/год.
7. С помощью команды Enter во втором формате (-e[на]) исправьте введенное в пункте 6 следующим образом:
- прописные буквы замените на строчные;
- строчные буквы замените на прописные;
- наклонную черту в дате заменит
Лабораториялық жұмыс 7
Перевод мнемокода ассемблера в машинный код
ASSEMBLER (A или a) - команда перевода мнемокода ассемблера в соответствующие им машинные коды ; размешает коды в ОП по указанному адресу.
Назначение команды:
- внесение изменений в программы;
- разработка небольших программ на языке ассемблер.
Формат команды: -а [адрес], где
- адрес – адрес размещения машинного кода:
-если указан короткий адрес (смещение без номера сегмента), то значение CS будет номером сегмента;
- если адрес не указан, то машинный код размещается по адресу, указанному в регистрах CS:IP.
После введения команды на экране появляется начальный адрес, по которому можно вводить ассемблерную программу; Enter – окончание ввода.
Программа Debug создает только программы типа .com. Все такие программы начинаются с относительного адреса (смещения) 100h, поэтому смещение первого машинного кода должно быть равно 100h.
Пример:
-а
10D4:0100 mov ax,1 {переслать значение 1 в регистр ах}
10D4:0103 mov bx,2
10D4:0106 add ax,bx {увеличит значение регистра ax на значение регистра bx }
10D4:0108
Перевод машинного кода в мнемокод ассемблера
Командой UNASSEMBLER (u) можно просмотреть, что все мнемокоды программы переведены в машинные коды, размещенные по адресам с 10D4:0100 по
10D4:0108 . Программа занимает в памяти 8 байтов (0108h – 0100h =8h).
Пример: переведем в мнемокод ассемблера программу сложения двух чисел, которую ранее ввели в память.
10D4:0100 B80100 mov AX,0001
10D4:0103 BB0200 mov BX,0002
10D4:0106 01D8 ADD AX,BX
Дебаггер дизассемблировал содержимое поля из 7 байтов с начальным адресом CS:0100. В команде номер сегмента не указан, поэтому принимается значение регистра CS. Буква L – length (длина).
Просмотрите результат дизассемблирования:
1-ая колонка: длинные адреса команд в ОП;
2-ая колонка: значения байтов, содержащих машинные коды команд;
3-ья клонка: соответствующие кодам операторы ассемблера.
Трассировка (пошаговое исполнение программы)
TRACE (T или t) – команда трассировки, пошагового выполнения программы в машинном коде. После выполнения каждой команды на экран выводятся регистры и флаги состояния процессора.
Перед трассировкой введите команду r и убедитесь, что регистры CS:IP указывают на начало программы.
Введите три раза команду t и пронаблюдайте изменения в состоянии регистров процессора и в содержании 3-ей строки.
В команде TRACE можно указать адрес команды, с которой хотим начинать трассировку программы, для этого в команде указываем нужный адрес: - t=100.
Команда - t=100 вызовет выполнение команды по адресу 0100h.
Введите команду - t=100.
Команда TRACE может трассировать сразу несколько команд отлаживаемой программы. например введите команду - t=100 3. В результате получим всю трассу нашей программы.
Лабораториялық жұмыс 8
Создание и выполнение программ типа .com в среде MS DOS
Рассмотренная последовательность из трех команд не является полноценной программой (отсутствует нормальное завершение программы, невозможность исполнения в среде MS DOS).
Рассмотрим программу, записанную в мнемокодах ассемблера, которая выводит на экран строку символов.
mov ah,9
mov dx,120
int 21
int 20
Вся работа по выводу на экран строки символов передается операционной системе. Для этого используется прерывание 21h, вызываемое с помощью оператора int 21. Но до этого в регистр АН выведен 16-ричный номер вызываемой функции, а именно функции вывода строки на экран, номер функции - 9: оператор mov ah,9. Оператор mov dx,120 загружает в регистр DX аргумент вызываемой функции – число 120h; это нужно для того, чтобы сообщить DOS местоположение выводимой строки в памяти компьютера. Перед вызовом служебной функции 9h адрес начала строки должен быть помещен в регистры DS и DX (номер сегмента и смещение). Наша строка расположена начиная со смещения 120h в сегменте данных.
Оператор int 20 вызывает прерывание DOS с номером 20h, которое обеспечивает нормальное завершение программы и передает управление ОС.
Запустите Debug и ассемблируйте текст нашей программы:
-a
10D4:0100 mov ah,9
10D4:0102 mov dx,120
10D4:0105 int 21
10D4:0107 int 20
10D4:0109
Программа готова к исполнению, но строка, которую надо вывести на экран , еще не помещена в ОП, введем ее:
-e 120 ‘Vini,’vidi, vici$’
В результате в 17-ти битовое поле памяти, начиная с адреса 10D4:0120 будут введены -коды 17-ти символов ‘Vini,’vidi, vici$’. Символ $ указывает конец строки и не выводится.
Для проверки правильности размещения символов введите команду:
-d120 L20
Перед исполнением дадим программе имя и запишем файл на диск:
- n progr1.com - идентификация файла;
- вычислим длину программы : 130h – 100h + 1 = 31h и загрузим в регистр СХ длину программы с помощью команд: -rcx
CX 0000
:31
- команда записи в файл: - w
- Debugger выдаст сообщение Writing 0031 bytes
Теперь можно выполнить программу, выйдите из Дебаггера и запустите программу командой: C:\prog1.
На экране появится строка Vini,’vidi, vici
C:>
Лабораториялық жұмыс 9
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ
1. Переведите в машинный код следующую программу, написанную в мнемокоде ассемблера: MOV AL,01
MOV DI,0200
MOV CX,0030
CLD
REPNZ
STOSB
MOV AL,24
STOSB
PUSH ES,
POP DS
MOV DX,0200
MOV AH,09
INT 21
INT 20
2. Выполните дизассемблирование полученного машинного кода и убедитесь, что результат дизассемблирования совпадает с исходным текстом . Если есть отклонения, сделайте необходимые исправления.
3. Запишите программу в дисковый файл, выполните ее из операционной системы. Выполните трассировку программы.
4. Дополните программу, выполняющую сложение двух чисел, мнемокодом ассемблера, обеспечивающим нормальное завершение программы. Запишите в дисковый файл.
5. Измените программу вывода строки так, чтобы символы располагались в три строки, выводя при этом фамилию, имя, отчество(1-ая строка), дату рождения (2-ая строка), домашний адрес (3-ья строка).
Лабораториялық жұмыс 10
АССЕМБЛИРОВАНИЕ И ВЫПОЛНЕНИЕ ПРОГРАММЫ
1.ВВОД ПРОГРАММЫ
Наберите программу из лекции в текстовом редакторе MS DOS. Сохрание программу под именем exasm1 с расширением asm. Программа exasm1.asm еще не может быть выполнена – прежде необходимо провести ее ассемблирование и компоновку.
2. АССЕМБЛИРОВАНИЕ ПРОГРАММЫ
Для того, чтобы выполнить исходную ассемблерную программу, необходимо прежде провести ее ассемблирование и затем компоновкуПростейший вариант вызова программы – ввод команды
ТASM имя_файла_с_расширением_asm
В результате будет создан объектный файл. Просмотрите командой dir.
3. КОМПОНОВКА ПРОГРАММЫ
Введите команду
tlink имя_файла_с_расширением_obj
В результате будет создан исполняемый файл. Просмотрите командой dir.
Бастпқы программа мысалы:
Программа содержит сегмент стека и сегмент кода. Сегмент стека содержит один элемент DB (определить байт), который определяет 12 копий слова 'STACKSEG'. Сегмент кода содержит выполняемые команды программы, хотя первая команды ASSUME не генерирует кода, она назначает регистры для соответствующих сегментов. В действительности, она сообщает ассемблеру, что для адресации в STACKSEG надо использовать адрес в регистре SS, а для CODESG – адрес в регистре CS. Системный загрузчик при загрузке программы в память для выполнения устанавливает адреса в регистрах SS и CS.
Программа не имеет сегмента данных, так как в ней нет определения данных.
TITLE prim(exe) Операции пересылки и сложения
;---------------------------------------------------------------------------------
STK SEGMENT STACK
DB 12 DUP('STACKSEG')
STK ENDS
;-----------------------------------------------------------------
CODESG SEGMENT PARA
BEGIN PROC FAR
ASSUME CS:CODESG, SS:STK,DS:NOTHING
PUSH DS ;Записать DS в стек
SUB AX, AX ;Записать в стек
PUSH AX ;нулевой адрес
MOV AX, 0123H ; Записать 0123 в АХ
ADD AX,0125H ; Прибавить 25 к АХ
mov bx, ax ;
RET
BEGIN ENDP ; Конец процедуры
CODEsg ENDS ; Конец сегмента
END begin
Лабораториялық жұмыс 11
З А Д А Н И Я :
Получите адреса и коды команд программы с помощью программы Дебаг.
Генерируют ли коды директивы программы, перечислите директивы.
Объясните значения машинных кодов в левой части программы. Приведите в соответствие адреса команд и данных.
Выпишите адреса сегментов
Выполните ассемблирование и компоновку программы
Запустите программу из Дебага
Просмотрите сегменты стека, кода
Сравните машинный код с листингом ассемблера
Просмотрите значения регистров
Выполните программу трассировкой, дойдя до команды RET , выйдите из отладчика
Выполните шаги 1-10 для программы EXASM1(exe).
Разберите по схеме 1-10 программу EXASM2(exe
page 60,132
TITLE EXASM1(exe) Операции пересылки и сложения
;---------------------------------------------------------------------------------
STK SEGMENT STACK
DB 12 DUP('STACKSEG')
STK ENDS
;-----------------------------------------------------------------
CODESG SEGMENT PARA
BEGIN PROC FAR
ASSUME CS:CODESG, SS:STK,DS:NOTHING
PUSH DS ;Записать DS в стек
SUB AX, AX ;Записать в стек
PUSH AX ;нулевой адрес
MOV AX, 0123H ; Записать 0123 в АХ
ADD AX,0025H ; Прибавить 25 к АХ
MOV BX,AX ;Переслать АХ в ВХ
ADD BX,AX
MOV CX,BX
SUB CX,AX
SUB AX,AX ;Очистить АХ
nop
RET
BEGIN ENDP ; Конец процедуры
CODEsg ENDS ; Конец сегмента
END begin ; конец программы
Команды, следующие за ASSUME – PUSH, SUB и PUSH – выполняют стандартные действия для инициализации стека текущим адресом в регистре DS и нулевым адресом.
Лабораториялық жұмыс 12
Пример исходной прогаммы (EXASM 2)
Рассмотренная программа не содержит опр-ния данных. Программа обычно имеет определенные константы, рабочие поля для арифметических вычислений и области для операций ввода-вывода.
Рассмотрим следующую программу:
page 60,132
TITLE EXASM2(exe) Операции пересылки и сложения
3 ;-------------------------------------------------------------------------------------
4 0000 STACKSG SEGMENT PARA STSCK ‘Stack’
5 0000 20 [ DW 32 DUP(?)
6 ????
7 ]
8
9 0040 STACKSG
10 ;---------------------------------------------------------------------------------------
11 0000 DATASG SEGMENT PARA ‘Data’
12 0000 00FA FLDA DW 250
13 0002 0070 FLDW DW 125
14 0004 ???? FLDC DW ?
15 0006 DATASG ENDS
16 ;---------------------------------------------------------------------------------------
17 0000 CODESG SEGMENT PARA ‘Code’
18 0000 BEGIN PROC FAR
19 ASSUME CS:CODESG, DS:DATASG, SS:STACKSG, SS:NOTHING
20 0000 1E PUSH DS ;Записать DS в стек
21 0001 28CO SUB AX, AX ;Записать в стек
22 0003 50 PUSH AX ;нулевой адрес
23 0004 B8 ---R MOV AX, DATASG ; Поместить адрес DATASG
24 0007 8ED8 MOV DS,AX ; в регистр DS
25
26 0009 А1 0000 R MOV AX,FLDA ; Переслать 0250 в АХ
27 000С 03 06 0002 R ADD AX,FLDB ; Прибавить 0125 к АХ
28 0010 А3 0004 R MOV FLDC,AX ;Записать сумму в FLDC
29 0013 CB RET
30 0014 BEGIN ENDP
31 0014 CODESG ENDS
32 END BEGIN
Segments and Groups:
N a m e Size Align Combine Class
CODESG ……………………………0014 PARA NONE ‘Code”
DATASG ……………………………0006 PARA NPNE ‘Data’
STACKSG ……………………………0040 PARA STACK ‘Stack’
Лабораториялық жұмыс 13
Следующая программа выводит на экран сообщение и ждет нажатия любой клавиши (равнозначна команде "pause" в *.bat файлах):
(01) CSEG segment
(02) org 100h
(03) Start:
(04)
(05) mov ah,9
(06) mov dx,offset String
(07) int 21h
(08)
(09) mov ah,10h
(10) int 16h
(11)
(12) int 20h
(13)
(14) String db 'Нажмите любую клавишу...$'
(15) CSEG ends
(16) end Start
Строки с номерами (01), (02) и (15) пока опускаем. В строках (05) - (07), как Вы уже знаете, выводим на экран сообщение. Затем (строки (09) - (10)) ждем нажатия клавиши. И, наконец, строка (12) выходит из нашей программы.
Мы уже знаем команды INC, ADD и SUB. Можно поэкспериментировать с вызовом прерывания. Например, так:
mov ah,0Fh
inc ah
int 16h
Это позволит Вам лучше запомнить новые операторы.
Лабораториялық жұмыс 14
Листинг 1 Пересылка строк командой movs
;prg_11_1.asm
MASM
MODEL small
STACK 256
.data
source db 'Тестируемая строка','$'
;строка-источник
dest db 19 DUP (' ') ;строка-приёмник
.code
assume ds:@data,es:@data
main: ;точка входа в программу
mov ax,@data ;загрузка сегментных регистров
mov ds,ax ;настройка регистров DS и ES
;на адрес сегмента данных
mov es,ax
cld ;сброс флага DF — обработка строки от начала к концу
lea si,source ;загрузка в si смещения строки-источника
lea di,dest ;загрузка в DS смещения строки-приёмника
mov cx,20 ;для префикса rep — счетчик повторений (длина строки)
rep movs dest,source ;пересылка строки
lea dx,dest
mov ah,09h ;вывод на экран строки-приёмника
int 21h
exit:
mov ax,4c00h
int 21h
end main
Лабораториялық жұмыс 15
LOOP (СХ нуль емес)
LOOP командасы автоматты түрде СХ регистрінің мазмұнының декриментін орындайды және , егер (СХ) 0-ге тең болмаса,
операндта көрсетілген программаның бөлігін орындауға көшеді.
Егер (СХ)=0 болса, басқару келесі командаға беріледі.
Мысал. Командалар тізімін (1000=3Е8h)мың рет орындау:
CS:0100 MOV CX,3E8 ;ЗАГРУЗКА ЧИСЛА ПОВТОРЕНИЙ В СХ
CS:0103 … ; қайталанылатын
… … …. ; командалар тізімі
CS:010F LOOP 103 ; 0103 ығысуына көшу, егер СХ 0-ге тең болмаса
Тапсырмалар:
Экранға ұзындығы 60 символ жолды 22 рет басып шығаратын программаны жазыңыз. LOOP командасын пайдаланыңыз.
Экранға 55 жұлдызшаны басып шығаратын программаны жазып ассемблерлеңіз.
Пәнді оқытуға арналған әдістемелік нұсқаулар.
Жүйелік программалау пәнін игеру үшін MS DOS, Windows жүйелерін жақсы білу қажет. Компьютер архитерктурасынан кейбір материалдарды өзбеттік түрде оқып алуға қажеттілік бар. Архитектураға байланысты материалдарды микропроцессор архитектурасын түсіну үшін білу керек. Теориялық материалды жақсы деңгейде түсініп отыру үшін санау жүйелерін, аүпаратты кодтаудан көптеген білімнің жақсы деңгейі талап етіледі. Пән мазмұны компьютер архитектурасымен, операциялық жүйелер пәндерімен тығыз байланысты.
Практика тапсырмаларын орындау үшін арналған әдістемелік нұсқаулар.
Оперативті жадының, микропроцессор регистрларымен танысу үшін Debug программасының қандайда бір версиясымен жұмыс жасап үйрену талап етіледі.
Assemler тілінде жұмыс жасау үшін арнайы талаптарды қатаң түрде сақтау қажет компьютер айырылып қалмас үшін. Assemler тілінің қарапайым программалары алдын ала Debug программасының ортасында орындалады, одан кейін сәйкес операциялық жүйе ортасында орындалу үшін өзгертіледі.
9. ПРАКТИка, СЕМИНАР, ЛАБОРАТОРиялық жұмыстар үшін арналған әдістемелілік тапсырмалар.
Студенттердің өзбеттік жұмысына арналған материалдар:
1. Сандар жүйесі
2. ДК архитектурасы
№1
DB директивасымен анықталады
№2
DW директивасымен анықталады
№3
mov AL,20H командасы нені көрсетеді
№4
Ассемблерде мәліметтерді анықтау әдістері
№5
Мәліметтерді анықтау форматы
№6
DW 10 DUP (?) командасы орындалғаннан кейін нәтижесінде не анықталады
№7
DB 5 DUP (14) командасы орындалғаннан кейін не анықталады
№8
DB 3 DUP (4 DUP(8)) командасы орындалғаннан кейін қандай нәтиже шығады
№9
Символдық жол қандай директиваның көмегімен анықталады
№10
Символдық өрнектің ұзындығы директивада қанша болуы мүмкін
№11
2 байтты ең үлкен 16-разрядты оң сан - бұл:
№12
Мына команданың орындалу нәтижесі: MOV AL,0123
№13
Қай команда шартсыз көшуді ұйымдастырады ?
№14
Циклды ұйымдастыру командасы
№15
Процедураны шақыру командысы
№16
Шартты өту командасы
№17
SHORT типінің қолданылуы:
№18
FAR, SHORT, NEAR басқаруларының берілу типтері мыналарға әсер етеді
№19
JMP A20 командысының орындалу нәтижесі
№20
CALL командасы стекке мына команданың қатыстық адресін жазады:
№21
POP командасы:
№22
SP регистрі бұл-
№23
Стектен қайта оралу адресін еңгізу үшін қолданылатын командаларды таңдаңыз:
№24
Стектан адресті оқу командаларын таңдаңыз:
№25
JE/JZ командасы қандай мәліметтер үшін қолданылады:
№26
JNE/JNZ командасы қандай мәліметтер үшін қолданылады:
№27
Программа фрагментінің қолданылу мақсаты:
BEGIN PROC FAR
… … …
BEGIN ENDP.
№28
NEAR операнды мынаны көрсетеді
№29
Программалық сегмент префиксі - бұл:
№30
Программаның кіру нүктесі бұл:
№31
SS регистрінде орналасатын адрес:
№32
SP регисторында орналасқан:
№33
DS регистрінде орналасқан адрес:
№34
CS регистрінде орналасқан адрес:
№35
DW 32 DUP(?) командасы орындалғандағы SP-нің мәні
№36
DW 16 DUP(?) командасы орындалғандағы SP-нің мәні
№37
Мына команданың орындалу нәтижесі:
STACSG SEGMENT PARA
DW 32 DUP(?)
STACSG ENDS
№38
Мына команданың орындалу нәтижесі:
PUSH DS
SUB AX,AX
PUSH AX
№39
ASSUME CS: CODESG, DS: DATASG, SS: STACKSG ассемблерлік сөйлемі арналған:
№40
Программа фрагментінің қолданылу мақсаты:
DATASG SEGMENT
NAME1 DB ‘ABCDEFGHI’
DATASG ENDS
№41
Мына команданың орындалу нәтижесі:
LEA SI, NAME1
№42
Мына команданың орындалу нәтижесі:
DEC CX
JNZ B20
RET
№43
DS регистрінің қолданылу мақсаты
№44
СS регистрінің қолданылу мақсаты
№45
ES регистрінің қолданылу мақсаты
№46
SS регистрінің қолданылу мақсаты
№47
Регистрде мынадай АХ=11000110, ВХ=00010110 таңбасыз мәліметтер бар.
Мына команданың орындалу нәтижесін табыңыз: СМР АХ, ВХ
№48
Регистрде мынадай АХ=11000110, ВХ=00010110 таңбалы мәліметтер бар.
Мына команданың орындалу нәтижесін табыңыз: СМР АХ, ВХ
№49
Командалар тізбегінің орындалу нәтижесі
…
mov cx, 10
A 20:
INC AX
ADD BX,AX
SHL DX,1
LOOP A 20
№50
Командалар тізбегінің орындалу нәтижесі
A20:
ADD AX, 01
ADD BX, AX
SHL CX, 1
JMP A 20
Практикаларды өтуге арналған нұсқаулар
Жүйелі программалау пәнінің оқу барысында қалыптастырылған білім және біліктер таза күйінде өндірістік практика барысында қолданылмайды. Ассемблер тілінде жазылған шағын фрагменттер объектті бағыттандырылған тілдерінде жазылған программаларына түзетулер, өзгертулерді жедел түрде еңгізу ушүн қажет.
11. Білімді бағалау жөніндегі мәлімет
Б а ғ а
|
Әріптік жүйе
|
Балл бойынша
|
%-тік қатынаста
|
Дәстүрлі жүйе бойынша
|
A
|
4,0
|
95-100
|
Өте жақсы
|
A-
|
3,67
|
90-94
|
B+
|
3,33
|
85-89
|
Жақсы
|
B
|
3,0
|
80-84
|
B-
|
2,67
|
75-79
|
C+
|
2,33
|
70-74
|
Қанағаттандырылған
|
C
|
2,0
|
65-69
|
C-
|
1,67
|
60-64
|
D+
|
1,33
|
55-59
|
D
|
1,0
|
50-54
|
F
|
0
|
0-49
|
Қанағаттандырылғансыз
|
Курс саясаты және іс-жосығы (процедурасы)
Студенттер алдына қойылатын талаптар:
Сабаққа қатысу:
Сабаққа міндетті түрде қатысу. Жіберілген сабақтар бойынша міндетті түрде есеп беру. Себепсіз курстың 1/3 бөлігі жіберілген жағдайда студент курсты игермеген болып саналады.
Аудиториядағы тәртіп:
Сабаққа кешікпеу, сабақты мұқият тыңдап белсенді түрде материалды талдауға араласу.
Достарыңызбен бөлісу: |