- •Федеральное агентство по образованию
- •В.Н. ЛОКТЮХИН
- •Рязань 2008
- •Печатается по решению редакционно-издательского совета Государственного образовательного учреждения высшего профессионального образования «Рязанский государственный университет имени С.А. Есенина» в соответствии с планом изданий на 2008 год.
- •ВВЕДЕНИЕ
- •1.1. Системы счисления, применяемые в ЭВМ
- •1. Двоичная система счисления
- •2. Шестнадцатеричная система счисления
- •1.5. Кодирование алфавитно-цифровой информации
- •Представление чисел в ЭВМ
- •Форматы (формы представления) числовых данных в МП
- •3. Представление многобайтовых двоичных чисел
- •4. Представление чисел с плавающей точкой (ПТ)
- •1.7.2. Сложение двоичных чисел в ЭВМ
- •Рис. 2.2. Формат регистра признаков
- •2.1.2. Модели доступа к памяти в реальном и защищенном режимах работы процессора, поддержка многозадачности
- •Формат команды и способ адресации как элементы программной архитектуры и ассемблера
- •3. ОСНОВЫ РАЗРАБОТКИ И ОТЛАДКИ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА IBM PC
- •В таблице 3.1 приведены примеры записи в программах директив ассемблера tasm.exe фирмы Borland.
- •Таблица 3.1
- •Примеры записи директив ассемблера tasm
- •Пример 3.4
- •Пример 3.5
- •.MODEL
- •3.3.1. Разновидности программного обеспечения для разработки программ на языке ассемблера
- •3.3.3. Порядок ввода и отладки программы (пример 3.4) с исполняемым com-модулем
- •Создание исполняемого модуля
- •Порядок разработки программы
- •Пример 3.6
- •Ассемблирование
- •Создание исполняемого модуля
- •Выполнение и отладка программы
- •3.8. Программирование обработки цепочек данных
- •ПРИЛОЖЕНИЯ
- •Приложение 1
- •Варианты заданий к практическим занятиям по представлению данных и выполнению арифметико-логических операций в ЭВМ
- •Приложение 2
- •Приложение 3
- •Приложение 4
- •Приложение 6
- •Таблица сложения 16-ричных цифр (символов)
- •Приложение 8
- •Базовая система команд МП 80Х86 (или 8086)
- •ОГЛАВЛЕНИЕ
- •ВВЕДЕНИЕ………………………...………...……………………......
- •Системы счисления, применяемые в ЭВМ……...………………
- •Перевод из десятичной в q-ичную систему счисления.....……
- •Перевод из q-ичной в десятичную систему счисления….....…
- •ПРИНЦИПЫ ДОСТУПА К ПАМЯТИ. ФОРМАТЫ КОМАНД И РЕЖИМЫ АДРЕСАЦИИ В МП 80Х86…………………...….....
- •Регистры и модели доступа к памяти. Поддержка многозадачности в защищенном режиме работы МП………..
- •Приложение 1. Варианты практических заданий по представлению данных и выполнению арифметико-логических операций в ЭВМ..
- •Приложение 5. Варианты заданий по обработке цепочек…………..
- •Приложение 6. Таблица сложения 16-ричных цифр (символов)……
- •Приложение 7. Темы практических занятий и лабораторных работ
- •Приложение 8. Базовая система команд МП 80х86 (или 8086)….....
- •архитектура
- •Книга 2
mov y,bx ;Передать полученное значение y в память
Определение числа АSCII-символов, например, 35Н, можно производить с помощью последовательности команд СМР AL,35Н и условного перехода по не нулю JNZ (см. пример 2.2).
3.5. Порядок создания и отладки исполняемого ехе-моду- ля с символьной информацией для отладчика
Создание исходного файла программы
1.С помощью команд редактора оболочки (см. действия 1–3
п.3.3.3) создайте исходный файл (с расширением .asm) программы на языке ассемблера, приведенной в примере 3.6.
Ассемблирование
2.В командной строке оболочки введите команду
tasm /zi <имя файла>.asm,,
Создание исполняемого модуля
3. При наличии obj-модуля введите команду tlink /v/x <имя файла>.obj
При этом программой tlink будет сгенерирован исполняемый exeмодуль с символьной информацией для отладчика.
Выполнение и отладка программы
4. Для выполнения программы в отладчике вызовите команду td <имя файла>.exe
После недолгой загрузки система перейдет в отладчик TD. На экране изобразятся два окна отладки: окно модуля Module с текстом программы и ниже – окно просмотра Watches. Далее приводится порядок отладки программы в этой среде.
5.C помощью команд главного меню View; Dump и View; Registers выведите на экран окна памяти и регистров. Мышкой сместите их на края модуля отладки, предварительно уменьшив его размеры. Порядок отображения и модификацию данных в окнах отладчика дан в пунктах 10 и 11 п. 3.3.3.
6.Последовательно, нажимая клавишу F7, выполните первые две команды программы: mov ax,@data и mov ds,ax. После чего перейдите в окно памяти и установите в нем начальный адрес данных: Alt–F10, GOTO, ds:500h [ENTER]. Задание ds: обязательно.
6. Выполните далее программу по шагам, нажимая последовательно F7 или F8. При выполнении, например, программы, данной в примере 3.6, в окне памяти, начиная с адреса ds:500h, будут последовательно отображаться байты суммы, а в окне регистров – значения регистров
70
AL, CX, SI и DI. При этом содержимое AL представляется в виде двух младших цифр регистра АХ.
Клавишами Ctrl–F2 можно перезагрузить программу и выйти на начало ее выполнения, отмечаемое в модуле отладки стрелкой.
7.Нажав Alt–X, выйдите из отладчика.
3.6.Особенности разработки и отладки 32-разрядных прикладных программ на базе МП 80х86
3.6.1.Использование средств 32-разрядных МП 80x86
для разработки программ для реального режима
Все 32-разрядные микропроцессоры (i386, i486, различные модели Pentium) имеют режимы: реального (R-режима) и защищенного (P-режима) адреса. Только в Р-режиме эти МП выполняют 32-битовые программы с использованием таких их возможностей, как:
1)адресное пространство памяти 4 Гбайт;
2)использование 32-битовой адресации команд;
3)новые привилегированные команды для Р-режима;
4)применение 32-битовых регистров (EAX, EBX, ECX и т.д.);
5)использование масштабированной индексной адресации, например: MOV EAX, [EBX+ESI*2+200h] – базовая индексная с масштабированием и смещением (может содержать до 15 байт);
6)использование режимов 32-битовой адресации данных, включая
иновые, например, варианты индексной адресации с масштабированием;
7)четыре сегмента данных вместо двух.
Однако есть возможность использовать преимущества, указанные в п. 4–7, если МП работает и в реальном режиме. Единственный минус – все эти программы для R-режима работают только в сегментах емкостью 64 Кбайт и в памяти 1 Мбайт. Это объясняется тем, что старшие биты А31-А16 эффективного адреса, например, [EBX] или [ESI], не изменяются.
Если используются 32-битовые адреса и операнды, то команда (рис. 3.9) содержит дополнительные байты атрибутов: 66h – размер операнда 32 бита, 67h – размер адреса 32 бита.
Префикс команды |
Префикс размера |
Префикс размера |
Префикс замены |
REP |
адреса |
операнда |
сегмента |
0–1 байт |
0–1 байт |
0–1 байт |
0–1 байт |
|
67h |
66h |
|
71
КОП |
Mod reg r/m |
Масштаб |
Смещение в |
Непосредств. |
1 или 2 |
0 или 1 |
0 или 1 |
команде |
операнд |
Байта |
байт |
Байт |
0–2, 4 байта |
0–2, 4 байта |
|
|
Коэфф. 1, 2, 4, 8 |
|
|
Рис. 3.9. Формат команды МП i80x86 для 32-разрядных программ
По умолчанию ассемблер генерирует коды для 16-разрядного МП, вследствие этого необходимо в программе указать тип МП-32, например .486 или .586 для МП Pentium. При создании 32-разрядных программ для работы в защищенном режиме, например, под Windows, целесообразно разрешить применение в них привилегированных команд МП 80х86. С этой целью программе указывается, например, директива . 586Р или .486Р.
На рисунке 3.10 приведена схема формирования эффективного адреса ЕЕА при 32-битовой адресации для команды MOV EAX, [EBX+ESI*2+200h].
31 |
0 |
|
EBX |
База |
|
31 |
0 |
|
200H Смещение |
+ |
|
ESI |
Индекс |
|
21, 2, 4, 8
*
+
ЕЕА
Рис. 3.10. Схема формирования адреса EЕА = EBX + ESI*2 + 200h
Далее приведен пример 3.11 программы для R-режима с использованием 32-битовых регистров и режимов адресации данных. Для задания сегментов в ней использованы стандартные директивы SEGMENT – начало и ENDS – конец сегмента. Параметр use16 при описании сегментов ограничивает их размеры до 64 Кбайт.
В программе применяются индексная с масштабированием адресация данных (см. рис. 3.6) и стандартные директивы ассемблера для определения сегментов.
3.6.2. Порядок создания и отладки ехе-модуля 32-разрядной программы с отладочной информацией
Формирование ехе-модуля 32-разрядной программы
72
1. Для созданного в редакторе исходного файла с расширением .asm введите следующую последовательность команд, последовательно запускающих выполнение соответствующих системных программ:
tasm /zi <имя файла>.asm,, tlink /3/v <имя файла>.obj td <имя файла>.exe
Пример 3.11
;Программа вычисления выражения M = K – R + N + 120h
;с формированием ехе-модуля, когда данные – 32-разрядные слова ;K, R, N и M размещены в памяти с адреса 500h
|
|
.486 |
|
|
|
stack1 |
segment |
stack use16‘stack’ |
|||
db |
|
64 dup(0) |
;Стек 64 байта |
||
stack1 |
ends |
|
|
|
|
dseg |
segment |
para |
use16‘data’ |
||
|
org |
500h |
|
;Начальный адрес данных |
|
k |
dd |
+60h |
|
;Переменные k |
|
r |
dd |
-10h |
|
;r |
|
n |
dd |
+30h |
|
;n |
|
m |
dd |
0 |
|
;Результат m |
|
dseg |
ends |
|
|
|
|
cseg |
segment |
para |
use16‘code’ |
||
|
assume |
cs:cseg, ds:dseg, ss:stack1 |
|||
beginproc |
far |
|
|
;Дальняя процедура |
|
|
push |
ds |
|
|
|
|
sub |
eax,eax |
|
|
|
|
push |
ax |
|
|
;Указание регистру ds |
|
mov |
ax,dseg |
|
||
|
mov |
ds,ax |
|
|
;на сегмент данных |
;Команды программы |
|
|
|||
|
mov |
ebx,offset k |
|
;ebx ← адрес операнда k |
|
|
mov |
esi,4 |
|
|
|
|
mov |
eax,[ebx] |
|
;eax ← адрес операнда k |
|
|
sub |
eax,[ebx+esi*1] |
;eax ← eax – r |
||
|
add |
eax,[ebx+esi*2] |
;eax ← eax + n |
||
73
add |
eax,120h |
;eax ← eax +120h |
mov |
[ebx+esi*4],eax |
;m ← eax |
mov |
ah,4ch |
|
int |
21h |
|
beginendp |
|
|
cseg ends |
|
|
end |
begin |
|
Порядок работы в отладчике td.exe
2.Выведите на экран окно регистров: VIEW, REGISTER [ENTER]
3.Находясь в окне регистров, вызовите локальное меню (Alt–F10)
иустановите длину регистров – 32 бита:
REGISTER 32 bit
YES 
4. Выведите на экран окно памяти: VIEW, DUMP [ENTER]
Перейдите в окно памяти и становите в нем длину данных – двойное слово:
Ctrl-D, LONG [ENTER]
5.Последовательно, нажимая F8, выполните все команды до mov ds,ax (включительно).
6.В окне данных установите начальный адрес данных:
Alt–F10, GOTO, ds:500h [ENTER]
7. Выполните далее программу по шагам (F8), наблюдая за результатами ее работы.
8. Просмотрите кодировку программы в окне CPU: VIEW, CPU [ENTER]
9.Выйдите из отладчика.
3.7.Особенности программирования на ассемблере с использованием процедур и макроопределений
На примере 3.12 рассмотрена программа выдачи сообщений на экран, которая оформлена в виде процедуры PROC с именем OUR_PROG. В сегменте данных этой программы оператор TEXT1 определяет текст сообщения, выводимого на экран, а SIMV – последовательность звездочек (*), выделяющую этот текст. Порядок отладки программы по выводу заданного текста (приложение 7) дан в п. 3.5.
74
В процедуре VDISP используется команда прерывания DOS INT 21H, с помощью которой производится обращение к функции для работы с дисплеем. Адрес типа функции задается значением регистра AH = 9. Знак $ в тексте определяет конец изображаемой строки, начальный адрес которой задается в регистре DX командой MOV DX,OFFSET TEXT1. Коды 0Dh и 0Ah обеспечивают перевод маркера в начало следующей строки (0D – возврат каретки, 0A – переход на следующую строку). В основной программе процедура вызывается командой вызова CALL VDISP.
Пример 3.12
Программа вывода текста на экран.
;Начало программы |
|
|
||
.MODEL |
small ;Ближние модели программы и данных |
|||
.STACK |
64 |
;Размер стека 64 байта |
||
.DATA |
|
;Начало сегмента данных |
||
;Тексты сообщений |
|
|
||
text1 db |
’Иванова И.А.’,0dh,0ah |
|||
db |
’Петрова Н.В.’,0dh,0ah,’$’ |
|||
simv db |
’*****************’, 0dh,0ah,’$’ |
|||
.CODE |
|
;Начало кодового сегмента |
||
our_prog |
proc |
|
;Процедура с именем OUR_PROG |
|
mov |
ax,@data |
;Указывает DS на |
||
mov |
ds,ax |
|
;сегмент данных |
|
;Команды программы |
|
|
||
mov |
dx,offset text1 |
;Адрес строки TEXT1 в DX |
||
call |
vdisp |
|
|
;Вызов процедуры вывода строки |
mov |
dx,offset simv |
;Адрес строки SIMV в DX |
||
call |
vdisp |
|
|
;Вызов процедуры вывода строки |
mov |
ah,4ch |
|
;Функция DOS |
|
int |
21h |
|
|
;выхода из программы |
our_prog |
endp |
|
|
;Конец процедуры |
;Процедура вывода строки на экран |
||||
vdisp proc |
|
|
|
|
push |
ax |
|
|
|
mov |
ah,9 |
|
|
;Функция DOS |
int |
21h |
|
|
;вывода строки на экран |
pop |
ax |
|
|
|
ret |
|
|
|
|
vdisp endp |
|
|
|
|
END our_prog |
|
|
;Конец программы |
|
75
