Assembly 用间接寻址清除内存位置

Assembly 用间接寻址清除内存位置,assembly,pic,Assembly,Pic,嗨,我是pics汇编编码的新手。有一个代码我看不到: BCF STATUS,IRP MOWLW 70h MOVWF FSR TOP CLR INDF INCF FSR,F BTFSS FSR,7 GOTO TOP 好的,这是我的问题:首先,这个INDF如何在FSR上工作?INCF FSR,F该递增指令如何在F寄存器上工作?感谢Microchip将帮助您理解说明 BCF STATUS,IRP ;Bit Clear register File ;C

嗨,我是pics汇编编码的新手。有一个代码我看不到:

 BCF   STATUS,IRP
 MOWLW 70h
 MOVWF FSR
 TOP  CLR   INDF
 INCF  FSR,F
 BTFSS FSR,7
 GOTO  TOP
好的,这是我的问题:首先,这个INDF如何在FSR上工作?INCF FSR,F该递增指令如何在F寄存器上工作?感谢Microchip将帮助您理解说明

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中存储库中的地址,类似寄存器的状态只是数字3(寄存器地址,寄存器在每个存储库上镜像)的别名(用C术语定义)。
每个寄存器的宽度为8位。
每个组的第一个地址(在PIC16上,最长为20h)用于特殊功能寄存器。
任何银行中从20h到7fh(对于PIC16)的地址都用于通用寄存器或暂存RAM(这些概念与PIC架构一致)。
在同一版本中,从70h到7fh的地址在银行间镜像

PIC不支持指令级的间接地址。 要读取任意内存位置的内存,必须将其写入FSR,然后访问INDF将实际访问写入FSR的地址。
由于PIC寄存器是8位的,这将允许程序员访问像80h这样的地址(这在普通指令中是不可能的)。
状态中的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)。
BTFSS
用于中断循环,如果设置了FSR的第7位(即FSR>=80h),则跳过下一条指令(
GOTO
),循环停止。

微芯片将帮助您理解指令

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
    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"
PIC只有一个“内部”寄存器,称为W.
PIC还有一个内部RAM(作为SRAM实现)。
内部RAM分为最多四个组,必须由程序员手动选择。
每个存储组为128字节

寄存器实际上是内部RAM中存储库中的地址,类似寄存器的状态只是数字3(寄存器地址,寄存器在每个存储库上镜像)的别名(用C术语定义)。
每个寄存器的宽度为8位。
每个组的第一个地址(在PIC16上,最长为20h)用于特殊功能寄存器。
任何银行中从20h到7fh(对于PIC16)的地址都用于通用寄存器或暂存RAM(这些概念与PIC架构一致)。
在同一版本中,从70h到7fh的地址在银行间镜像

PIC不支持指令级的间接地址。 要读取任意内存位置的内存,必须将其写入FSR,然后访问INDF将实际访问写入FSR的地址。
由于PIC寄存器是8位的,这将允许程序员访问像80h这样的地址(这在普通指令中是不可能的)。
状态中的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)。
BTFSS
用于中断循环,如果设置了FSR的第7位(即FSR>=80h),则跳过下一条指令(
GOTO
),循环停止

    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"
基本上,这段代码将0x70到0x7F之间的所有RAM/内存设置为等于零,然后运行汇编代码段后面的任何代码


基本上,这段代码将0x70到0x7F之间的所有RAM/内存设置为零,然后它运行汇编代码段后面的任何代码。

INCF FSR,F
指令应将FSR增加1,以指向下一个内存地址。好的,让我问一下FSR旁边的F是什么?我的意思是什么是F,什么是符号化的?感谢您的回答,btwF或W是教学结果的平均目的地。因此,返回内存(SFR)或工作寄存器WREG
INCF FSR,F
应该增加1的FSR内存内容,而
INCF FSR,W
应该将FSR内容复制到WREG,并增加1的FSR
INCF FSR,F
指令应该增加1的FSR,以指向下一个内存地址。好的,让我问一下FSR旁边的F呢?我的意思是什么是F,什么是符号化的?感谢您的回答,btwF或W是教学结果的平均目的地。因此,返回内存(SFR)或工作寄存器WREG
INCF FSR,F
应将FSR内存内容增加1,而
INCF FSR,W
应将FSR内容复制到WREG并增加1