Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

49

Теперь посмотрим на содержимое окна 3 отладчика. Как видно оно состоит из четырех столбцов:

Адреса

Байты

Инструкции

Операнды

12BD:0100

B409

MOV

AH,09

Первый столбец содержит адреса в формате СЕГМЕНТ:СМЕЩЕНИЕ. Второй столбец машинные коды инструкций и операндов в шестнадцатеричном виде. Третий столбец имена инструкций. Четвертый столбец операнды инструкций.

Нажимая клавишу <F10>, вы можете выполнять трассировку программы, т. е. построчное выполнение программы, но без захода в процедуры. Для выполнения трассировки с заходом в процедуры нужно использовать клавишу <F8>. При этом можно наблюдать, как в окне регистров (окно 7) будут изменяться текущие значения регистров и флагов.

Можно выполнить сразу целый фрагмент программы (несколько строк). Для этого надо установить курсор в окне 3 перед той строкой, на которой требуется сделать остановку, и нажать клавишу <F7>. Выполнятся все строки программы до той, на которой установлен курсор; подсветка переместится на эту строку. Далее можно опять выполнять программу построчно, нажимая клавишу <F10> или, установив в требуемом месте курсор, выполнить следующий фрагмент, нажав <F7>.

В любое время можно вернуть программу в первоначальное состояние (какое было в момент загрузки), т. е. выполнить рестарт. Для этого надо в главном меню выбрать пункт Run, а в подменю этого пункта — пункт Restart.

Если программа должна выводить что-то на экран, то, не выходя из отладчика, можно увидеть результат работы программы. Для этого нужно выбрать меню View и в нем подменю Output, или просто нажать клавишу <F4>. Для возврата в окно отладчика можно нажать любую клавишу.

С помощью меню File –> Exit можно выйти из отладчика. Выход из отладчика можно осуществить также нажатием комбинации клавиш <Alt>+<F4>.

2.10. Младший байт по младшему адресу

Отладчик сейчас нам поможет понять важный принцип размещения данных в памяти, который вы должны хорошо знать.

Если запись в память осуществляется отдельных байтов, то они располагаются в естественном порядке — в порядке возрастания адресов памяти. Но если осуществляется запись многобайтовых единиц информации, то байты располагаются в памяти в обратном порядке по принципу: младший байт по младшему адресу. Эта особенность не языка ассемблера, а архитектуры микропроцессоров Intel.

Чтобы было более понятно, рассмотрим на конкретном примере (листинг 2.3).

Листинг 2.3. Программа для демонстрации размещения данных в памяти

.model small

.stack 100h

.code

 

 

start: mov

ax,@data

mov

ds,ax

 

mov

ah,9

 

mov

dx,offset message1

int

21h

 

mov

ax,4C00h

int

21h

 

.data

 

 

message1

db

"Запустите программу в отладчике $"

http://www.sklyaroff.ru

 

 

50

var1

db

47h

; однобайтовое значение

var2

dw

2a5ch

; двухбайтовое значение

var3

dd

8f3d89a1h

; четырехбайтовое значение

mas1

db

10 dup (" ")

 

 

mas2

db

5 dup (?)

 

 

message2

db

"Конец сегмента данных $"

end start

Запустите программу под отладчиком. Для этого скопируйте файл в каталог отладчика (\BINR) и запустите из командной строки следующим образом:

cv memdata.com

Затем поместите курсор в окне Dump и промотайте немного вниз, пока не увидите содержимое памяти сегмента данных нашей программы (рис. 2.4).

Рис. 2.4. Дамп памяти в окне отладчика CodeView

Как видно сразу за строкой "Запустите программу в отладчике $" в памяти располагается содержимое переменной var1 равное байту 47h. Далее обратите внимание, как размещены в памяти байты, входящие в слово переменной var2. Сначала следует байт 5ch, а затем байт 2ah. То есть значения расположены наоборот: сначала расположен младший байт значения, а затем старший. Точно также согласно принципу "младший байт по младшему адресу" расположены байты, входящие в двойное слово переменной var3. Затем идут десять пробелов массива mas1, затем пять случайных значений массива mas2 и затем строка message2.

Заметьте, что строки располагаются в памяти не в перевернутом виде, потому что определение вида:

message1

db

"Запустите программу в отладчике $"

Заставляет процессор рассматривать каждый символ как отдельный байт, поэтому строка не является многобайтным значением (посмотрите еще раз примеры в разд. 2.4.1).

Повторюсь, что согласно принципу "младший байт по младшему адресу" размещаются в памяти только многобайтовые значения, определяемые в основном с помощью таких директив как DW, DD, DF, DP, DQ и DT, но только не DB.

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

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