假设我有两个数字n1和n2,一个在bank 0,另一个在bank 2,我想使用间接寻址方法对它们进行求和运算,这是我讲座中的代码,在mplab中测试后是错误的8.92,我需要有人纠正它,谢谢:
nbr1 equ 0xA0
nbr2 equ 0x121
som12 equ 0x1A2
; les instructions ci-dessus utilisant la directive (equ) peuvent être remplacées par la directive cblock :
; cblock 0x20
; nbr1, nbr2, som12
; endc
w equ 0
f equ 1
; la macro suivante (bank0) est un sous-programme qui permet de configurer STATUS pour pointer sur bank#0
; ------------- Programme principal ---------------------------------------
org 0x00 ; définir la position initiale dans la mémoire programme
debut
;nbr1:
CLRF STATUS;IRP = 0
movlw 0xA0
movwf FSR ;FSR=0xA0
movlw 0xFF ; transférer la valeur (0x0A) dans l'accumulateur w
movwf INDF ; transférer le contenu de W à l'adresse du nbr1
;nbr2:
bsf STATUS, IRP;IRP = 1
movlw 0x21
movwf FSR ;FSR=0x21
movlw 0x01 ; transférer la valeur (0x0A) dans l'accumulateur w
movwf INDF
;Charger addresse de nbr1 dans FSR
bcf STATUS, IRP;IRP = 0
movlw 0xA0
movwf FSR ;FSR=0xA0
addwf INDF,w ; additionner w à la variable nbr2
bsf STATUS, IRP;IRP = 1
movlw 0xA2
movwf FSR ;FSR=0xA2
movwf INDF ; stoker le résultat de la somme à partir de w sur la variable som12
goto debut ; réexécuter la boucle depuis le label « début »
end```
I tried to rewrite the code but unfortunately i dont know much, im used to the x86 assembly so using PICs are abit difficult
图16中有两种寻址方式:
代码示例
nbr1 equ 0xA0
nbr2 equ 0x121
//Set indirect address of nbr1 = 0X0A0
bcf STATUS, IRP ;SET FSR high bit to 0
movlw 0xA0
movwf FSR ;nbr1 indirect address is set to FSR register as 0X0A0
movf INDF,w ;load byte data to WREG
//Set direct address of nbr2 = 0x121
bcf STATUS, RP0 ;set the high two bits of direct address
bsf STATUS, RP1 ;RP1 = 1
addwf nbr2,w ;nbr2 direct address is 0X121
nbr1和nbr2相加的结果存储在WREG和CARRY标志中。
如果您不想仅使用间接寻址,那么您必须使用另一个临时寄存器来存储第一个值。