i Mikrodatorteknik för U2 Skriv instruktioner som utför följande operationer (angivna tal antas givna i hexadecimal form om inget annat anges): 1. (0x20) + 25 (0x30) 2. (0x22) - (0x31) (0x25) 3. (w) + 63 (0x23) 4. (0x32) - (w) (0x40) Det upplevs snart som otympligt att alltid ange minnesceller med adress. Därför brukar assemblerspråk tillåta att man använder symboliska namn i stället för adresser. De symboliska namnen måste naturligtvis definieras i programtexten. Ett symbolnamn skall börja med en bokstav. För bra "läsbarhet" hos programmet bör "informativa" symbolnamn användas. Detta underlättar också programkommenteringen. 5. 53 (NUMMER) 6. (TIMER) + 1 (TIMER) 7. (LOOPREG) -1 (LOOPREG) 8. (VAERDE) - 28 (VAERDE) 9. 6 (XTAL) samt (XTAL) + 1 (YTAL) 10. (0X43) + (0X49) (0X49) 11. (I) + (J) + 1 (L) 12. (CELL) + 74 (CELL) 13. (NUMBER) - (VAR) (VAR) 14. (NUMBER) + 4 (NUMBER) 15. (I) + (I) (I) 16. (I) + (I) + + (I) (I) 7 gånger 17. Skriv ett program som läser från PortC, multiplicerar det lästa talet med 6 och skriver resultatet i PortB. Vi antar att resultatet inte blir för stort. 18. 1-komplementera (invertera) innehållet i minnesordet med adressen LOC och placera resultatet i nästa minnesord med namnet LOC1. 19. Addera två 8-bitars binära tal. Tal1 finns på adressen TAL1 och tal2 finns på adressen TAL2. Spara resultatet på adress RES1. Resultatet antas rymmas i 8 bitar. 20. Skifta innehållet i minnesordet med adressen LOC åt vänster ett steg och fyll på med en nolla från höger så att: a) Resultatet placeras i LOC b) Resultatet placeras i minnesordet med adressen SKIFT (Aritmetiskt vänsterskift = multiplikation med 2) 21. Maska bort de fyra minst signifikanta bitarna i minnesordet med adressen TAL. Placera resultatet i nästa minnesord med namnet MTAL. 22. Nollställ ett minnesord med adressen LOC. 23. Dela upp ett 8-bitars tal i två delar om 4 bitar (nibble). Talet finns på adressen LOC. Den minst signifikanta nibblen läggs på nästa adress med namnet LSBTAL och den mest signifikanta nibblen på nästa adress igen med namnet MSBTAL (bit 3 0). 24. Jämför två binärkodade tal. De finns i minnesorden LOC1 och LOC2. Lägg det största talet i minnesordet MAX. Konsekutiva (på varandra följande) adresser i minnet. 25. Beräkna kvadraten på det tal, som finns på adressen LOC. (0 talet 7). Resultatet skall sparas på adress RES1. Lösningsförslag: Lägg upp en tabell i minnet som innehåller kvadraten på talen 0-7. Låt sedan talet på adress LOC utgöra index i tabellen. 1
26. Summera ett antal 8-bitars binära tal. Uppgift om antalet finns i minnesordet ANTAL. Talen finns från adress TABELL och uppåt i minnet. Spara resultatet (som antas rymmas inom 8 bitar) i minnesordet SUMMA. 27. Räkna antalet negativa tal (MSB = 1) i tabellen TABELL t ex D7, F3, 1A, A7, 8D, 13, CA och 27. Placera antalet negativa tal på adressen NEG i minnet. 28. Hitta det största talet (binär representation) i TABELL (se ex. uppgift 27). Lägg det på adressen MAX. 29. Skifta ett 8-bitars tal, som finns på adressen TAL, till vänster tills en etta har skiftats ut från MSB. Spara det skiftade talet i minnesordet STAL. Antalet vänsterskift spara i minnesordet ASKIFT. Om talet = 0 nollställs minnesordet STAL och ASKIFT. TAL, STAL och ASKIFT finns i på varandra följande minnesord. 30. Omvandla den decimala siffran Omvandlingstabell: 0-9, som finns på adressen DEC siffra sjusegmentkod till sjusegmentkod. Lagra denna 0 3F på adressen SJU. Om DEC inte 1 06 innehåller en siffra FF på 2 5B adressen SJU. 3 4F 4 66 5 6D 6 7D 7 07 8 7F 9 6F --------------------------------------------------------------------------------------------------------------------------------- Övningar i mikrodatorteknik, lösningsförslag 1. movf 0x20,w ;(0x20) (w) addlw 0x25 ;(w) + 25 (w) movwf 0x30 ;(w) (0x30) 2. movf 0x31,w ;(0x31) (w) subwf 0x22,w ;(0x22) - (w) (w) movwf 0x25 ;(w) (0x25) 3. addlw 0x63 ;63 + (w) (w) movwf 0x23 ;(w) 0x23 4. subwf 0x32,w ;(0x32) (w) w movwf 0x40 ;(w) (0x40) 5. movlw 0x53 ;53 (w) movwf NUMMER ;(w) (NUMMER) 6. incf TIMER ;(TIMER) + 1 (TIMER) 7. decf LOOPREG ;(LOOPREG) - 1 (LOOPREG) 8. movlw 0x28 ;28 (w) subwf VAERDE ;(VAERDE) (w) (VAERDE) 9. movlw 0x06 ;6 (w) movwf XTAL ;(w) (XTAL) incf XTAL,w ;(XTAL) + 1 (w) movwf YTAL ;(w) (YTAL) 2
10. movf 0x43 ;(0x43) (w) addwf 0x49 ;(w) + (0x49) (0x49) 11. movf I,w ;(I) (w) addwf J,w ;(w) + (J) (w) addlw 1 ;(w) + 1 (w) movwf L ;(w) (L) 12. movf CELL,w ;(CELL) (w) addlw 0x74 ;74 + (w) (w) movwf CELL ;(w) (CELL) 13. movf VAR,w ;(VAR) (w) subwf NUMBER,w ;(NUMBER) (w) (w) movwf VAR ;(w) (VAR) 14. movf NUMBER,w ;(NUMBER) (w) addlw 0x04 ;(w) + 4 (w) movwf NUMBER ;(w) (NUMBER) 15. movf I,w ;(I) (w) addwf I ;(w) + (I) (I) 16. I EQU 0X20 COUNT EQU 0X21 MAIN MOVLW 0X04 ;ANTAG (I)=4 MOVWF I MOVLW 0X07 ;7 (W) MOVWF COUNT ;(W) (COUNT) CLRW ;0 (W) LOOP ADDWF I,W ;(I) + (W) (W) DECFSZ COUNT,F ;(COUNT) - 1 (COUNT), TESTA MOVWF I (W) (I) 17. LIST P=16F874 INCLUDE <P16F874.INC> COUNT EQU 0X20 INIT BSF STATUS,RP0 ;BANK1 CLRF TRISB ;PORTB UTPORT BCF STATUS,RP0 ;BANK0 MAIN MOVLW 0X06 MOVWF COUNT ;6 --> (COUNT) CLRW ;0 -->(W) LOOP ADDWF PORTC,W ;(W) + (PORTC) --> (W) DECFSZ COUNT,F ;(COUNT) - 1 --> (COUNT) MOVWF PORTB ;(W) --> (PORTB) 3
18. LIST P=16F874 INCLUDE <P16F874.INC> LOC EQU 0X20 LOC1 EQU 0X21 MAIN COMF LOC,W MOVWF LOC1 19. LIST P=16F874 INCLUDE <P16F874.INC> TAL1 EQU 0X20 TAL2 EQU 0X21 RES1 EQU 0X22 MAIN MOVF TAL1,W ;(TAL1) --> (W) ADDWF TAL2,W ;(W) + (TAL2) --> (W) MOVWF RES1 ;(W) --> (RES1) 20. LOC EQU 0X20 SKIFT EQU 0X21 MAIN BCF STATUS,C ;0-STÄLL C-FLAGGAN RLF LOC,F ;VÄNSTERSKIFTA (LOC) ;A) RLF LOC,W ;B) MOVWF SKIFT 21. TAL EQU 0X20 MTAL EQU 0X21 MAIN MOVF TAL,W ;(TAL) --> (W) ANDLW 0XF0 ;MASKA FRAM BIT4-7 I W MOVWF MTAL ;(W) --> (MTAL) 22. LOC EQU 0X20 MAIN CLRF LOC 23. LOC EQU 0X20 LSBTAL EQU 0X21 MSBTAL EQU 0X22 MAIN MOVF LOC,W ;(LOC) --> (W) ANDLW 0X0F ;MASKA FRAM BIT0-3 MOVWF LSBTAL ;(W) --> (LSBTAL) SWAPF LOC,W ;SKIFTA HÖG- OCH LÅG-NIBBLE ANDLW 0X0F ;MASKA FRAM BIT0-3 MOVWF MSBTAL ;(W) --> MSBTAL 4
24. LOC1 EQU 0X20 LOC2 EQU 0X21 MAX EQU 0X22 MAIN MOVF LOC1,0 ;(LOC1)-->(W) SUBWF LOC2,0 ;(LOC2)-(W)-->(W) OBS! (W)>=0 --> C=1 BTFSS STATUS,C ;KOLLA C-FLAGGAN (W)<0 --> C=0 GOTO MAX1 MAX2 MOVF LOC2,0 ;(LOC2)-->(W) MOVWF MAX ;(W)-->(MAX) GOTO SLUT MAX1 MOVF LOC1,0 ;(LOC1)-->(W) MOVWF MAX ;(W)-->(MAX) 25. LOC EQU 0X20 RES1 EQU 0X21 START MOVF LOC,0 ;(LOC)-->(W) CALL CONVERT ;ANROPA SUBRUTIN MOVWF RES1 ;KVADRATVÄRDET TILL RES1 GOTO START CONVERT ADDWF PCL ;(PC)+(W)-->(PC) RETLW 0 ;TABELLVÄRDEN (DEC) RETLW 1 RETLW 4 RETLW 9 RETLW 16 RETLW 25 RETLW 36 RETLW 49 26. ANTAL EQU 0X20 ;ANTAG ATT (ANTAL)=4 SUMMA EQU 0X21 ORG 0 ;RESETVEKTOR START CLRF SUMMA ;0-->(SUMMA) LOOP DECF ANTAL,0 ;(ANTAL)-1-->(W) FÖR RÄTT OFFSET CALL TABELL ADDWF SUMMA,1 ;(W)+(SUMMA)-->(SUMMA) DECFSZ ANTAL,1 TABELL ADDWF PCL ;(PC)+(W)-->(PC) RETLW 17 ;NR 0 RETLW 13 ;NR 1 RETLW 1A ;NR 2 RETLW 27 ;NR 3 5
27. ANTAL EQU 0X20 ;VÄLJES HÄR TILL 8 NEG EQU 0X21 START CLRF NEG ;0-->(NEG) LOOP DECF ANTAL,0 ;(ANTAL)-1-->(W) CALL TABELL ANDLW 80 ;MASKA FRAM BIT7 XORLW 80 ;KOLLA OM BIT7=1 BTFSS STATUS,Z GOTO FIX INCF NEG,1 ;(NEG)+1-->(NEG) FIX DECFSZ ANTAL,1 ;DEKREMENTERA (ANTAL) TABELL ADDWF PCL,1 ;(PC)+(W)-->(PC) RETLW 0XD7 ;NR 0 RETLW 0XF3 ;NR 1 RETLW 0X1A ;NR 2 RETLW 0X0A ;NR 3 RETLW 0X08 ;NR 4 RETLW 0X13 ;NR 5 RETLW 0XCA ;NR 6 RETLW 0X27 ;NR 7 28. MAX EQU 0X20 ANTAL EQU 0X21 ;(ANTAL) VÄLJES HÄR TILL 8 TEMP EQU 0X22 MAIN CLRF MAX ; LOOP DECF ANTAL,W ;FIXA TILL OFFSETVÄRDET CALL TABELL MOVWF TEMP ;SPARA TABELLVÄRDET I TEMP SUBWF MAX,W ;(MAX)-(W)-->(W) BTFSC STATUS,C ;KOLLA C, >=0 C=1, <0 C=0 GOTO HOPP ; MOVF TEMP,W ;(TEMP)-->(W) MOVWF MAX ;(W)-->(MAX) HOPP DECFSZ ANTAL,F TABELL ADDWF PCL,F ;(PC)+(W)-->(PC) RETLW 0XD7 RETLW 0XF3 RETLW 0X1A RETLW 0XA7 RETLW 0X8D RETLW 0X13 RETLW 0XCA RETLW 0X27 6
29. TAL EQU 0X20 STAL EQU 0X21 ASKIFT EQU 0X22 COUNT EQU 0X23 TALBUFF EQU 0X24 MAIN MOVF TAL,W ;(TAL)-->(W) MOVWF TALBUFF ;(W)-->(TALBUFF) CLRF STAL ;0-STÄLL (STAL) CLRF ASKIFT ;0-STÄLL (ASKIFT) MOVLW 8 ; MOVWF COUNT ;LADDA RÄKNAREN BCF STATUS,C ;0-STÄLL C LOOP RLF TALBUFF,F ;VÄNSTERSKIFTA INCF ASKIFT,F ;ÖKA (ASKIFT) BTFSC STATUS,C ;KOLLA C-FLAGGAN GOTO SLUT ;C=1 --> SLUT DECFSZ COUNT,F ;MINSKA RÄKNAREN CLRF ASKIFT ;0-STÄLL ASKIFT OM (TAL)=0 GOTO STOP SLUT MOVF TALBUFF,W ;SPARA (TALBUFF) MOVWF STAL ;I (STAL) STOP GOTO STOP 7