Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
loktuhin_arhitektura_kompjutera_kniga_2.pdf
Скачиваний:
89
Добавлен:
13.04.2015
Размер:
704 Кб
Скачать
☆

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]