Opracowali:
Jakub Kleszcz, Maciej Kołodyński
10.11.2015
SPRAWOZDANIE
Temat: Podprogramy, procedury - obsługa stosu i banków rejestrów.
KOD PROGRAMU Z KOMENTARZAMI
MOV SP, #20H ;ustawienie wierchołka stosu 20H
LJMP START
ORG 100H
START:
MOV A, #30H
MOV DPTR, #40H
MOV 50H, #4H
MOV 51H,#5H
CALL TEST ; wywolanie procedury TEST
LJMP KONIEC
ORG 200H ;poczatek procedury
TEST:
PUSH 50H ;wkladamy na stos kolejne elementy
PUSH 51H
PUSH DPL
PUSH DPH
PUSH B
PUSH PSW
POP PSW
POP B ; zdejmujemy wszystko w kolejnosci odwrotnej
POP DPH
POP DPL
POP 51H
POP 50H
CLR RS1 ;ustawiamy takie wartosci zeby dostac sie do BANK1
SETB RS0
MOV R1, 50H ;w BANK0 wpisujemy wartości do odpowiednich rejestrów
MOV R2, 51H
MOV A,R1
CPL A ; neguje wartość wpisaną w A
MOV R3,A ;wpisuje wartość którą przed chwilą zanegowaliśmy do R3
MOV A, R2
CPL A
MOV R4,A
SETB RS1 ;zmieniamy bank na BANK2
CLR RS0
MOV A,50H
MOV B, 51H
MUL AB ;mnoży wartości wpisane w A i B
MOV R1,A
MOV R2,B
CLR RS1 ;powracamy do BANK0
CLR RS0
RET ; zakończenie procedury i powrót do miejsca jej wykonania
KONIEC:
LJMP KONIEC
END
LISTING PROGRAMU
ASEM-51 V1.3 Copyright (c) 2002 by W.W. Heinz PAGE 1
MCS-51 Family Macro Assembler A S E M - 5 1 V 1.3
=====================================================
Source File: C:\Users\kokodyn\Desktop\Mikro\LAB 4\PROGRAM.asm
Object File: C:\Users\kokodyn\Desktop\Mikro\LAB 4\PROGRAM.hex
List File: C:\Users\kokodyn\Desktop\Mikro\LAB 4\PROGRAM.lst
Line I Addr Code Source
1: 0000 75 81 20 MOV SP, #20H
2: 0003 02 01 00 LJMP START
3: N 0100 ORG 100H
4: 0100 START:
5: 0100 74 30 MOV A, #30H
6: 0102 90 00 40 MOV DPTR, #40H
7: 0105 75 50 04 MOV 50H, #4H
8: 0108 75 51 05 MOV 51H,#5H
9: 010B 12 02 00 CALL TEST
10: 010E 02 02 38 LJMP KONIEC
11: N 0200 ORG 200H
12: 0200 TEST:
13: 0200 C0 50 PUSH 50H
14: 0202 C0 51 PUSH 51H
15: 0204 C0 82 PUSH DPL
16: 0206 C0 83 PUSH DPH
17: 0208 C0 F0 PUSH B
18: 020A C0 D0 PUSH PSW
19: 020C D0 D0 POP PSW
20: 020E D0 F0 POP B
21: 0210 D0 83 POP DPH
22: 0212 D0 82 POP DPL
23: 0214 D0 51 POP 51H
24: 0216 D0 50 POP 50H
25: 0218 C2 D4 CLR RS1
26: 021A D2 D3 SETB RS0
27: 021C A9 50 MOV R1, 50H
28: 021E AA 51 MOV R2, 51H
29: 0220 E9 MOV A,R1
30: 0221 F4 CPL A
31: 0222 FB MOV R3,A
32: 0223 EA MOV A, R2
33: 0224 F4 CPL A
34: 0225 FC MOV R4,A
35: 0226 D2 D4 SETB RS1
36: 0228 C2 D3 CLR RS0
37: 022A E5 50 MOV A,50H
38: 022C 85 51 F0 MOV B, 51H
39: 022F A4 MUL AB
40: 0230 F9 MOV R1,A
41: 0231 AA F0 MOV R2,B
42: 0233 C2 D4 CLR RS1
43: 0235 C2 D3 CLR RS0
ASEM-51 V1.3 Copyright (c) 2002 by W.W. Heinz PAGE 2
Line I Addr Code Source
44:
45: 0237 22 RET
46: 0238 KONIEC:
47: 0238 02 02 38 LJMP KONIEC
48: END
register banks used: ---
no errors
ASEM-51 V1.3 Copyright (c) 2002 by W.W. Heinz PAGE 3
L I S T O F S Y M B O L S
=============================
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
??ASEM_51 NUMBER 8051
??VERSION NUMBER 0130
AC BIT D6
ACC DATA E0
B DATA F0
CY BIT D7
DPH DATA 83
DPL DATA 82
EA BIT AF
ES BIT AC
ET0 BIT A9
ET1 BIT AB
EX0 BIT A8
EX1 BIT AA
EXTI0 CODE 0003
EXTI1 CODE 0013
F0 BIT D5
IE DATA A8
IE0 BIT 89
IE1 BIT 8B
INT0 BIT B2
INT1 BIT B3
IP DATA B8
IT0 BIT 88
IT1 BIT 8A
KONIEC CODE 0238 46
OV BIT D2
P BIT D0
P0 DATA 80
P1 DATA 90
P2 DATA A0
P3 DATA B0
PCON DATA 87
PS BIT BC
PSW DATA D0
PT0 BIT B9
PT1 BIT BB
PX0 BIT B8
PX1 BIT BA
RB8 BIT 9A
RD BIT B7
REN BIT 9C
RESET CODE 0000
RI BIT 98
RS0 BIT D3
RS1 BIT D4
RXD BIT B0
SBUF DATA 99
SCON DATA 98
SINT CODE 0023
ASEM-51 V1.3 Copyright (c) 2002 by W.W. Heinz PAGE 4
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
SM0 BIT 9F
SM1 BIT 9E
SM2 BIT 9D
SP DATA 81
START CODE 0100 4
T0 BIT B4
T1 BIT B5
TB8 BIT 9B
TCON DATA 88
TEST CODE 0200 12
TF0 BIT 8D
TF1 BIT 8F
TH0 DATA 8C
TH1 DATA 8D
TI BIT 99
TIMER0 CODE 000B
TIMER1 CODE 001B
TL0 DATA 8A
TL1 DATA 8B
TMOD DATA 89
TR0 BIT 8C
TR1 BIT 8E
TXD BIT B1
WR BIT B6
Lp | Rozkaz | Wartość SP | Wartość PC | Zawartość stosu (wszystkie bajty) | Opis |
---|---|---|---|---|---|
1 | CALL | 20H | 0100H | SP przyjmuje wartość 20H, ponieważ taką właśnie przydzieliliśmy za pomocą komendy MOV SP,#20H PC przyjmuje wartość 100H, ponieważ taki przydzieliliśmy adres (ORG 100H) |
|
2 | Pierwszy rozkaz procedury | 22H | 0200H | 0EH, 01H | wywołanie procedury (CALL) spowodowało zapisanie na stosie dwóch bajtów, które są adresem komendy, która następuje po funkcji CALL, czyli po skończeniu procedury - dlatego SP ma 22H PC przyjmuje 200H, bo taki przydzieliliśmy adres (ORG 200H) |
3 | RET | 22H | 0237H | 0EH, 01H,04H,05H,40H | Funkcja PUSH i POP została użyta tyle samo razy. Tyle wartości ile włożyliśmy na stos, tyle samo zdjęliśmy - dlatego SP przyjmuje wartość taką jak na początku (22H) Procedura kończy się pod adresem 0237H |
4 | Pierwszy rozkaz programu głównego po CALL | 20H | 010EH | 20H ponieważ funkcja RET wyciągnęła ze stosu 2 bajty |
TABELA