- •Тема: «Регистры. Формат строки. Команды перемещения данных. Инициализация данных. Работа с отладчиком»
- •Лабораторная работа № 2 Цель работы: знакомство с архитектурой процессора, получение навыков работы с отладчиком.
- •Регистры
- •Формат строки
- •Команды перемещения данных
- •Перемещение данных в стек и из стека
- •Обмен данными
- •Работа с отладчиком
- •Инициализация массивов
- •Инициализация строк символов
- •Неинициализированные данные
Формат строки
Строки исходного кода на языке Ассемблер имеют следующий формат:
<метка> <инструкция/директива> <операнды> <; комментарий>
где <метка> - представляет собой необязательное имя идентификатора;
<инструкция/директива> - это мнемоника инструкции или директивы;
<операнды> - содержат сочетание 0, 1, 2 (иногда больше) констант, ссылок на память или регистры, или текстовых строк, как это требуется в каждой конкретной инструкции или директиве;
<; комментарий> - необязательный комментарий.
В любом месте строки в качестве символа продолжения строки можно поместить символ обратной косой черты «\».
Команды перемещения данных
Команды типа регистр - регистр и регистр – память.
Данные в процессоре перемещаются с помощью инструкции MOV. В действительности MOV (от слова переместить) – это не совсем удачное название данной инструкции. Более точно было бы назвать её COPY (копировать), т.к. инструкция MOV на самом деле записывает копию операнда приемника в операнд-приемник.
В инструкции MOV можно использовать почти любую пару операндов. В качестве операнда-источника (правого операнда) инструкции MOV можно использовать следующее: константу, выражение, при вычислении которого получается константа, общий регистр или ячейку памяти, доступную с помощью одного из режимов адресации. В качестве операнда-приемника (левого операнда) инструкции MOV может использоваться регистр или ячейка памяти.
Перемещение данных в стек и из стека
Стек работает по правилу «Первым пришел – последним ушел». На вершину стека всегда указывает регистр SP. К стеку обращаются с помощью инструкций PUSH и POP. Инструкция PUSH сохраняет операнд в вершине стека, а инструкция POP извлекает значение из вершины стека и сохраняет его в операнде.
Обмен данными
Выполнять обмен содержимого двух операндов позволяет инструкция XCHG. Это предоставляет удобный способ выполнять операцию, которая в противном случае потребовала бы трех инструкций.
ВНИМАНИЕ! Любая написанная Вами программа должна содержать директивы управления сегментами памяти и выход в DOS. Перед директивой END программа должна содержать строки:
mov ah,4ch ; функция DOS завершения программы
int 21 ; завершить программу.
Работа с отладчиком
Для визуализации процессов, происходящих в программе и в качестве удобного средства обнаружения ошибок в программе, используют специальные программы, называемые отладчиком. Мы будем рассматривать INSIGHT, удобный и наглядный отладчик.
Наиболее простой способ начать отладку запустить его и загрузить необходимую программу.
На экране присутствуют окна отображающие: непосредственно сам программный код, текущее состояние всех регистров, в том числе и регистра флагов, а также содержимое стека.
Используя функции меню (вход в меня клавиша «alt») можно запустить программу в пошаговом режиме (режим трассировки) и наблюдать за изменением состояния регистров, тем самым, находить ошибки в коде.
ЗАДАНИЕ №1
segment .text ; сегмент когда
global_start ; должно быть объявлено для линкера
_start: ; сообщаем линкеру точку входа
mov edx,len ; длина сообщения
mov ecx,msg ; сообщение для написания
mov ebx,1 ; файловый дескриптор (stdout)
mov eax,4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра
mov eax,1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра
segment .data ; сегмент данных
msg db 'Hello, world!',0xa ; наша строка
len equ $ - msg ; длина нашей строки
ЗАДАНИЕ №2
_STACK segment para stack
db 1024 dup(?)
_STACK ends
_DATA segment
;Опредилить число -678,используя минимальную возможную директиву.
_s678 dw -678
;Описать переменную памяти cvb, длиной двойное слово и загрузить в нее число 4578995
cvb dd 4578995
_DATA ends
_TEXT segment
assume cs:_TEXT, ds:_DATA, ss:_STACK
main proc
;инициализация сегментного регистра данных
mov ax, _DATA
mov ds, ax
;Загрузить в DI число 3456h
mov di, 3456h
;Содержимое DI скопировать в AX
mov ax, di
;Старшее слово переменной CVB скопировать в BX,младшее слово переменной CVB скопировать в DX
mov dx, word ptr [cvb+2]
mov bx, word ptr [cvb+0]
;Переменную с числом -678 скопировать из памяти в CX
mov cx, [_s678]
;Используя стек, осуществить обмен содержимого AX и DI
push ax
mov ax, di
pop di
;Выполнить обмен содержимого старшего и младшего байта AX
xchg al, ah
;завершение программы
mov ax, 4C00h
int 21h
main endp
_ TEXT ends
end main