PEMSY1http:// 1 Herhaling nieuwe instructies van vorige week nieuw: combineren van assembler en C oefeningen: assembler en C
PEMSY1http:// 2 CMP R2, R1 R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 = SP R14 = LR R15 = PC registers ……. FFFF FFFB FFFF FFFC FFFF FFFD FFFF FFFE FFFF geheugen - flags
PEMSY1http:// 3 CMN R1, #15 R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 = SP R14 = LR R15 = PC registers ……. FFFF FFFB FFFF FFFC FFFF FFFD FFFF FFFE FFFF geheugen - flags -
PEMSY1http:// 4 Variaties op LDR R0, [ R1 ]: LDR R0, [ R1 word (32 bit) LDRH R0, [ R1 half-word (16 bit) LDRB R0, [ R1 byte (8 bit) - H of B komt achteraan, dus: LDREQB - Let op de alignment van het geheugen adres! - Kan net zo bij STR
PEMSY1http:// 5 MOV R0, R1 ADD R0, R1, #2 SUBC R0, R1, R2, LSL #5 ADDS R1, R2, R3, ASR R4 boek p
PEMSY1http:// 6 Assembler en C
PEMSY1http:// 7 C source file (.c) Assembler source file (.asm) Object file Assembler source file (.asm) Object file C compiler Assembler C source file (.c)
PEMSY1http:// 8 Executable / image /.hex file Object file Linker Object file
PEMSY1http:// 9 Assembler – interne en externe labels Default is een label lokaal (alleen voor deze file zichtbaar). Je kan een label totempaal globaal (voor het hele programma beschikbaar) maken met.global totempaal Als je een label (naampje) gebruikt dat niet in je file gedefinieerd is neemt de assembler aan dat het een globaal label is (in een andere file gedefinieerd).
PEMSY1http:// 10 C – interne en externe labels Default is een naam die je definieert globaal (extern zichtbaar). Als je een label (naampje) wilt gebruiken dat niet in je file gedefinieerd is dan moet je er een ‘externe definitie’ voor geven.
PEMSY1http:// 11 Assembler – interne en externe labels.global asm_counter, subroutine.bss asm_counter:.skip 4 my_counter:.skip 4.code ldr r0, =asm_counter ldr r1, =my_counter ldr r2, =c_counter bl f subroutine:add r1, r0, r1 mov pc, lr
PEMSY1http:// 12 C – interne en externe labels extern int asm_counter; extern int subroutine( int a, int b ); int c_counter; void f( void ){ int x; asm_counter++; c_counter++; x = subroutine( 6, 199 ); }
PEMSY1http:// 13 Maak op basis van je uitwerking van de opdracht van les3 een nieuwe applicatie. De main moet je in C schrijven. Deze main roept een in assembler geschreven PRINT_STRING subroutine (of hoe die bij jou ook heette) aan, met als argument (het adres van) een string. In C kan je die aanroep simpelweg schrijven als PRINT_STRING( ”Hi there” ); Laat op deze manier een paar verschillende teksten zien, met een pauze van een paar seconden ertussen (je moet dus ook een van de wait subroutines aanroepen).
PEMSY1http:// 14 Roep vanuit jouw assembler routine PRINT_STRING, tussen het ophalen en het printen van ieder character, een C functie aan, die dat character in een gewijzigde vorm weer teruggeeft. Bij voorbeeld: char next( char c ){ return c + 1; } Maar verzin zelf iets anders dat een wat meer herkenbaar resultaat oplevert!
PEMSY1http:// 15 Assembler file C file void main( … ){.. PRINT_STRING(.. ); … } char func( char x ){ … } PRINT_STRING … bl func …
PEMSY1http:// 16 Je moet iedere assembler functie die je uit C wil aanroepen in C definieren! Let op: wat moet je de assembler functie megeven? Dat worden de C argumenten. Pas op dat je niet een C en een assembler file met de zelfde naam gebruikt, want die genereren de zelfde.o file…