使用间接地址清除内存位置

时间:2016-11-06 20:08:44

标签: assembly pic

您好,我是照片中装配编码的新手。有一个我无法看到的代码:

 BCF   STATUS,IRP
 MOWLW 70h
 MOVWF FSR
 TOP  CLR   INDF
 INCF  FSR,F
 BTFSS FSR,7
 GOTO  TOP

好的,这是我的问题:首先,这个INDF如何在FSR上运作? INCF FSR,F这个增量指令如何在F寄存器上起作用?谢谢

2 个答案:

答案 0 :(得分:2)

Microchip的

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等于零,然后它运行汇编代码部分之后的任何代码。