您好,我是照片中装配编码的新手。有一个我无法看到的代码:
BCF STATUS,IRP
MOWLW 70h
MOVWF FSR
TOP CLR INDF
INCF FSR,F
BTFSS FSR,7
GOTO TOP
好的,这是我的问题:首先,这个INDF如何在FSR上运作? INCF FSR,F这个增量指令如何在F寄存器上起作用?谢谢
答案 0 :(得分:2)
This manual将帮助您理解说明
BCF STATUS,IRP ;Bit Clear register File
;Clear bit IRP (bit7) of register STATUS (Select bank 0 and 1)
MOVLW 70h ;MOVe Literal to W register
;Set W = 70h (End of register, start of SRAM)
MOVWF FSR ;MOVe W to F
;Set FSR (File Select Register) = W = 70h
TOP ;Label
CLRF INDF ;CLeaR register File
;Clear register INDF (INDirect register File), this access memory location at FSR
INCF FSR,F ;INCrement register File
;Increment FSR and place the result in FSR (F parameter)
BTFSS FSR,7 ;Bit Test in register File, Skip if Set
;If bit7 of FSR is set skip next instruction (Break the loop)
GOTO TOP ;GO TO TOP label
PIC只有一个“内部”寄存器,称为 W PIC还有一个内部RAM(实现为SRAM) 内部RAM分为最多四个库,必须由程序员手动选择 每个库是128个字节。
寄存器实际上是内部RAM中的存储区地址, STATUS 之类的寄存器只是数字3的别名(C语言中的定义)(寄存器的地址,寄存器是镜像在每家银行)
每个寄存器为8位宽
每个存储区的第一个地址(PIC16至20h)用于特殊功能寄存器
任何存储区中从20h到7fh(对于PIC16)的地址都用于通用寄存器或暂存RAM(这些概念与PIC架构相吻合)。
在同一版本中,70h到7fh的地址在各个银行都是镜像的。
PIC不支持指令级别的间接地址。
要读取内存中的任意内存位置,必须将其写入 FSR ,然后访问 INDF 将实际访问 FSR 中写入的地址。 />
由于PIC寄存器为8位,因此程序员可以访问80h等地址(正常指令无法实现)。
STATUS 中的 IRP 位处理:如果为0,则可以通过 INDF 访问0和1的存储区(存储区0从00h到7fh) ,如上面的银行1)如果是1银行2和3被访问。
因此BCF
指令清除 IRP 以选择银行0和1
接下来的两条指令只设置 FSR = 70h (没有MOVLF
指令)。
CLRF
使用间接访问来清除 FSR 提供的地址
INCF
递增 FSR 并将结果写回 FSR (另一种形式为INCF FSR, W
将增加 FSR 和将结果设置为 W )
如果设置了 FSR 的bit7(即 FSR > = 80h)下一条指令(BTFSS
),GOTO
用于中断循环被跳过,循环停止。
答案 1 :(得分:0)
BCF STATUS,IRP ; Clears the IRP bit of the STATUS register
MOWLW 70h ; Moves the hexadecimal value 70 into the "working register" (WREG)
MOVWF FSR ; Moves the value in WREG into the FSR register (this register is used as the address that INDF takes values from)
TOP CLR INDF ; Clears the register pointed to by the address in FSR
INCF FSR,F ; Adds one to the address in FSR (sets pointer to next address)
BTFSS FSR,7 ; Tests the highest bit of the 0x** value in the FSR register and skips the next instruction if it is 1
GOTO TOP ; Jumps to the code location with the label "TOP"
基本上,整段代码将所有RAM /内存从0x70设置为0x7F等于零,然后它运行汇编代码部分之后的任何代码。