29 0 85KB
Raport Arhitectura Calculatoarelor Lucrarea de Laborator NR.4 Tema:,, SUBPROGRAME ȘI MACROINSTRUCȚIUNI ’’
Elaborat: Cerlat Pavel FAF-192 Controlat: Postovan Dumitru
Condiție: Programul următor adaugă două numere reprezentate ca două secvențe de caractere ASCII. INCLUDE Irvine32.inc
.DATA asc1
DB
'7','5','2','1','3'; 31257
asc2
DB
'6','1','9','9','5'; 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
Listing: 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 37 35 32 31 33
asc1
DB
'7','5','2','1','3'; 31257
00000005 36 31 39 39 35
asc2
DB
'6','1','9','9','5'; 59916
= 00000005
l
EQU
00000000
.CODE
00000000
main PROC
sizeof asc1
00000000 8D 35 00000000 R
lea
esi,asc1
00000006 8D 3D 00000005 R
lea
edi,asc2
0000000C B9 00000005 00000011 F8
mov
ecx,l
clc
00000012
cycle:
00000012 8A 06
mov
00000014 12 07
adc
00000016 37
al,[esi] al,[edi]
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 * 00000024
call ExitProcess
main ENDP
END main
Condiție: Programul următor efectuează o căutare secvențială pentru primul spațiu din secvența ASCII a poziției. Dacă în EAX nu se găsește spațiu, se scrie -1 și dacă se găsește, se scrie numărul de poziție a spațiului din secvență. Secvența pos are litere de caractere.
INCLUDE Irvine32.inc
.data pos DB 'This_is_a_sequence!' l EQU sizeof pos
.code main proc
mov ecx,l mov esi,0 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,-1 vihod: nop
exit main ENDP END main
Listing: 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 C .NOLIST C .LIST C C INCLUDE VirtualKeys.inc C ; VirtualKeys.inc
; MS-Windows prototypes, structures, and constants
C .NOLIST C .LIST C C C .NOLIST C .LIST C
00000000
.data
00000000 54 68 69 73 5F
pos DB 'This_is_a_sequence!'
69 73 5F 61 5F 73 65 71 75 65 6E 63 65 21 = 00000013
l EQU sizeof pos
00000000
.code
00000000
main proc
00000000 B9 00000013
mov ecx,l
00000005 BE 00000000
mov esi,0
0000000A B0 20 0000000C 0000000C 46
mov al,' ' 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 00000013
mov eax,l
0000001C 2B C1
sub eax,ecx
0000001E EB 05
jmp vihod
00000020 B8 FFFFFFFF 00000025 90
ne_naiden: mov eax,-1
vihod: nop
exit 00000026 6A 00
*
push +000000000h
00000028 E8 00000000 E * 0000002D
call ExitProcess
main ENDP
END main
Varianta 8: De la tastatură se introduce o secvență de 10 caractere, se scrie un program care afișează 20 de linii de 75 de caractere pe fiecare linie care conține secvența introdusă. INCLUDE Irvine32.inc
print MACRO mov ecx,20 loopOuter: push ecx mov ecx,75 mov edx,0 loopInner: mov al,string[edx] call WriteChar inc edx cmp edx,10 jnz ifend mov edx,0 ifend: loop loopInner
call Crlf pop ecx loop loopOuter; ENDM .data string db 10 DUP(?) msg db "Symbol ",0 colon db ':' .code main PROC mov ecx,10 loop1: mov edx, OFFSET msg call WriteString mov eax,11 sub eax,ecx call WriteDec mov al,colon call WriteChar call ReadChar call WriteChar mov edx,10 sub edx,ecx mov string[edx],al call Crlf loop loop1; print exit
main ENDP END main
Listing: 00000000
.data
00000000 0000000A [
string db 10 DUP(?)
00 ] 0000000A 53 79 6D 62 6F
msg db "Symbol ",0
6C 20 00 00000012 3A
colon db ':'
00000000
.code
00000000
main PROC
00000000 B9 0000000A 00000005
mov ecx,10
loop1:
00000005 BA 0000000A R
mov edx, OFFSET msg
0000000A E8 00000000 E
call WriteString
0000000F B8 0000000B
mov eax,11
00000014 2B C1
sub eax,ecx
00000016 E8 00000000 E
call WriteDec
0000001B A0 00000012 R
mov al,colon
00000020 E8 00000000 E
call WriteChar
00000025 E8 00000000 E
call ReadChar
0000002A E8 00000000 E
call WriteChar
0000002F BA 0000000A
mov edx,10
00000034 2B D1
sub edx,ecx
00000036 88 82 00000000 R
mov string[edx],al
0000003C E8 00000000 E 00000041 E2 C2
call Crlf
loop loop1;
print 00000043 B9 00000014 00000048
1
00000048 51
1
mov ecx,20
loopOuter: 1
push ecx
00000049 B9 0000004B
1
mov ecx,75
0000004E BA 00000000
1
mov edx,0
00000053
1
loopInner:
00000053 8A 82 00000000 R 1 00000059 E8 00000000 E 0000005E 42
1
1
0000005F 83 FA 0A 00000062 75 05
1
cmp edx,10 jnz ifend
00000064 BA 00000000 1
00000069 E2 E8
call WriteChar inc edx
1
00000069
mov al,string[edx]
1
mov edx,0
ifend: 1
loop loopInner
0000006B E8 00000000 E
1
00000070 59
pop ecx
1
00000071 E2 D5
1
call Crlf
loop loopOuter;
exit 00000073 6A 00
*
push +000000000h
00000075 E8 00000000 E * 0000007A
call ExitProcess
main ENDP
END main
Concluzie: Codul scris a arătat cât de multe limbi de nivel înalt simplifică procesul de dezvoltare a aplicației, deși limbile la nivel înalt sunt compilate în codul mașinii și efectuează aceeași lucrare, deși procedurile și procedurile macro pot reduce codul.