Академический Документы
Профессиональный Документы
Культура Документы
ОТЧЕТ
по лабораторной работе №4
по дисциплине «Arhitectura calculatoarelor»
Тема: «Процедуры и макросы»
Кишинев 2021
Цель работы:
Работа рассматривает процедуры и макрокоманды, команды сдвига,
логические команды и несколько примеров их применения.
Задание:
Данные вводить с клавиатуры, а результаты вывести на экран.
Напишите программу, которая умножит два шестнадцатеричных
числа, разрядностью 64 бита dp1 и dp2 (по примеру 10).
ExitProcess proto
WriteString proto
WriteHex64 proto
Crlf proto
ReadInt64 proto
.data
qp1 qword ?
qp2 qword ?
.code
main proc
mov rdx,offset var1
call WriteString
call ReadInt64
mov qp1,rax
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
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
.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
.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
Выводы:
После проведения лабораторной работы № 4 мы лучше освоили
разработку и реализацию программ с подпрограммами и макрокомандами,
с разветвлениями и циклами на языке ассемблера. Мы представили
использование структур управления ветвями и петлями. Использовали
инструкции сравнения, перехода и цикла, а также некоторые примеры
использования логических инструкций. В заключение, согласно варианту,
разработали программу, которая включает умножение двух целых чисел в
шестнадцатеричном виде, представленных 64 битами, qp1 и qp2.