Forum: Mikrocontroller und Digitale Elektronik Hex disassemblieren mit merkwürdigem Ergebnis


von Ch D. (chrisu) Benutzerseite


Lesenswert?

Hi,
Habe Heute einfach mal ein Assembler Projekt von mir mit  IDA 
disassembliert, und festgestellt das nicht alles gleich ist wie ich es 
im Asm-Sourcecode geschrieben habe. Zum Beispiel wird das Register R19 
benutzt obwohl ich es im Sourcecode nirgendwo benutzt habe. Ein Paar 
Funktionen erkenne ich wieder, und ein paar habe ich noch nie gesehen.
Wie ist das möglich, warum werden andere Register benutzt als im 
Sourcecode angegeben?

Danke

von Thomas (Gast)


Lesenswert?

Automatische Optimierung.

von Gast (Gast)


Lesenswert?

Beispiel?

von Ch D. (chrisu) Benutzerseite


Lesenswert?

1
              cpi     r19, 0          ; TWI_
2
ROM:01DF                 sbci    r19, 0x51 ; 'Q'
3
ROM:01E0                 rcall   sub_2C6
4
ROM:01E1                 ldi     r16, 0
5
ROM:01E2                 ldi     r17, -3 ; '²'
6
ROM:01E3                 rcall   sub_2A8
7
ROM:01E4                 rcall   sub_2C6
8
ROM:01E5                 ldi     r16, 0
9
ROM:01E6                 ldi     r17, -0x34 ; '¦'
10
ROM:01E7                 rcall   sub_2A8
11
ROM:01E8                 cpi     r19, 0x10
12
ROM:01E9                 sbci    r20, 0x54 ; 'T'
13
ROM:01EA                 sbci    r20, 0x36 ; '6'
14
ROM:01EB                 sbci    r19, 0x44 ; 'D'
15
ROM:01EC                 sbci    r19, 0x50 ; 'P'
16
ROM:01ED                 sbci    r19, 0x41 ; 'A'
17
ROM:01EE                 cpi     r19, 0
18
ROM:01EF                 sbci    r19, 0x50 ; 'P'
19
ROM:01F0                 ldi     r17, 0x30 ; '0'
20
ROM:01F1                 rcall   sub_2B0
21
ROM:01F2                 ldi     r16, 0
22
ROM:01F3                 ldi     r17, 0x31 ; '1'

also das hier zum Beispiel, im Sourcecode steht davon nichts.
p.s. wo stellt man denn die Optimierung ab?

von (prx) A. K. (prx)


Lesenswert?

Der Disassembler hat keine Ahnung, was im ROM Daten sind und was Code 
ist. Disassemblierte Daten sehen öfter etwas schräg aus. Erkennt man 
besser, wenn man zu den Befehlen auch die Bytes sieht.

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Ich habe mal davon gehört das man das im Disassembler simulieren kann 
und so rausfinden kann was Daten und was Code ist. Habe ich das so 
richtig verstanden und ist das mit IDA möglich?

von Peter D. (peda)


Lesenswert?

Christian D. schrieb:
> also das hier zum Beispiel, im Sourcecode steht davon nichts.

Kann ja jeder behaupten.
Wir können es nicht nachprüfen.


> p.s. wo stellt man denn die Optimierung ab?

gibbet nich.
Ein Assembler muß genau das übersetzen, was Du hingeschrieben hast.


Peter

von Ch D. (chrisu) Benutzerseite


Lesenswert?

>> also das hier zum Beispiel, im Sourcecode steht davon nichts.

>Kann ja jeder behaupten.
>Wir können es nicht nachprüfen.
Stimmt wirklich! glaub mir. ich benutze nur r16, r17 und r18. Es können 
also nur die Sachen aus dem Datensegment sein. Kann mir jemand sagen wie 
ich das simulieren kann das ich herausfinde was Code und Daten ist?

von Klaus (Gast)


Lesenswert?

In der disassemblierten Liste solltest Du die Darstellung der erzeugten 
Codebytes mit anschalten, nicht nur der Adressen.
Dann wird man vermutlich sehen, daß es sich bei den vermeintlichen 
Programmschritten nach   "rcall   sub_2A8"  um irgendwelche Konstanten 
oder Tabellen etc. handelt.
Evtl. sind es Zahlenkonstanten für die Subraktion.

Noch einfacher ist es, wenn man den Assembler einen "Listfile" erzeugen 
lässt, dann sieht man alles genau und braucht keine separaten 
Disassembler. Diese werden nur bei Analyse von Fremdcode eingesetzt.

von Peter D. (peda)


Lesenswert?

Christian D. schrieb:
> Kann mir jemand sagen wie
> ich das simulieren kann das ich herausfinde was Code und Daten ist?

Geht nicht, dazu bräuchte der Disassembler Intelligenz.
Es gibt Disassembler, wo man manuell Codesequenzen ausschließen kann.
Manche Disassembler können auch alle Sprungmarken verfolgen, bis zum 
nächsten unbedingten Sprung oder return. Das geht, solange man keine 
Funktionspointer benutzt.


Aber wenn Du eh den Quellcode hast, dann brauchst Du doch nicht 
disassemblieren, nimm einfach das Assemblerlisting.


Peter

von Hc Z. (mizch)


Lesenswert?

Christian D. schrieb:
 ROM:01E9                 sbci    r20, 0x54 ; 'T'
> ROM:01EA                 sbci    r20, 0x36 ; '6'
> ROM:01EB                 sbci    r19, 0x44 ; 'D'
> ROM:01EC                 sbci    r19, 0x50 ; 'P'
> ROM:01ED                 sbci    r19, 0x41 ; 'A'

Siehst Du, dass die Operanden Text ergeben?  Und so wird es auch mit dem 
Operator sein.  Irgendwo in Deinem Programm steht der String 
...".T.6.D.P.A."... (Die Punkte stehen für weitere Zeichen, da Dein 
Disassembler-Listing leider die Code-Bytes weglässt).

Das kommt einfach heraus, wenn man Strings disassembliert.  Woher soll 
der Disassembler auch wissen, dass das Programm dort selbst nicht 
vorbeikommt, sondern diesen Teil als Daten verwendet?

von Thomas R. (tinman) Benutzerseite


Lesenswert?

du kannst im IDA die analyze abeim laden bschalten, dann wird IDA 
erstmal z.b. die strings auflisten.

Blocks die wie code aussehen markieren und "C" drücken, dann bekommst du 
auch da code disassembliert wo code drin ist - im string fenster die 
addressen vergleichen damit du keine string disassemblierst.

IDA ist schon super, allerdings falls du wirklich die lizenz gekauft 
hast solltest du es wissen :)

von Reinhard R. (reirawb)


Lesenswert?

>> ROM:01E9                 sbci    r20, 0x54 ; 'T'
>> ROM:01EA                 sbci    r20, 0x36 ; '6'
>> ROM:01EB                 sbci    r19, 0x44 ; 'D'
>> ROM:01EC                 sbci    r19, 0x50 ; 'P'
>> ROM:01ED                 sbci    r19, 0x41 ; 'A'

Ich werfe mal folgende Version ins Rennen:

Struktur des sbci-Befehls:
    0100  KKKK  dddd  KKKK
Befehle analysiert:
ROM:01E9                 sbci    r20, 0x54 ; 'T'
    0100  0101  0100  0100 = 0x4544 = 'E','D'

ROM:01EA                 sbci    r20, 0x36 ; '6'
    0100  0011  0100  0110 = 0x4346 = 'C','F'

ROM:01EB                 sbci    r19, 0x44 ; 'D'
    0100  0100  0011  0100 = 0x4434 = 'D','.'

ROM:01EC                 sbci    r19, 0x50 ; 'P'
    0100  0101  0011  0000 = 0x4530 = 'E','0'

ROM:01ED                 sbci    r19, 0x41 ; 'A'
    0100  0100  0011  0001 = 0x4431 = 'D','1'

ASCII-Folge also 'EDCFD.E0D1'

Reinhard

von Hc Z. (mizch)


Lesenswert?

> Ich werfe mal folgende Version ins Rennen:

Stimmt.  Die Nibbles sind verwürfelt, das habe ich nicht bedacht.

von (prx) A. K. (prx)


Lesenswert?

Reinhard Richter schrieb:

> ASCII-Folge also 'EDCFD.E0D1'

Ist AVR im ROM big endian?

von Hc Z. (mizch)


Lesenswert?

Es ist auch die Frage, wie herum der Disassembler die Bytes anzeigt. 
Ein AVR-Assembler-Listing zeigt z.B. die Bytes anders herum an als eines 
von gas (dem Gnu Assembler) und vom avr-objdump-Disassembler.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.