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

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

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


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

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

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

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

Кишинев 2021
Цель работы: Основные типы данных микропроцессора, системы
счисления, перевод чисел в различные системы счисления, директивы
резервирования данных, директивы сегментации.

Задания к лабораторной работе:


1. Произвести ассемблирование, исполните в пошаговом режиме Debug и
прокомментируйте программу:
2. Вычислить арифметическое выражение: e=((a+b*c-d)/f+g*h)/i.
Произвести ассемблирование и исполнить в пошаговом режиме в
Debug.
3.Вычислить арифметическое выражение: z=(a+b+c+1) *(a+b+c+1) /((a-
b+d)*(a-b+d))

Арифметические команды и команды пересылки данных:

Инструкция MOV в ассемблере самая простая. Синтаксис этой


команды такой: MOV ПРИЁМНИК, ИСТОЧНИК.

С помощью этой команды можно переместить значение из


ИСТОЧНИКА в ПРИЁМНИК. То есть по сути команда MOV копирует
содержимое ИСТОЧНИКА и помещает это содержимое в ПРИЁМНИК.
Никакие флаги при этом НЕ изменяются. При использовании этой команды
следует учитывать, что имеются некоторые ограничения. А именно,
инструкция MOV не может:

· Записывать данные в регистры CS и IP.

· Копировать данные из одного сегментного регистра в другой


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

· Копировать непосредственное значение в сегментный регистр


(сначала нужно скопировать данные в регистр общего назначения).

ИСТОЧНИКОМ может быть один из следующих:

· Область памяти (MEM)

· Регистр общего назначения (REG)

· Непосредственное значение (например, число) (IMM)

· Сегментный регистр (SREG)


ПРИЁМНИКОМ может быть один из следующих:

· Область памяти (MEM)

· Регистр общего назначения (REG)

· Сегментный регистр (SREG)

Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды


делают вычисления. Их можно узнать многие из них по их названиям: add
(addition - добавление), sub (substraction - вычитание), mul (multiply -
умножение), div (divide - деление).

Опкод add имеет следующий синтаксис:

add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемник источник пример

регистр регистр add ecx, edx

регистр память add ecx, dword ptr [104h] / add ecx, [edx]

регистр значение add eax, 102

память значение add dword ptr [401231h], 80

память регистр add dword ptr [401231h], edx

Эта команда очень проста. Она добавляет значение источника к


значению приемника и помещает результат в приемник. Другие
математические команды:

sub приемник, источник (приемник = приемник - источник)

mul множимое, множитель (множимое = множимое * множитель)

div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения


(то есть числа, не, с плавающей запятой), результат деления разбит на
частное и остаток. Теперь, в зависимости от размера источника, частное
сохраняется в eax, а остаток в edx:
размер источника деление частное в... остаток в...

BYTE (8-bits) ax / делитель AL AH

WORD (16-bits) dx:ax* / делитель AX DX

DWORD (32-bits) edx:eax* / делитель EAX EDX

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax


- значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax -
значение quadword (64 бита), где старшее dword в edx и младшее в eax.

Источник операции деления может быть:

1. 8-бит регистр (al, ah, cl,...)

2. 16-бит регистр (ax, dx, ...)

3. 32-бит регистр (eax, edx, ecx...)

4. 8-бит значение из памяти (byte ptr [xxxx])

5. 16-бит значение из памяти (word ptr [xxxx])

6. a 32-бит значение памяти (dword ptr [xxxx])

Источник не может быть непосредственным значением, потому что


тогда процессор не сможет определить размер исходного операнда.

Увеличение/Уменьшение - INC/DEC. Есть 2 очень простые команды,


DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти
или регистра на единицу. Просто поместите:

inc регистр ; регистр = регистр + 1

dec регистр ; регистр = регистр - 1

inc dword ptr [103405] ; значение в [103405] будет увеличено на 1.

dec dword ptr [103405] ; значение в [103405] будет уменьшено на 1.

Исходный код:
Задание 1:
INCLUDE Irvine32.inc
.data
alfa WORD 3 DUP(?)
.code
main proc
mov ax,17
mov ax,10101b
mov ax,11b
mov ax,21o
mov ebx,offset alfa
mov alfa,ax
mov cx,ax ; obmen soderjimogo registrov ax i bx
mov ax,bx ; ispolzuia cx
mov ax,cx
xchg ax,bx
mov si,2
mov alfa[si],ax
mov ebx,offset alfa
lea ebx,alfa
mov esi,2
mov cx,[ebx][esi]
mov cx,alfa[2]
mov cx,[alfa+2]
mov edi,4
mov byte ptr [ebx][edi],55h
mov esi,2
mov ebx,3
mov alfa[ebx][esi],33h
mov alfa[ebx+esi],33h
mov [alfa+ebx+esi],33h
mov [ebx][esi]+alfa,33h
exit
main ENDP
END main

Задание 2:
INCLUDE Irvine32.inc

; vicisliti arifmeticeskoe virajenie: e=((a+b*c-d)/f+g*h)/i


; razreadnosti a, d, f – slovo b, c, g, h, i –byte
; для деления на f необходимо расширить делимое до двойного слова
; использовать только частное, разрядность результата-байт

.data
a dw 5
b db 6
cd db 10
d dw 5
f dw 6
g db 10
h db 11
i db 10
interm dw ?
rez db ?
.code
main proc
mov eax,0
mov al, b
imul cd ; в ax coхранится результат b*c
add ax, a ; ax=b*c+a
sub ax, d ; ax=b*c+a-d
cwd ; расширили слово из ax, в двойное слово в dx:ax
idiv f ; частное в ax и остаток в dx, ax=(a+b*c-d)/f
mov interm, ax ; interm=(a+b*c-d)/f
mov al, g
imul h ; ax=g*h
add ax, interm ; ax=(a+b*c-d)/f+g*h
idiv i ; частное в al и остаток в ah
mov rez, al

exit
main ENDP
END main

Задание 3:
INCLUDE Irvine32.inc
; вычислить арифмитическое выражение: z=(a+b+c+1) *(a+b+c+1) /((a-b+d)*(a-b+d))
; разрядность a, d, f – slovo b, c, g, h, i –byte
; для деления на f необходимо расширить делимое до двойного слова
; использовать только частное, разрядность результата-байт
.data
a dw 7
b db 6
cd db 10
d dw 5
interm dw ?
rez db ?
.code
main proc
mov eax,0 ;eax=0
mov ax, a ;ax=a
add al,b ;ax=a+b
add al,cd ;ax=a+b+c
add al,1 ;ax=a+b+c+1
imul ax ;(a+b+c+1) *(a+b+c+1)
mov interm,ax
mov eax,0
mov ax,a
sub al,b
add ax,d
imul ax
cwd
mov ebx,eax
mov ax,interm
idiv bx
mov rez, al

call WriteInt
exit
main ENDP
END main

Листинги программ:
Задание 1:
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 00000003 [ alfa WORD 3 DUP(?)
0000
]
00000000 .code
00000000 main proc
00000000 66| B8 0011 mov ax,17
00000004 66| B8 0015 mov ax,10101b
00000008 66| B8 0003 mov ax,11b
0000000C 66| B8 0011 mov ax,21o
00000010 BB 00000000 R mov ebx,offset alfa
00000015 66| A3 mov alfa,ax
00000000 R
0000001B 66| 8B C8 mov cx,ax ; obmen soderjimogo registrov ax i bx
0000001E 66| 8B C3 mov ax,bx ; ispolzuia cx
00000021 66| 8B C1 mov ax,cx
00000024 66| 93 xchg ax,bx
00000026 66| BE 0002 mov si,2
0000002A 66| 89 04 35 mov alfa[si],ax
00000000 R
00000032 BB 00000000 R mov ebx,offset alfa
00000037 8D 1D 00000000 R lea ebx,alfa
0000003D BE 00000002 mov esi,2
00000042 66| 8B 0C 33 mov cx,[ebx][esi]
00000046 66| 8B 0D mov cx,alfa[2]
00000002 R
0000004D 66| 8B 0D mov cx,[alfa+2]
00000002 R
00000054 BF 00000004 mov edi,4
00000059 C6 04 3B 55 mov byte ptr [ebx][edi],55h
0000005D BE 00000002 mov esi,2
00000062 BB 00000003 mov ebx,3
00000067 66| C7 84 33 mov alfa[ebx][esi],33h
00000000 R
0033
00000071 66| C7 84 33 mov alfa[ebx+esi],33h
00000000 R
0033
0000007B 66| C7 84 33 mov [alfa+ebx+esi],33h
00000000 R
0033
00000085 66| C7 84 33 mov [ebx][esi]+alfa,33h
00000000 R
0033
exit
0000008F 6A 00 * push +000000000h
00000091 E8 00000000 E * call ExitProcess
00000096 main ENDP
END main

Задание 2:
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

; vicisliti arifmeticeskoe virajenie: e=((a+b*c-d)/f+g*h)/i


; razreadnosti a, d, f – slovo b, c, g, h, i –byte
; для деления на f необходимо расширить делимое до двойного слова
; использовать только частное, разрядность результата-байт

00000000 .data
00000000 0005 a dw 5
00000002 06 b db 6
00000003 0A cd db 10
00000004 0005 d dw 5
00000006 0006 f dw 6
00000008 0A g db 10
00000009 0B h db 11
0000000A 0A i db 10
0000000B 0000 interm dw ?
0000000D 00 rez db ?
00000000 .code
00000000 main proc
00000000 B8 00000000 mov eax,0
00000005 A0 00000002 R mov al, b
0000000A F6 2D 00000003 R imul cd ; в ax coхранится результат b*c
00000010 66| 03 05 add ax, a ; ax=b*c+a
00000000 R
00000017 66| 2B 05 sub ax, d ; ax=b*c+a-d
00000004 R
0000001E 66| 99 cwd ; расширили слово из ax, в двойное слово в
dx:ax
00000020 66| F7 3D idiv f ; частное в ax и остаток в dx,
ax=(a+b*c-d)/f
00000006 R
00000027 66| A3 mov interm, ax ; interm=(a+b*c-d)/f
0000000B R
0000002D A0 00000008 R mov al, g
00000032 F6 2D 00000009 R imul h ; ax=g*h
00000038 66| 03 05 add ax, interm ; ax=(a+b*c-d)/f+g*h
0000000B R
0000003F F6 3D 0000000A R idiv i ; частное в al и остаток в ah
00000045 A2 0000000D R mov rez, al

exit
0000004A 6A 00 * push +000000000h
0000004C E8 00000000 E * call ExitProcess
00000051 main ENDP
END main

Задание 3:
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
; vicisliti arifmeticeskoe virajenie: z=(a+b+c+1) *(a+b+c+1) /((a-
b+d)*(a-b+d))
; razreadnosti a, d, f – slovo b, c, g, h, i –byte
; для деления на f необходимо расширить делимое до
двойного слова
; использовать только частное, разрядность результата-байт

00000000 .data
00000000 0007 a dw 7
00000002 06 b db 6
00000003 0A cd db 10
00000004 0005 d dw 5
00000006 0000 interm dw ?
00000008 00 rez db ?

00000000 .code
00000000 main proc
00000000 B8 00000000 mov eax,0 ;eax=0
00000005 66| A1 mov ax, a ;ax=a
00000000 R
0000000B 02 05 00000002 R add al,b ;ax=a+b
00000011 02 05 00000003 R add al,cd ;ax=a+b+c
00000017 04 01 add al,1 ;ax=a+b+c+1
00000019 66| F7 E8 imul ax ;(a+b+c+1) *(a+b+c+1)
0000001C 66| A3 mov interm,ax
00000006 R
00000022 B8 00000000 mov eax,0
00000027 66| A1 mov ax,a
00000000 R
0000002D 2A 05 00000002 R sub al,b
00000033 66| 03 05 add ax,d
00000004 R
0000003A 66| F7 E8 imul ax
0000003D 66| 99 cwd
0000003F 8B D8 mov ebx,eax
00000041 66| A1 mov ax,interm
00000006 R
00000047 66| F7 FB idiv bx
0000004A A2 00000008 R mov rez, al

exit
0000004F 6A 00 * push +000000000h
00000051 E8 00000000 E * call ExitProcess
00000056 main ENDP
END main
Скриншоты режима debug для задания №1

Скриншоты режима debug для задания №2


Вывод: В лабораторной работе №2 были запущены 16, 32 и 64 -
битные программы в среде Visual Studio и DOSBox (для 16 - битной
программы). Была запущена пошаговая отладка каждой из программ и
выведены листинги. Также я ознакомилась с арифметическими командами
(ADD, SUB, MUL, IMUL, DIV, IDIV, DEC, INC) и командами пересылки
данных(MOV).