fork download
  1. #include "P16C73.inc"
  2.  
  3. org 0x0000
  4. goto Start ; Скок към началото на програмата
  5.  
  6. org 0x0020
  7.  
  8. RegA equ 0x20 ; Входна стойност A
  9. ResL equ 0x21 ; Младши байт на резултата
  10. ResH equ 0x22 ; Старши байт на резултата
  11. PtrMas equ 0x23 ; Указател към масива Masiv
  12. PtrRes equ 0x24 ; Указател към масива Results
  13. Count equ 0x25 ; Брояч
  14. Masiv equ 0x30 ; Масив с входни стойности
  15. Results equ 0x40 ; Масив за запис на резултатите
  16.  
  17. Izraz
  18. movf RegA, W ; Зареждаме A в W
  19. movwf ResL ; Записваме в ResL
  20. clrf ResH ; Нулираме ResH
  21.  
  22. rlf ResL, 1 ; Умножаваме по 2
  23. rlf ResH, 1
  24. bcf STATUS, C
  25. rlf ResL, 1 ; Умножаваме по 4
  26. rlf ResH, 1
  27. bcf STATUS, C
  28. rlf ResL, 1 ; Умножаваме по 8
  29. rlf ResH, 1
  30.  
  31. movf RegA, W ; Зареждаме A в W
  32. subwf ResL, 1 ; A ? 8 – A = A ? 7
  33. btfss STATUS, C
  34. decf ResH, 1
  35.  
  36. movlw 57
  37. addwf ResL, 1 ; Добавяме 57
  38. btfsc STATUS, C
  39. incf ResH, 1
  40.  
  41. movlw 250
  42. subwf ResL, 1 ; Изваждаме 250
  43. btfss STATUS, C
  44. decf ResH, 1
  45.  
  46. return ; Връщаме се
  47.  
  48. SaveResult
  49. movf PtrRes, W ; Зареждаме указателя
  50. movwf FSR ; Поставяме го във FSR
  51. movf ResL, W
  52. movwf INDF ; Записваме младшия байт
  53. incf PtrRes, F ; Увеличаваме PtrRes
  54. movf PtrRes, W
  55. movwf FSR
  56. movf ResH, W
  57. movwf INDF ; Записваме старшия байт
  58. incf PtrRes, F ; Увеличаваме PtrRes
  59. return
  60.  
  61. Start
  62. movlw Results
  63. movwf PtrRes ; Инициализираме указателя за резултати
  64.  
  65. movlw 15
  66. movwf RegA ; Пример 1: A = 15
  67. call Izraz
  68. call SaveResult
  69.  
  70. movlw 170
  71. movwf RegA ; Пример 2: A = 170
  72. call Izraz
  73. call SaveResult
  74.  
  75. movlw 10
  76. movwf Masiv ; Входна стойност 1
  77. movlw 20
  78. movwf Masiv+1 ; Входна стойност 2
  79. movlw 30
  80. movwf Masiv+2 ; Входна стойност 3
  81. movlw 40
  82. movwf Masiv+3 ; Входна стойност 4
  83. movlw 50
  84. movwf Masiv+4 ; Входна стойност 5
  85. movlw 100
  86. movwf Masiv+5 ; Входна стойност 6
  87. movlw 170
  88. movwf Masiv+6 ; Входна стойност 7
  89.  
  90. movlw Masiv
  91. movwf PtrMas ; Указател към Masiv
  92. movlw 7
  93. movwf Count ; Брояч
  94.  
  95. Loop
  96. movf PtrMas, W ; Копира стойността на PtrMas в работния регистър W
  97. movwf FSR ; Зарежда FSR с адреса от PtrMas
  98. movf INDF, W ; Зарежда W с данните от адреса, посочен от FSR
  99. movwf RegA ; Записва стойността от W в RegA
  100. call Izraz ; Извиква подпрограма Izraz за изчисляване на израза
  101. call SaveResult ; Извиква подпрограма SaveResult за записване на резултата
  102.  
  103. incf PtrMas, F ; Увеличава PtrMas, за да сочи към следващия елемент от масива
  104. decfsz Count, F ; Намалява брояча, ако резултатът е 0, прескача следващия ред
  105. goto Loop ; Връща се в началото на цикъла, ако брояча не е станал 0
  106.  
  107. goto End ; Безкраен цикъл
  108.  
Success #stdin #stdout 0.03s 25404KB
stdin
Standard input is empty
stdout
#include "P16C73.inc"

        org     0x0000
        goto    Start          ; Скок към началото на програмата

        org     0x0020

RegA    equ     0x20            ; Входна стойност A
ResL    equ     0x21            ; Младши байт на резултата
ResH    equ     0x22            ; Старши байт на резултата
PtrMas  equ     0x23            ; Указател към масива Masiv
PtrRes  equ     0x24            ; Указател към масива Results
Count   equ     0x25            ; Брояч
Masiv   equ     0x30            ; Масив с входни стойности
Results equ     0x40            ; Масив за запис на резултатите

Izraz
        movf    RegA, W         ; Зареждаме A в W
        movwf   ResL            ; Записваме в ResL
        clrf    ResH            ; Нулираме ResH

        rlf     ResL, 1         ; Умножаваме по 2
        rlf     ResH, 1
        bcf     STATUS, C
        rlf     ResL, 1         ; Умножаваме по 4
        rlf     ResH, 1
        bcf     STATUS, C
        rlf     ResL, 1         ; Умножаваме по 8
        rlf     ResH, 1

        movf    RegA, W         ; Зареждаме A в W
        subwf   ResL, 1         ; A ? 8 – A = A ? 7
        btfss   STATUS, C
        decf    ResH, 1

        movlw   57
        addwf   ResL, 1         ; Добавяме 57
        btfsc   STATUS, C
        incf    ResH, 1

        movlw   250
        subwf   ResL, 1         ; Изваждаме 250
        btfss   STATUS, C
        decf    ResH, 1

        return                  ; Връщаме се

SaveResult
        movf    PtrRes, W       ; Зареждаме указателя
        movwf   FSR             ; Поставяме го във FSR
        movf    ResL, W
        movwf   INDF            ; Записваме младшия байт
        incf    PtrRes, F       ; Увеличаваме PtrRes
        movf    PtrRes, W
        movwf   FSR
        movf    ResH, W
        movwf   INDF            ; Записваме старшия байт
        incf    PtrRes, F       ; Увеличаваме PtrRes
        return

Start
        movlw   Results
        movwf   PtrRes          ; Инициализираме указателя за резултати

        movlw   15
        movwf   RegA            ; Пример 1: A = 15
        call    Izraz
        call    SaveResult

        movlw   170
        movwf   RegA            ; Пример 2: A = 170
        call    Izraz
        call    SaveResult

        movlw   10
        movwf   Masiv           ; Входна стойност 1
        movlw   20
        movwf   Masiv+1         ; Входна стойност 2
        movlw   30
        movwf   Masiv+2         ; Входна стойност 3
        movlw   40
        movwf   Masiv+3         ; Входна стойност 4
        movlw   50
        movwf   Masiv+4         ; Входна стойност 5
        movlw   100
        movwf   Masiv+5         ; Входна стойност 6
        movlw   170
        movwf   Masiv+6         ; Входна стойност 7

        movlw   Masiv
        movwf   PtrMas          ; Указател към Masiv
        movlw   7
        movwf   Count           ; Брояч

Loop
        movf    PtrMas, W		; Копира стойността на PtrMas в работния регистър W
        movwf   FSR				; Зарежда FSR с адреса от PtrMas
        movf    INDF, W			; Зарежда W с данните от адреса, посочен от FSR
        movwf   RegA			; Записва стойността от W в RegA
        call    Izraz			; Извиква подпрограма Izraz за изчисляване на израза
        call    SaveResult		; Извиква подпрограма SaveResult за записване на резултата

        incf    PtrMas, F		; Увеличава PtrMas, за да сочи към следващия елемент от масива
        decfsz  Count, F		; Намалява брояча, ако резултатът е 0, прескача следващия ред
        goto    Loop			; Връща се в началото на цикъла, ако брояча не е станал 0

End
        goto    End             ; Безкраен цикъл
        end