Вы находитесь на странице: 1из 16

Министерство Образования Республики Молдова

Технический Университет Молдовы


Факультет вычислительной техники, информатики и
микроэлектроники

ОТЧЕТ
по лабораторной работе №1
по дисциплине «Arhitectura calculatoarelor»
Тема: «Разработка ассемблерных программ в Visual Studio»

Подготовила: ст. гр. TI-182fr: Лищенко А.

Проверил: конф. унив. Постован Дм.

Кишинев 2021
Цель работы: Изучить программную модель микропроцессоров, 16,
32 и 64 битных регистров. Ознакомиться со средой разработки Microsoft
Visual Studio.

Регистры – это специальные участки памяти внутри самого


процессора, от 8-ми до 32-х бит длиной. Работа с регистрами выполняется
намного быстрее, чем с ячейками оперативной памяти,
поэтому регистры активно используются как в программах на
языке ассемблера, так и компиляторами языков высокого уровня.
Некоторые регистры содержат только определенную информацию.
Регистры общего назначения - EAX, EBX, ECX, EDX. Они 32-х
битные и делятся еще на две части, нижние из которых AX, BX, CD, DX -
16-ти битные, и деляется еще на два 8-ми битных регистра. Так, АХ
делится на AH и AL, DX на DH и DL и т.д. Буква "Н" означает верхний
регистр.
Так, AH и AL каждый по одному байту, АХ - 2 байта (или word -
слово), ЕАХ - 4 байта (или dword - двойное слово). Эти регистры
используются для операций с данными, такими, как сравнение,
математические операции или запись данных в память.
Регистр СХ чаще всего используется как счетчик в циклах.
АН в DOS программах используется как определитель, какой сервис
будет использоваться при вызове INT.
Регистры сегментов - это CS, DS, ES, FS, GS, SS. Эти регистры 16-
ти битные, и содержат в себе первую половину адреса "оффсет:сегмент".
 CS - сегмент кода (страница памяти) исполняемой в данный
момент программы.
 DS - сегмент (страница) данных исполняемой программы, т.е.
константы, строковые ссылки и т.д.
 SS - сегмент стека исполняемой программы.
 ES, FS, GS - дополнительные сегменты, и могут не
использоваться программой.

Регистры оффсета - EIP, ESP, EBP, ESI, EDI. Эти регистры 32-х
битные, нижняя половина которых доступна как регистры IP, SP, BP, SI,
DI.
 EIP - указатель команд, и содержит оффсет (величину
смещения относительно начала программы) на линию кода, которая будет
исполняться следующей. То есть полный адрес на следующую
исполняемую линию кода будет CS:ЕIP.
 Регистр ESP указывает на адрес вершины стека (адрес, куда
будет заноситься следующая переменная командой PUSH).
 Регистр ЕВР содержит адрес, начиная с которого в стек
вносится или забирается информация (или "глубина" стека). Параметры
функций имеют положительный сдвиг относительно ЕВР, локальные
переменные - отрицательный сдвиг, а полный адрес этого участка памяти
будет SS:EBP.
 Регистр ESI - адрес источника, и содержит адрес начала блока
информации для операции "переместить блок" (полный адрес DS:SI), а
регистр EDI- адрес назначения в этой операции (полный адрес ES:EDI).

Регистры управления - CR0, CR1, CR2, CR3. Эти 32-х битные


регистры устанавливают режим работы процессора (нормальный,
защищенный и т.д.), постраничное распределение памяти и т.д. Они
доступны только для программ в первом кольце памяти (Kernel,
например). Трогать их не следует.
Регистры дебаггера - DR0, DR1, DR2, DR3, DR4, DR5, DR6, DR7.
Первые четыре регистра содержат адреса на точки прерывания, остальные
устанавливают, что должно произойти при достижении точки прерывания.
Контрольные регистры - TR6, TR7. Используются для контроля
постраничной системы распределения памяти операционной системой.
Нужны только если вы собираетесь написать свою ОС.
Структура Центрального Процессора
Отладка 16, 32-битных программ:

Пример 16-битной программы:


INCLUDE Irvine16.inc

.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

.CODE  ; директива указывает начало сегмента кода

main PROC ;обьявляется процедура с именем main

mov ax,@data ;загрузка регистров сегментов данных ds и


mov ds,ax ;es адресом первого байта данных -@data
mov es,ax

mov ah,00h ;установка графического видеорежима 640x480,


;text 80x30
mov al,12h
; BIOS services
int 10h

mov ax,0600h ; scroll window


mov bh,00000001 ; attribute
mov cx,0506h ; upper-left corner
mov dx,0A40h ; lower-right corner
int 10h ; BIOS services

; write string Vopros


mov al, 1 ; обьявляются параметры для вывода строки со
mov bh, 0 ;смещением (offset) Vopros
mov bl, 10011110b
mov cx, sizeof Vopros
mov dl, 10
mov dh, 7
mov bp, offset Vopros ; 13h – код функции вывода строки
mov ah, 13h ; BIOS services
int 10h

er: mov ah,0 ; get keystroke from keyboard


Int 16h ; BIOS services

cmp al,'y' ; сравнение содержимого регистра al


jz IsDad ; с ASCII кодом ‚y’, сравнение - вычитанием
cmp al,'n' ;условие перехода ZF=1
jz IsNud

mov bp, offset err ; обьявляются параметры для вывода строки с


mov cx, sizeof err ;offset err
mov dh, 10
mov al, 1
mov bl, 010011100b
mov ah, 13h ; 13h – код функции вывода строки
int 10h ; BIOS services

jmp er ; безусловный переход на метку er

IsDad: mov bp, offset da ; обьявляются параметры для вывода строки с


mov cx, sizeof da ;offset da
mov dh, 12
mov al, 1
mov bl, 10011110b

jmp Disp ; безусловный переход на метку Disp

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

mov ah,0 ; get keystroke from keyboard


Int 16h ; BIOS services

Exit ; вызов процедуры выхода из программы из


;файла Irvine16.inc
main ENDP ; завершение процедуры main
END main ; завершение программы/ точка входа в программу

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
осуществляется следующим образом:

MOV AH, номер_функции ; указывается номер функции


INT номер_прерывания ; указывается номер прерывания
В программе применены несколько прерываний и функций
BIOS:
1) AH=00h - SET VIDEO MODE
AL=12h - установка графического видеорежима 640x480, text 80x30;
INT 10h - BIOS Services
2) SCROLL UP WINDOW
AH = 06h
AL = number of lines by which to scroll up (00h = clear entire window)
BH = attribute used to write blank lines at bottom of window
CH,CL = row,column of window's upper left corner
DH,DL = row,column of window's lower right corner
INT 10h - BIOS Services
3) WRITE STRING
AH = 13h
AL = write mode
bit 0 - Update cursor after writing
bit 1 - String contains alternating characters and attributes
bits 2-7 - Reserved (0).
BH = page number.
BL = attribute if string contains only characters.
CX = number of characters in string.
DH,DL = row,column at which to start writing.
ES:BP - string to write
INT 10h - BIOS Services
Листинг 16-битной программы:
INCLUDE Irvine16.inc
C ; Irvine16.inc - Include file for programs using
C ; the Irvine16.lib (Real-address mode library).
C
C ; Last update: 7/29/05
C
C .NOLIST
C .LIST
C
0000 .DATA
0000 4A 65 6C 61 65 73 Vopros byte "Jelaesi stati programistom?-
[y/n]",0
69 20 73 74 61 74
69 20 70 72 6F 67
72 61 6D 69 73 74
6F 6D 3F 2D 5B 79
2F 6E 5D 00
0022 53 74 61 6E 65 73 Da DB 'Stanesi !',10,13,0
69 20 21 0A 0D 00
002E 53 74 61 6E 65 73 Net DB 'Stanesi filosofom!',0ah,0dh,0
69 20 66 69 6C 6F
73 6F 66 6F 6D 21
0A 0D 00
0043 4A 6D 69 20 70 72 Err BYTE "Jmi pravilino clavisu !",7,0
61 76 69 6C 69 6E
6F 20 63 6C 61 76
69 73 75 20 21 07
00
0000 .CODE
0000 main PROC
0000 B8 ---- R mov ax,@data
0003 8E D8 mov ds,ax
0005 8E C0 mov es,ax
0007 B4 00 mov ah,00h
0009 B0 12 mov al,12h
000B CD 10 int 10h
000D B8 0600 mov ax,0600h
0010 B7 01 mov bh,00000001
0012 B9 0506 mov cx,0506h
0015 BA 0A40 mov dx,0A40h
0018 CD 10 int 10h
; write string Vopros
001A B0 01 mov al, 1
001C B7 00 mov bh, 0
001E B3 9E mov bl, 10011110b
0020 B9 0022 mov cx, sizeof Vopros
0023 B2 0A mov dl, 10
0025 B6 07 mov dh, 7
0027 BD 0000 R mov bp, offset Vopros
002A B4 13 mov ah, 13h
002C CD 10 int 10h
002E B4 00 er: mov ah,0
0030 CD 16 Int 16h
0032 3C 79 cmp al,'y'
0034 74 16 jz IsDad
0036 3C 6E cmp al,'n'
0038 74 20 jz IsNud
003A BD 0043 R mov bp, offset err
003D B9 0019 mov cx, sizeof err
0040 B6 0A mov dh, 10
0042 B0 01 mov al, 1
0044 B3 9C mov bl, 010011100b
0046 B4 13 mov ah, 13h
0048 CD 10 int 10h
004A EB E2 jmp er
004C BD 0022 R IsDad: mov bp, offset da
004F B9 000C mov cx, sizeof da
0052 B6 0C mov dh, 12
0054 B0 01 mov al, 1
0056 B3 9E mov bl, 10011110b
0058 EB 0C jmp Disp
005A BD 002E R IsNud: mov bp, offset Net
005D B9 0015 mov cx, sizeof net
0060 B6 0E mov dh, 14
0062 B0 01 mov al, 1
0064 B3 9C mov bl, 010011100b
0066 Disp:
0066 B4 13 mov ah, 13h
0068 CD 10 int 10h
006A B4 00 mov ah,0
006C CD 16 Int 16h
Exit
0072 main ENDP
END main
Запуск 32 - битной программы:
INCLUDE Irvine32.inc
.data
Vopros byte "Jelaesi stati programistom?-[y/n]",0
Da DB 10,13,'Stanesi !',10,13,0
Net DB 10,13,'Stanesi filosofom!',0ah,0dh,0
Err BYTE 10,13,"Jmi pravilino clavisu !",7,0
.code
main PROC
mov edx,OFFSET Vopros
call WriteString
er:
call ReadChar
cmp al,'y'
jz IsDad
cmp al,'n'
jz IsNud
mov edx,OFFSET Err
call WriteString
jmp er
IsDad: mov edx,OFFSET Da
call WriteString
jmp ex
IsNud: mov edx,OFFSET Net
call WriteString
ex:
exit
main ENDP
END main
Пошаговая отладка 32-х битной программы:
Листинг 32-х битной программы:
INCLUDE Irvine32.inc
C ; Include file for Irvine32.lib (Irvine32.inc)
C
C ;OPTION CASEMAP:NONE ; optional: make
identifiers case-sensitive
C
C INCLUDE SmallWin.inc ; MS-Windows
prototypes, structures, and constants
C .NOLIST
C .LIST
C
C INCLUDE VirtualKeys.inc
C ; VirtualKeys.inc
C .NOLIST
C .LIST
C
C
C .NOLIST
C .LIST
C
00000000 .data
00000000 4A 65 6C 61 65 Vopros byte "Jelaesi stati programistom?-
[y/n]",0
73 69 20 73 74
61 74 69 20 70
72 6F 67 72 61
6D 69 73 74 6F
6D 3F 2D 5B 79
2F 6E 5D 00
00000022 0A 0D 53 74 61 Da DB 10,13,'Stanesi !',10,13,0
6E 65 73 69 20
21 0A 0D 00
00000030 0A 0D 53 74 61 Net DB 10,13,'Stanesi filosofom!',0ah,0dh,0
6E 65 73 69 20
66 69 6C 6F 73
6F 66 6F 6D 21
0A 0D 00
00000047 0A 0D 4A 6D 69 Err BYTE 10,13,"Jmi pravilino clavisu !",7,0
20 70 72 61 76
69 6C 69 6E 6F
20 63 6C 61 76
69 73 75 20 21
07 00
00000000 .code
00000000 main PROC

00000000 BA 00000000 R mov edx,OFFSET Vopros


00000005 E8 00000000 E call WriteString

0000000A er:
0000000A E8 00000000 E call ReadChar

0000000F 3C 79 cmp al,'y'


00000011 74 10 jz IsDad
00000013 3C 6E cmp al,'n'
00000015 74 18 jz IsNud
00000017 BA 00000047 R mov edx,OFFSET Err
0000001C E8 00000000 E call WriteString
00000021 EB E7 jmp er

00000023 BA 00000022 R IsDad: mov edx,OFFSET Da


00000028 E8 00000000 E call WriteString
0000002D EB 0A jmp ex
0000002F BA 00000030 R IsNud: mov edx,OFFSET Net
00000034 E8 00000000 E call WriteString

00000039 ex:
exit
00000039 6A 00 * push +000000000h
0000003B E8 00000000 E * call ExitProcess
00000040 main ENDP
END main

Пример 64 - битной программы:


ExitProcess proto

.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-х битной программы:

Листинг 64 - битной программы:


Вывод: В данной лабораторной работе были запущены 16, 32 и 64-
битные программы в среде Visual Studio и DOSBox (для 16-ти битной
программы). Была запущена пошаговая отладка каждой из программ и
выведены листинги.