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

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

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


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

ОТЧЕТ
по лабораторной работе №4
по дисциплине «Arhitectura calculatoarelor»
Тема: «Процедуры и макросы»

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

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

Кишинев 2021
Цель работы:
Работа рассматривает процедуры и макрокоманды, команды сдвига,
логические команды и несколько примеров их применения.
Задание:
Данные вводить с клавиатуры, а результаты вывести на экран.
Напишите программу, которая умножит два шестнадцатеричных
числа, разрядностью 64 бита dp1 и dp2 (по примеру 10).
ExitProcess proto
WriteString proto
WriteHex64 proto
Crlf proto
ReadInt64 proto

multipl macro qp1,qp2


mov rax,qp1
imul qp2
endm

.data
qp1 qword ?
qp2 qword ?

var1 byte "X=",0


var2 byte "Y=",0
var3 byte " X * Y=",0

.code
main proc
mov rdx,offset var1
call WriteString
call ReadInt64
mov qp1,rax
call WriteHex64
call Crlf

mov rdx,offset var2


call WriteString
call ReadInt64
mov qp2,rax
call WriteHex64
call Crlf
mov rdx,offset var3
call WriteString
multipl qp1,qp2
mov rez,rax
mov rax,rez
call WriteHex64
mov rax,rez
call WriteHex64
call Crlf

mov ah,01h
int 16h
mov ecx,0
call ExitProcess
main endp
end
Результат программы:

Листинг программы:
ExitProcess proto
WriteString proto
WriteHex64 proto
Crlf proto
ReadInt64 proto

multipl macro qp1,qp2


mov rax,qp1
imul qp2
endm

00000000 .data
00000000 qp1 qword ?
0000000000000000
00000008 qp2 qword ?
0000000000000000
00000010 58 3D 00 var1 byte "X=",0
00000013 59 3D 00 var2 byte "Y=",0
00000016 20 58 20 2A 20 var3 byte " X * Y=",0
59 3D 00

00000000 .code
00000000 main proc
00000000 48/ BA mov rdx,offset var1
0000000000000010 R
0000000A E8 00000000 E call WriteString
0000000F E8 00000000 E call ReadInt64
00000014 48/ 89 05 mov qp1,rax
00000000 R
0000001B E8 00000000 E call WriteHex64
00000020 E8 00000000 E call Crlf

00000025 48/ BA mov rdx,offset var2


0000000000000013 R
0000002F E8 00000000 E call WriteString
00000034 E8 00000000 E call ReadInt64
00000039 48/ 89 05 mov qp2,rax
00000008 R
00000040 E8 00000000 E call WriteHex64
00000045 E8 00000000 E call Crlf

0000004A 48/ BA mov rdx,offset var3


0000000000000016 R
00000054 E8 00000000 E call WriteString
multipl qp1,qp2
00000059 48/ 8B 05 1 mov rax,qp1
00000000 R
00000060 48/ F7 2D 1 imul qp2
00000008 R
;mov rez,rax
;mov rax,rez
00000067 E8 00000000 E call WriteHex64
;mov rax,rez
;call WriteHex64
0000006C E8 00000000 E call Crlf

00000071 B4 01 mov ah,01h


00000073 CD 21 int 21h

00000075 B9 00000000 mov ecx,0


0000007A E8 00000000 E call ExitProcess

0000007F main endp


end
Примеры программ:
Пример 1. Следующая программа выполняет
последовательный поиск первого пробела в ASCII
последовательности pos. Если пробел не найден в EAX
записывается 0, а если найден запишется номер позиции
пробела в последовательности. Последовательность pos
имеет l символов.
.data
pos DB ' This is a sequence!'
l EQU sizeof pos

.code
main proc

mov ecx,l
mov esi, 1
mov al,' '
sld: inc esi
cmp al,pos[esi]
loopne sld
jne ne_naiden
mov eax,l
sub eax,ecx
jmp vihod
ne_naiden: mov eax,0
vihod: nop
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 20 54 68 69 73 pos DB ' This is a sequence!'
20 69 73 20 61
20 73 65 71 75
65 6E 63 65 21
= 00000014 l EQU sizeof pos

00000000 .code
00000000 main proc
00000000 B9 00000014 mov ecx,l
00000005 BE 00000001 mov esi, 1
0000000A B0 20 mov al,' '
0000000C 46 sld: inc esi
0000000D 3A 86 00000000 R cmp al,pos[esi]
00000013 E0 F7 loopne sld
00000015 75 09 jne ne_naiden
00000017 B8 00000014 mov eax,l
0000001C 2B C1 sub eax,ecx
0000001E EB 05 jmp vihod
00000020 B8 00000000 ne_naiden: mov eax,0
00000025 90 vihod: nop
exit
00000026 6A 00 * push +000000000h
00000028 E8 00000000 E * call ExitProcess
0000002D main ENDP
END main
Пример 2. Следующая программа выполняет сложение двух
чисел в упакованном BCD формате. Размерность чисел n
байт.
.DATA
bcd1 DB 22h,41h,75h,32h; 32754122
bcd2 DB 31h,27h,53h,62h; 62532731
n EQU lengthof bcd2
.CODE

lea si,bcd1
lea di,bcd2
mov cx,n
clc
cycle: mov al,[si]
adc al,[di]
daa
mov [di],al
inc si
inc di
loop cycle
exit
Листинг примера 2:
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 22 41 75 32 bcd1 DB 22h,41h,75h,32h; 32754122
0004 31 27 53 62 bcd2 DB 31h,27h,53h,62h; 62532731
= 0004 n EQU lengthof bcd2
0000 .code
0000 main PROC
0000 8D 36 0000 R lea si,bcd1
0004 8D 3E 0004 R lea di,bcd2
0008 B9 0004 mov cx,n
000B F8 clc
000C 8A 04 cycle: mov al,[si]
000E 12 05 adc al,[di]
0010 27 daa
0011 88 05 mov [di],al
0013 46 inc si
0014 47 inc di
0015 E2 F5 loop cycle
exit
001B main ENDP
END main

Пример 3. Следующая программа выполняет сложение двух чисел


представленных в виде двух последовательностей ASCII символов.
INCLUDE Irvine32.inc

.DATA
asc1 DB "31257"
asc2 DB "59916"
l EQU sizeof asc1
.CODE
main PROC
lea esi,asc1
lea edi,asc2
mov ecx,l
clc
cycle: mov al,[esi]
adc al,[edi]
aaa
mov [edi],al
inc esi
inc edi
loop cycle
exit

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

00000000 .DATA
00000000 33 31 32 35 37 asc1 DB "31257"
00000005 35 39 39 31 36 asc2 DB "59916"
= 00000005 l EQU sizeof asc1
00000000 .CODE
00000000 main PROC
00000000 8D 35 00000000 R lea esi,asc1
00000006 8D 3D 00000005 R lea edi,asc2
0000000C B9 00000005 mov ecx,l
00000011 F8 clc
00000012 8A 06 cycle: mov al,[esi]
00000014 12 07 adc al,[edi]
00000016 37 aaa
00000017 88 07 mov [edi],al
00000019 46 inc esi
0000001A 47 inc edi
0000001B E2 F5 loop cycle
exit
0000001D 6A 00 * push +000000000h
0000001F E8 00000000 E * call ExitProcess

00000024 main ENDP


END main

Выводы:
После проведения лабораторной работы № 4 мы лучше освоили
разработку и реализацию программ с подпрограммами и макрокомандами,
с разветвлениями и циклами на языке ассемблера. Мы представили
использование структур управления ветвями и петлями. Использовали
инструкции сравнения, перехода и цикла, а также некоторые примеры
использования логических инструкций. В заключение, согласно варианту,
разработали программу, которая включает умножение двух целых чисел в
шестнадцатеричном виде, представленных 64 битами, qp1 и qp2.