Gotowy program w C na Assembler

0

Witam, czy jest możliwe przerobienie gotowego kodu w C na assembler sam tego nie potrafię a może dla kogoś to nie będzie kłopot? Wiem że są jakieś kompliatory itp. jednak mieszają one w kodzie i się nie trzymają sensu, jeśli ktoś byłby w stanie mi pomóc podsyłam gotowy programik. Tematem jest Obsługa portu szeregowego w mikrokontrolerach rodziny MCS-51.

#include <8052.h> // Dołączenie biblioteki 8052.h.
unsigned char znak=0; // Deklaracja zmiennej globalnej „znak” równej 0.
unsigned char BUFOR=0; // Deklaracja zmiennej globalnej “BUFOR” równej 0.
volatile __xdata __at (0xFA00) unsigned char LED; // Dołączenie do program rejestru zatrzaskowego dla sterowania ośmioma diodami LED.
void przerwanie (void) __interrupt (4) // Funkcja obsługi przerwań
{
if(RI == 1) // Sprawdzenie znacznika odebrania pojedynczego znaku danych.
{
RI = 0; // Wyzerowanie znacznika.
znak = 1; // Przypisanie zmiennej znak wartości 1.
BUFOR = SBUF; // Przypisanie zawartości zmiennej SBUF do zmiennej BUFOR.
LED=BUFOR; // Przypisanie zawartości zmiennej BUFOR do zmiennej globalnej LED.
}
void main (void) // Główna funkcja programu.
{
unsigned char tmp; // Deklaracja zmiennej tmp typu char.

SCON=0x52; // 1010010 - Port szeregowy, tryb 1, bit sterujący aktywacją komunikacji wieloprocesorowej jest stanie wysokim, znacznik TI jest w stanie wysokim.
TMOD=0x20; // Tryb 0, licznik pracuje, gdy TRi=1 oraz INTi=1.
PCON=0x80; // Rejestr sterujący stanami uśpienia.
TH1=253; // Ustawienie wartości początkowej licznika T1 - najstarszy bit.
TL1=253; // Ustawienie wartości początkowej licznika T1 - najmłodszy bit.
IE=0x90; // 10010000 - Rejestr maski przerwań, stan wysoki na bicie maski systemu przerwania i na bicie maski przerwania od portu szeregowego.
TR1=1; // Włączenie licznika T1 do pracy.
znak=0; // Zerowania zmiennej znak.
do{
while(znak==0); // Warunek – zmienna znak musi być równa 0.
znak=0; // Zerowanie zmiennej znak.
BUFOR=BUFOR+1; // Inkrementacja zmiennej BUFOR.
SBUF=BUFOR; // Przypisanie zawartości zmiennej BUFOR do zmiennej SBUF.
while(TI=0); // Warunek – stan na znaczniku przerwania od nadajnika portu szeregowego musi być niski.
}

while(1); // Nieskończona pętla.

z góry dziękuje za każdą pomoc.

1

gcc -S
Ręcznie ci nikt tego za darmo przerabiać nie będzie.

0

To raczej trzeba zrobić ręcznie, chociaż przy tak prostym programie może się udać przez wspomnianą translację do ASM (gcc -S).

1

Kod jest dość prosty więc gcc -S -O0 powinno dać dość trywialne tłumaczenie niemalże 1:1 ;]

1
Shalom napisał(a):

Kod jest dość prosty więc gcc -S -O0 powinno dać dość trywialne tłumaczenie niemalże 1:1 ;]

O ile ma być 1:1.
Bo mam wrażenie, że chodzi o to że autor napisał program nie w tym języku co trzeba - jeśli tak jest to trzeba zoptymalizować na maksa żeby wyciąć cały możliwy nadmiar języka (-O3).

0

Proponuję skorzystanie z kompilatora SDCC. Ten kompilator ma opcję zapisania w pliku ASM.

Przykładowe wywołanie SDCC:
"C:\Program Files\SDCC\bin\sdcc" --use-stdout -mmcs51 --model-large --code-loc 0x0000 --code-size 0x6000 --xram-loc 0x6000 --xram-size 0x2000 TestD.c

W pliku *.lst będzie zapisany kod asemblera z wyszczególnieniem linii kodu w języku C, więc analiza i dojście do tego, który fragment ASM z której linii języka C wyszedł, będzie łatwe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1