Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;********************************************************************
- ;* Hochschule fuer Technik und Wirtschaft *
- ;* Fakultaet fuer Ingenieurwissenschaften *
- ;* Labor fuer Eingebettete Systeme *
- ;* Mikroprozessortechnik *
- ;********************************************************************
- ;* *
- ;* 2-1FunktionAtoL.S: *
- ;* Programmrumpf fuer Assembler-Programme mit dem Keil *
- ;* Entwicklungsprogramm uVision fuer ARM-Mikrocontroller *
- ;* *
- ;********************************************************************
- ;* Aufgabe-Nr.: 2.1 * *
- ;* * *
- ;********************************************************************
- ;* Gruppen-Nr.: 12 * *
- ;* * *
- ;********************************************************************
- ;* Name / Matrikel-Nr.: * *
- ;* Halilaj Behat 3670538 * *
- ;* Kretzschmann Samuel 3726304 * *
- ;********************************************************************
- ;* Abgabedatum: 20.12.18 * *
- ;* 10:00 - 13:15 * *
- ;********************************************************************
- ;********************************************************************
- ;* Daten-Bereich bzw. Daten-Speicher *
- ;********************************************************************
- AREA Data, DATA, READWRITE
- Datenanfang
- Stack EQU Datenanfang
- Stack_Ende EQU Stack + 0x400
- ;********************************************************************
- ;* Programm-Bereich bzw. Programm-Speicher *
- ;********************************************************************
- AREA Programm, CODE, READONLY
- ARM
- Reset_Handler MSR CPSR_c, #0x10 ; User Mode aktivieren
- ;********************************************************************
- ;* Hier das eigene Programm einfuegen *
- ;********************************************************************
- Start
- STMFD SP!, {R1-R5, R14} ; Sichert die Registerbelegung für spätere wiederherstellung
- LDR R0, =String ; Adresses des Strings in R0 laden
- MOV R2,#0xA ; R2 sei 10; die 10 wird benötigt um die zahl zu erweitern
- MOV R3,#0 ; R3 sei zu Beginn 0
- MOV R5,#0 ; Vorzeichen makierung
- LDR SP, =Stack_Ende ; Definiert ende unseres Stacks 1024Byte (1MByte)
- BL pruefe_vorzeichen
- pruefe_vorzeichen
- LDRB R1,[R0] ; Lade den Wert des ersten Bytes aus R0 in R1 OHNE Offset
- CMP R1, #0x2D ; Überprüfe für negatives vorzeichen (-)
- MOVEQ R5, #1 ; Kennzeichne negatives vorzeichen mit #1 in R5
- LDRBEQ R1, [R0], #1 ; Falls erstes Zeichen "-", lade Wert aus R0 in R1 MIT Offset 1 Byte
- BEQ atol ; Falls erstes Zeichen "-" in ASCII, springe zu atol
- CMP R1,#0x2B ; Überprüfe für positives vorzeichen (+)
- LDRBEQ R1, [R0], #1 ; Falls erstes Zeichen "+", lade Wert aus R0 in R1 MIT Offset 1 Byte
- BEQ atol ; Falls erstes Zeichen "+" in ASCII, springe zu atol
- atol
- LDRB R1,[R0],#1 ; Lade n-tes Zeichen vom String in R1, inkrementiere R0 um 1 (zeige auf nächstes byte im string)
- MOV R4,R3 ; Speicher R3 in R4
- CMP R1,#0x00 ; R1 == 0?
- SUBNE R1,R1,#0x30 ; Nein: dekremetiere R1 um 0x30 um die tatsächliche Hex-Zahl zu erhalten
- MLANE R3,R4,R2,R1 ; Nein: Multipliziere das alte Ergebnis mit 10, Addiere die neue Hex-Zahl hinzu, Speichere in R3
- BNE atol
- negativer_input
- CMP R5, #1 ; Ist in R5 aus prüefe_vorzeichen eine 1?
- MVNEQ R4, R4 ; Mit logischem XOR Einser-Komplement bilden
- ADDEQ R4, R4, #1 ; Daraus durch +1 Zweierkomplement machen
- ergebnis_reset
- MOV R0,R4 ; Schreibe Endergebnis in R0
- LDMFD SP!, {R2-R5, R14} ; Stelle gepseicherte Register wieder her
- B Ende
- Ende B Ende
- String DCB "+33300",0x00
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement