Слайд 1
Подпрограми
Слайд 2
Общи сведения за подпрограмите
Подпрограма се нарича последователността от инструкции, извършваща определена функция, която се използва многократно и на различни места в програмата.
За да се изпълни функцията на подпрограмата, управлението се предава на нея, като се извършва безусловен преход към същата. Този преход към подпрограмата се нарича извикване или обръщение към подпрограма.
При изпълнение на инструкцията за извикване на подпрограма се запомня адресът на инструкцията след нея. Чрез този адрес, наречен адрес на връщане, се осъществява връщането от подпрограмата в главната програма.
Последната инструкция от подпрограмата е специален вид инструкция, наречена инструкция за връщане. Инструкцията за връщане взема адреса от мястото, където е бил запазен от инструкцията за извикване на подпрограмата, и го записва обратно в програмния брояч. Това предизвиква връщане на изпълнението към инструкцията, записана непосредствено след инструкцията за обръщение към подпрограмата.
Слайд 3
Извикване на подпрограма
CALL Sub
…
…
PC
PC+1
Sub
…
…
RETURN
PC+1 TOS
TOS PC
…
Слайд 4
Инструкции за извикване и връщане от подпрограми
Слайд 5
Инструкция CALL
Синтаксис: [етикет] CALL k
Операнди: 0 ≤ k ≤ 2047
Функция:
(PC) + 1 TOS
k PC<10:0>,
PCLATH<4:3> PC<12:11>
Влияние върху
STATUS: Няма
Пример.
HERE CALL THERE
Преди инструкцията:
PC = адрес на HERE
След инструкцията:
PC = адрес на THERE
TOS = адрес на HERE + 1
TOS (Top Of Stack) – връх на стека
Слайд 6
Инструкция RETURN Инструкция RETLW
(RETurn with Literal in W)
Синтаксис: [етикет] RETURN
Операнди: Няма
Функция: (TOS) (PC)
Влияние върху
STATUS: Няма
Описание: Връщане от подпрограма. Върхът на стека се прехвърля в програмния брояч PC. Инструкцията се изпълнява за два цикъла .
Пример . RETURN
След инструкцията:
PC = TOS
Синтаксис: [етикет] RETLW k
Операнди: 0 ≤ k ≤ 255
Функция: k W
(TOS) (PC)
Влияние върху
STATUS: Няма
Описание: Връщане от подпрограма, като осембитовата константа k се зарежда в работния регистър W. Върхът на стека се
прехвърля в програмния брояч PC. Инструкцията се изпълнява за два цикъла.
Слайд 7
Инструкция RETLW
(RETurn with Literal in W)
Пример.
CALL TABLE ; W съдържа отместването в таблицата
... ; W съдържа стойността от таблицата
...
...
TABLE ADDWF PCL ; (W) = отместване
RETLW k1 ; Начало на таблицата
RETLW k2
…
…
RETLW kn ; Край на таблицата
Преди инструкцията:
W = 0x07
След инструкцията:
W = k8
PC = TOS
Слайд 8
Използване на подпрограми за достъп до данни в програмната памет
Операции за четене на таблици от данни. Таблицата представлява последователност от инструкции:
RETLW k,
където k е 8битова константа, записана в таблицата.
Първата инструкция в таблицата пресмята отместването от началото на таблицата чрез т.нар. изчислен GOTO. Изчисленият GOTO се изпълнява чрез прибавяне на отместване към програмния брояч:
ADDWF PCL,1
Слайд 9
Пример 1
...
...
movlw offset ; зареждане на отместване в W
call Table
…
…
Table: addwf PCL, 1 ; събиране на отместването към PC за
; генериране на изчислен GOTO
retlw ‘A’ ; връщане на ASCII кода на ‘A’
retlw ‘B’ ; връщане на ASCII кода на ‘B’
retlw ‘C’ ; връщане на ASCII кода на ‘C’
retlw ‘D’ ; връщане на ASCII кода на ‘D’
retlw ‘E’ ; връщане на ASCII кода на ‘E’
retlw ‘F’ ; връщане на ASCII кода на ‘F’
…
retlw ‘Z’ ; връщане на ASCII кода на ‘Z’
Слайд 10
Подпрограма за сумиране на две двубайтови числа
#include "P16C73.inc“
AccAH equ 0x20
AccAL equ 0x21
AccBH equ 0x22
AccBL equ 0x23
org 0x0000
goto Start
Add_D movf AccAL, 0
addwf AccBL, 1
btfsc STATUS, C
incf AccBH, 1
movf AccAH, 0
addwf AccBH, 1
retlw 0
Слайд 11
Подпрограма за сумиране на две двубайтови числа
Start movlw 0x27
movwf AccBH
movlw 0xA0
movwf AccBL
movlw 0x39
movwf AccAH
movlw 0xB7
movwf AccAL
call Add_D
nop
end
0 коментара
За да коментирате, трябва да сте влезли в профила си.
Влезте