Forum: Mikrocontroller und Digitale Elektronik Umrechnung: C-Code->Assembler-Code->Cycles


von Stephan P. (steph0815)


Lesenswert?

Hallo,

ich programmiere schon laenger uC in C, habe mich aber noch nie mit 
Assembler befasst. Um jetzt einen Einstieg zu bekommen dachte ich 
versuche ich mich einfach mal an einer Warteschleife. Das ganze sollte 
einfach eine for-Schleife sein.
1
void Delayx100us(unsigned char b)
2
{
3
  unsigned char j;        
4
  for (j=0; j!=b; ++j) ;    //20+a*12 cycles (for 1MHz)
5
}
Ich benutze einen MSO430x169 und MSPGCC mit Eclipse. Wenn ich dies nun 
auf den MSP bringe und im Assembler den Code anschaue sieht das so aus
1
    Delayx100us(5);
2
0x000013be <main+48>: mov   #5,  r15  ;#0x0005
3
0x000013c2 <main+52>: call  #4962    ;#0x1362
4
0x000013c6 <main+56>: jmp   $-12       ;abs 0x13ba
5
0x00001362 <Delayx100us>:    push  r5    ;
6
0x00001364 <Delayx100us+2>:  push  r4    ;
7
0x00001366 <Delayx100us+4>:  mov   r1,  r5  ;
8
0x00001368 <Delayx100us+6>:  add   #6,  r5  ;#0x0006
9
0x0000136c <Delayx100us+10>: decd  r1    ;
10
0x0000136e <Delayx100us+12>: mov   r1,  r4  ;
11
0x00001370 <Delayx100us+14>: mov.b r15,  0(r4)  ;
12
  unsigned char j;        
13
  for (j=0; j!=b; ++j) ;    //20+a*12 cycles (for 1MHz)
14
0x00001374 <Delayx100us+18>: mov.b #0,  1(r4)  ;r3 As==00
15
0x00001378 <Delayx100us+22>: cmp.b @r4,  1(r4)  ;
16
0x0000137c <Delayx100us+26>: jnz   $+4        ;abs 0x1380
17
0x0000137e <Delayx100us+28>: jmp   $+8        ;abs 0x1386
18
0x00001380 <Delayx100us+30>: inc.b 1(r4)    ;
19
0x00001384 <Delayx100us+34>: jmp   $-12       ;abs 0x1378
Einiges kann ich mir ja erklaeren wie z.B. MOV(.b) (1 Cycle) oder JMP (2 
Cycles). Die Cycles stehen ja auch im DB. Um jetzt alles erklaeren zu 
koennen waer eine gute Einfuehrung in Assembler noetig. Weiss jemand wo 
ich so etwas Online finde oder kann mir die hier gezeigte Funktion etwas 
genauer erklaeren? Vielleicht gibt es ja auch die Moeglichkeit das beim 
Debuggen anzuzeigen.

Vielen Dank schon mal!
Stephan

von 2921 (Gast)


Lesenswert?

Ja. Du musst das ASM Instruktionsset des Prozessors vorne haben, am 
Besten auf Papier ausgedruckt. Dann den Simulator starten und schauen 
wie das so geht. Der kann Einzelschritte ausfuehren und man kann alle 
Register anschauen.

von Stephan P. (steph0815)


Angehängte Dateien:

Lesenswert?

Ok ich haenge das Handbuch mal an denn ich finde nicht alles darin, z.B. 
CMP.  Zu finden ist das Instruktion Set ab der Seite 51. CMP findet sich 
auf der Seite 68. Hier ein Auszug der hoffentlich reicht zum Erklaeren.

CMP[.W] Compare source and destination
CMP.B Compare source and destination
Syntax CMP src,dst or CMP.W src,dst
CMP.B src,dst
Operation dst + .NOT.src + 1
or
(dst − src)

Wie gesagt ich habe noch nicht wirklich ein Verstaendniss von Assembler 
um das daraus lesen zu koennen.

mfg
Stephan

von 2921 (Gast)


Lesenswert?

Was ist an diesem Compare schwierig ? Die Flags, die sich allenfalls 
bewegen sollten noch da stehen.

von Stephan P. (steph0815)


Lesenswert?

Aber was sagen mir die Flaps ueber die instruction cycles aus? Flags 
meinst du wohl Status Bits oder? das sind diese:

Status Bits N: Set if result is negative, reset if positive (src >= dst)
Z: Set if result is zero, reset otherwise (src = dst)
C: Set if there is a carry from the MSB of the result, reset otherwise
V: Set if an arithmetic overflow occurs, otherwise reset

von 2921 (Gast)


Lesenswert?

Die Anzahl cycles stehen auch dort. Heutzutage in einer modernen CPU 
sind die meisten Befehle ueblicherweise in einem Zyklus durch, 
Sprungbefehle in zwei Zyklen. Die Flags sind auch wesentlich zum 
Verstehen der Befehle. Ein Compare hat ueblicherweise einen bedingten 
Sprung hintendran, der die Flags dann auch auswetet.

von Andreas K. (a-k)


Lesenswert?

2921 wrote:

> Die Anzahl cycles stehen auch dort. Heutzutage in einer modernen CPU
> sind die meisten Befehle ueblicherweise in einem Zyklus durch,
> Sprungbefehle in zwei Zyklen.

Hier nicht. CISCs wie MSP430 sind komplizierter. Da läuft das ganz 
klassisch im Baukastenverfahren ab. Also A Takte für den Befehl selbst, 
plus B Takte für den Quelloperand abhängig von dessen Adressierungart, 
plus C Takte für den Zieloperand abhängig von dessen Adressierungsart.

von winne (Gast)


Lesenswert?

Ich denke hier ist Urschleim von Nöten

nur wer den Aufbau (s)eines Prozessors verstanden hat wird mit ASM
glücklich.
Anders bei Hochsprachen, diese sind Problemlösungsorientiert.
Assembler ist dagegen untrennbar an den Prozessor gebunden.
Man wird Assembler nicht verstehen, ohne die Struktur und Funktion der 
Register, Flags und Takterzeugung sowie der Port und Speicherzugriffe 
verstanden zu haben.
Also  am anfang von ASM steht Hardware auf dem Stundenplan!
danach wird alles easy.  ;-))

MfG
Winne

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.