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