logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16][C/WinAVR]Zła zmiana kodu C na asemblera

peikman 07 Gru 2009 13:24 1639 2
  • #1 7356575
    peikman
    Poziom 12  
    Cześć. Mam program i nie mogę zrozumieć dlaczego skacze mi do:
    291: return pgm_read_byte(&(local_lcdspec[s_index].cAlt));


    Popatrzcie na kod C i asemblera. Dlaczego tak jest?

    @00000165: lcd_PrepareSpec
    309:      	memset(lcd_spec, 0xff, sizeof(lcd_spec));
    +00000165:   ED81        LDI       R24,0xD1       Load immediate
    +00000166:   E091        LDI       R25,0x01       Load immediate
    +00000167:   EF6F        SER       R22            Set Register
    +00000168:   E070        LDI       R23,0x00       Load immediate
    +00000169:   E048        LDI       R20,0x08       Load immediate
    +0000016A:   E050        LDI       R21,0x00       Load immediate
    +0000016B:   940E01ED    CALL      0x000001ED     Call subroutine
    +0000016D:   EBA0        LDI       R26,0xB0       Load immediate
    +0000016E:   E0B1        LDI       R27,0x01       Load immediate
    +0000016F:   E080        LDI       R24,0x00       Load immediate
    291:      	return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
    +00000170:   E039        LDI       R19,0x09       Load immediate
    314:      		znak = *pbuffer++;
    +00000171:   912D        LD        R18,X+         Load indirect and postincrement
    264:      	return (c >= 0x80) && (c <= 0x9f);
    +00000172:   5820        SUBI      R18,0x80       Subtract immediate
    316:      		if(lcd_IsSpec(znak))
    +00000173:   3220        CPI       R18,0x20       Compare with immediate
    +00000174:   F4E0        BRCC      PC+0x1D        Branch if carry cleared
    ..........................


    static uint8_t lcd_GetSpec(uint8_t s_index)
    {
    	uint8_t a; 
    	for(a=0; a<ELEMS(lcd_spec); a++)
    	
    	{
    		// 0xff oznacza, że nie ma już dalej wpisów
    		if(lcd_spec[a] == 0xff)
    			break; 
    		// Jeśli znaleziono...
    		else if(lcd_spec[a] == s_index)
    			return a; 
    	}
    	
    	// Nic nie znaleziono
    	return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
    	
    }
    
    // Makro pomocnicze
    #define LCD_SPECNF(spec) (spec > 7)
    
    
    // Funkcja przydzielająca znaki specjalne
    // Zwraca ilość różnych znaków jaką znaleziono. Jeśli > 8 części znaków nie udało się przydzielić
    uint8_t lcd_PrepareSpec(void)
    {
    	// Analizuję cały łańcuch danych i zapisuję kolejno znalezione znaki
    	char* pbuffer = lcd_buffer;
    	uint8_t n;
    	uint8_t cnt=0;
    	char znak;
    	// Na początku "zerowanie" tablicy znaków specjalnych
    	memset(lcd_spec, 0xff, sizeof(lcd_spec));
    	// dodawanie wpisów
    	for(n=0; n<ELEMS(lcd_buffer); n++)
    	
    	{
    		znak = *pbuffer++;
    		// Jeśli znaleziony znak jest specjalny
    		if(lcd_IsSpec(znak))
    		
    		{
    			// Przeszukanie tablicy
    			znak = lcd_Spec2Index(znak);
    			// Jeśli nie znaleziono - dodawanie
    			if(LCD_SPECNF(lcd_GetSpec(znak)))
    			
    			{
    				// dodaj do tablicy tylko jeśli 
    				// nie wystąpiło przepełnienie
    				if(cnt < ELEMS(lcd_spec))
    					lcd_spec[cnt] = znak;
    				// Licznik zwiększany zawsze
    				// dla statystyki
    				++cnt;
    				
    			}
    			
    		}
    		
    	}
    	
    	return cnt;
    	
    }
    


    W załączniku cały kod.
  • #2 7356871
    szelus
    Poziom 34  
    Moim zdaniem nigdzie nie skacze. Disassembler nie radzi sobie z podaniem własciwej linii kodu źródłowego. Porównaj sobie z plikami .lst.
    Jeżeli debugujesz kod zoptymalizowany, to musisz pogodzić się z tym, że momentami bedzie to zadanie lekko schizofreniczne.
  • #3 7357117
    mirekk36
    Poziom 42  
    peikman --> a po co ty w ogóle dokonujesz deasemblacji kodu binarnego skoro możesz sobie podejrzeć super dokładny kod i to wraz z etykietami i ładnymi opisami wprost z kompilatora!..... zajrzyj, że sobie do pliku o nazwie *.lss po zapuszczeniu kompilacji ;) .... i zobaczysz swój prawidłowy oraz pięknie opisany kod w asemblerze zamiast robić to od tyłka strony
REKLAMA