ОТЧЕТ
по лабораторной работе №1
по дисциплине «Arhitectura calculatoarelor»
Тема: «Разработка ассемблерных программ в Visual Studio»
Кишинев 2021
Цель работы: Изучить программную модель микропроцессоров, 16,
32 и 64 битных регистров. Ознакомиться со средой разработки Microsoft
Visual Studio.
Регистры оффсета - EIP, ESP, EBP, ESI, EDI. Эти регистры 32-х
битные, нижняя половина которых доступна как регистры IP, SP, BP, SI,
DI.
EIP - указатель команд, и содержит оффсет (величину
смещения относительно начала программы) на линию кода, которая будет
исполняться следующей. То есть полный адрес на следующую
исполняемую линию кода будет CS:ЕIP.
Регистр ESP указывает на адрес вершины стека (адрес, куда
будет заноситься следующая переменная командой PUSH).
Регистр ЕВР содержит адрес, начиная с которого в стек
вносится или забирается информация (или "глубина" стека). Параметры
функций имеют положительный сдвиг относительно ЕВР, локальные
переменные - отрицательный сдвиг, а полный адрес этого участка памяти
будет SS:EBP.
Регистр ESI - адрес источника, и содержит адрес начала блока
информации для операции "переместить блок" (полный адрес DS:SI), а
регистр EDI- адрес назначения в этой операции (полный адрес ES:EDI).
.DATA
Vopros byte "Jelaesi stati programistom?-[y/n]",0
Da DB 'Stanesi !',10,13,0
Net DB 'Stanesi filosofom!',0ah,0dh,0
Err BYTE "Jmi pravilino clavisu !",7,0
IsNud: mov bp, offset Net ; обьявляются параметры для вывода строки с
mov cx, sizeof net ;offset net
mov dh, 14
mov al, 1
mov bl, 010011100b
Disp: ; метка
mov ah, 13h ; 13h – код функции вывода строки
int 10h ; BIOS services
1. DATA
Директива предназначена для определения начала или продолжения
сегмента инициализированных данных. В нашем случае этот сегмент
содержит 3 последовательности ASCII символов, коду каждого символа
присваивается один байт в памяти (DB, BYTE), со смещениями (offset)
Vopros, Da, Net и Err, значения -13,10 рассматриваются как команды –
завершение ряда (LF), с новой строки (CR) соответсвенно;
2. main PROC указывает начало процедуры с именем (смещением)
main , которая содержит основной код программы, main ENDP указывает
завершение процедуры. Директива END main указывает завершение
программы (называемой еще и точкой входа в программу), весь код
помещенный после этой директивы, будет игнорироваться ассемблером;
3. В следующих 3 строках происходит инициализация сегментов
данных ds и es. Запись @data определяет сегмент, созданный директивой
.DATA (или адрес сегмента, адрес первого байта в этом сегменте);
4. Последовательности символов по смещению Vopros, Da, Net и
Err выводятся на экран при помощи функции BIOS с кодом 13h.
5. Прерывание Int 10h вызывает сервис BIOS (BIOS Services), для
выполнения функции, ее код должен быть загружен в регистре ah.
В процедуре вызова функции (INT) можно указать несколько
подфункций. Функция указывается путем помещения ее номера в регистр
AH (подфункция - в регистр AL). Вызов определенной функции BIOS
осуществляется следующим образом:
0000000A er:
0000000A E8 00000000 E call ReadChar
00000039 ex:
exit
00000039 6A 00 * push +000000000h
0000003B E8 00000000 E * call ExitProcess
00000040 main ENDP
END main
.data
sum qword 0
.code
main proc
mov rax,5
add rax,6
mov sum,rax
mov ecx,0
call ExitProcess
main endp
end
Пошаговая отладка 64-х битной программы: