Keil C i stos



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Gissbourne" <gissbourne_at_nospam_poczta.onet.pl>
Subject: Keil C i stos
Date: Mon, 16 Dec 2002 13:47:43 +0100


Napisalem w Keilu taki program:

#include <reg51.h>

unsigned long x;
sbit led=0x97;

void main(void)
{
while(1)
{
led=!led;
for(x=0;x<65000u;x++);
}
}


Poniewaz zle dzialal przeanalizowalem plik lst i hex:

0000 B297 CPL led
; SOURCE LINE # 12
0002 E4 CLR A
0003 F500 R MOV x+03H,A
0005 F500 R MOV x+02H,A
0007 F500 R MOV x+01H,A
0009 F500 R MOV x,A
000B ?C0003:
000B E4 CLR A
000C 7FE8 MOV R7,#0E8H
000E 7EFD MOV R6,#0FDH
0010 FD MOV R5,A
0011 FC MOV R4,A
0012 AB00 R MOV R3,x+03H
0014 AA00 R MOV R2,x+02H
0016 A900 R MOV R1,x+01H
0018 A800 R MOV R0,x
001A C3 CLR C
001B 120000 E LCALL ?C?ULCMP
001E 50E0 JNC ?C0001
0020 E500 R MOV A,x+03H
0022 2401 ADD A,#01H
0024 F500 R MOV x+03H,A
0026 E4 CLR A
0027 3500 R ADDC A,x+02H
0029 F500 R MOV x+02H,A
002B E4 CLR A
002C 3500 R ADDC A,x+01H
002E F500 R MOV x+01H,A
0030 E4 CLR A
0031 3500 R ADDC A,x
0033 F500 R MOV x,A
0035 80D4 SJMP ?C0003
; FUNCTION main (END)

10000300B297E4F50BF50AF509F508E47FE87EFD00
10001300FDFCAB0BAA0AA909A808C312003A50E0D9
10002300E50B2401F50BE4350AF50AE43509F50976
07003300E43508F50880D454
0300000002004BB0
0C004B00787FE4F6D8FD75810B020003FD
10003A00EB9FF5F0EA9E42F0E99D42F0E89C45F01C
01004A002293
00000001FF

i okazalo sie, ze Keil 6.23 umiescil zmienna x w komorkach 08,09,0a,0b a
przedtem nie zainicjowal stosu. W momencie skoku lcall program zamazuje
zmienna (wskaznik stosu po resecie=07) !
Czy robie cos zle czy tak ma byc :) ?

Gissbourne



Poprzedni Następny
Wiadomość
Spis treści
From: "RobertS" <szumu_at_nospam_poczta.onet.pl>
Subject: Re: Keil C i stos
Date: Mon, 16 Dec 2002 13:36:55 -0000


Moim zdaniem stos jest inicjowany w module 'C51STARTUP', ktorego nie widac w
Twoim lisingu, ale powinien byc w pliku hex. Mozna go namierzyc analizujac
log linkera.

Robert

i okazalo sie, ze Keil 6.23 umiescil zmienna x w komorkach 08,09,0a,0b a
przedtem nie zainicjowal stosu. W momencie skoku lcall program zamazuje
zmienna (wskaznik stosu po resecie=07) !
Czy robie cos zle czy tak ma byc :) ?




Poprzedni Następny
Wiadomość
Spis treści
From: "Robert Łopatecki" <rora_at_nospam_poczta.onet.pl>
Subject: Re: Keil C i stos
Date: Mon, 16 Dec 2002 14:44:17 +0100


Napisalem w Keilu taki program:
#include <reg51.h>
unsigned long x;
sbit led=0x97;
void main(void)
{
while(1)
{
led=!led;
for(x=0;x<65000u;x++);
}
}
Poniewaz zle dzialal przeanalizowalem plik lst i hex:
i okazalo sie, ze Keil 6.23 umiescil zmienna x w komorkach 08,09,0a,0b a
przedtem nie zainicjowal stosu. W momencie skoku lcall program zamazuje
zmienna (wskaznik stosu po resecie=07) !
Czy robie cos zle czy tak ma byc :) ?

A czy dolaczyles odpowiednio skonfigurowany
(przez Ciebie) plik startup.a51 ?

Robert




Poprzedni Następny
Wiadomość
Spis treści
From: "Gissbourne" <gissbourne_at_nospam_poczta.onet.pl>
Subject: Re: Keil C i stos
Date: Mon, 16 Dec 2002 15:28:05 +0100



Użytkownik "Robert Łopatecki" <rora_at_nospam_poczta.onet.pl> napisał w wiadomości
news:
A czy dolaczyles odpowiednio skonfigurowany
(przez Ciebie) plik startup.a51 ?

Dopiero przegladam rozne kompilatory wiec nie bardzo wiem jak to sie robi.
Prosze o dodatkowe wyjasnienia.

Gissbourne



Poprzedni Następny
Wiadomość
Spis treści
From: Ireneusz Niemczyk <NOSPAM_i.niemczyk_at_nospam_multispedytor.com.pl>
Subject: Re: Keil C i stos
Date: Mon, 16 Dec 2002 19:17:15 +0100


Dopiero przegladam rozne kompilatory wiec nie bardzo wiem jak to sie robi.
Prosze o dodatkowe wyjasnienia.

Puść sobie symulację, to zobaczysz co się dzieje i dlaczego :-)
--
PZD, Irek.N.
Chcesz rozweselić Boga? Powiedz Mu że masz plany!