VPEMSY1, D3ECPT2 : ARM Assembler 1 Hogeschool Utrecht / Electrical Engineering & Design 1 Herhaling: CMP, CMN, shifts nieuw: combineren van assembler en C oefeningen: LCD; assembler en C
VPEMSY1, D3ECPT2 : ARM Assembler 2 Hogeschool Utrecht / Electrical Engineering & Design 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
VPEMSY1, D3ECPT2 : ARM Assembler 3 Hogeschool Utrecht / Electrical Engineering & Design 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 -
VPEMSY1, D3ECPT2 : ARM Assembler 4 Hogeschool Utrecht / Electrical Engineering & Design 44 Zie ook boek p 53-54
VPEMSY1, D3ECPT2 : ARM Assembler 5 Hogeschool Utrecht / Electrical Engineering & Design 5 Oefening: wat doet deze code? movr1, r0 ldrr0, =0 loop: ldrbr2, [ r1 ], #1 cmpr2, #0 addner0, r0, #1 bneloop movpc, lr Wat is het doel daarvan?
VPEMSY1, D3ECPT2 : ARM Assembler 6 Hogeschool Utrecht / Electrical Engineering & Design 6 Assembler en C
VPEMSY1, D3ECPT2 : ARM Assembler 7 Hogeschool Utrecht / Electrical Engineering & Design 7 C source file (.c) Assembler source file (.asm) Object file Assembler source file (.asm) Object file C compiler Assembler C source file (.c)
VPEMSY1, D3ECPT2 : ARM Assembler 8 Hogeschool Utrecht / Electrical Engineering & Design 8 Executable / image /.hex file Object file Linker Object file
VPEMSY1, D3ECPT2 : ARM Assembler 9 Hogeschool Utrecht / Electrical Engineering & Design 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 (naam) gebruikt dat niet in je file gedefinieerd is neemt de assembler aan dat het een globaal label is (in een andere file gedefinieerd).
VPEMSY1, D3ECPT2 : ARM Assembler 10 Hogeschool Utrecht / Electrical Engineering & Design 10.global asm_counter, subroutine 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 Assembler – interne en externe labels
VPEMSY1, D3ECPT2 : ARM Assembler 11 Hogeschool Utrecht / Electrical Engineering & Design 11 C – interne en externe labels Default is een naam die je definieert globaal (extern zichtbaar). Als je een label (naam) wilt gebruiken dat niet in je file gedefinieerd is dan moet je er een ‘externe definitie’ voor geven.
VPEMSY1, D3ECPT2 : ARM Assembler 12 Hogeschool Utrecht / Electrical Engineering & Design 12 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 ); } C – interne en externe labels
VPEMSY1, D3ECPT2 : ARM Assembler 13 Hogeschool Utrecht / Electrical Engineering & Design 13 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 ); }.global asm_counter, subroutine 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
VPEMSY1, D3ECPT2 : ARM Assembler 14 Hogeschool Utrecht / Electrical Engineering & Design 14 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 ); }.global asm_counter, subroutine 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
VPEMSY1, D3ECPT2 : ARM Assembler 15 Hogeschool Utrecht / Electrical Engineering & Design 15 void LCD_INIT( void ); void LCD_CLEAR( void ); void LCD_PUTCHAR( char c ); void WAIT_mS( int duration ); void print( char *s ){ LCD_CLEAR(); while( *s != '\0' ){ LCD_PUTCHAR( *s ); s++; } int main( void ){ LCD_INIT(); while(1){ print( "Hello" ); WAIT_mS( 500 ); print( " world." ); WAIT_mS( 500 ); } Hello2.zip
VPEMSY1, D3ECPT2 : ARM Assembler 16 Hogeschool Utrecht / Electrical Engineering & Design 16 void LCD_INIT( void ); void LCD_CLEAR( void ); void print( char * s ); void WAIT_mS( int duration ); int main( void ){ LCD_INIT(); while(1){ print( "Hallo" ); WAIT_mS( 500 ); print( " wereld." ); WAIT_mS( 500 ); } Hello3.zip.global print print: stmfd SP!,{ R5, LR } mov r5, r0 BL LCD_INIT loop: ldrb r0, [ r5 ], #1 cmp r0, #0 beq klaar bl LCD_PUTCHAR b loop klaar: ldmfd SP!,{ R5, PC }
VPEMSY1, D3ECPT2 : ARM Assembler 17 Hogeschool Utrecht / Electrical Engineering & Design 17 Schrijf de C functie void lichtkrant( char *s, int n ); Deze functie laat de tekst s scrollen over het LCD. De wachttijd tussen iedere scroll-stap is n us. De functie werkt door eerst *s te printen (functie of subroutine print bestaat al), daarna even wachten, s verhogen, en weer printen. De functie keert terug als s naar de ‘\0’ wijst. Wat lastiger (mag, hoeft niet): de functie keer terug als de resterende tekst helemaal op het LCD staat, dwz. als de resterende tekst 16 tekens of korter is. Een strlen functie is deze les behandeld.
VPEMSY1, D3ECPT2 : ARM Assembler 18 Hogeschool Utrecht / Electrical Engineering & Design 18 Herschrijf de functie ‘lichtkrant’ in assembler.