1

我正在编写一个子程序来计算 wreg 中设置的位数,但是在到达子程序末尾的 return 语句时,它只是无休止地重复 return 语句。我是 PIC 和组装的新手,所以我确信我刚刚做了一些愚蠢的事情,但我还没有能够解决它。任何帮助将不胜感激。

这是我的代码:

COUNT       equ 0x00

NUMBER      equ 0x01

BITS        equ 0x02

;bitcounter subprogram counts the number of set bits in a byte

BITCOUNTER:

Loop1   rlcf NUMBER,f   ;rotates one bit of number into carry flag, store rotated number

    btfsc STATUS, C     ;skips next line if carry is clear

    incf COUNT, f   ;add one to count, store in count

    bcf STATUS, C   ;clear carry flag

    decfsz BITS

    goto Loop1

    movf COUNT, 0   ; put bit count into W register
return 

START

        movlw   0x0008

        movwf   BITS

        movlw   0xF2

        movwf NUMBER    ;stores input as "number"

        call BITCOUNTER

    end
4

2 回答 2

2

我是 PIC 编程的新手,到目前为止还没有将任何代码上传到 PIC(仍在等待程序员交付),但我认为最后的“goto start”解决了这个问题,因为 PIC 需要做一些事情。“goto start”指令将 PIC 置于一个循环中,因此它不必尝试“停止”。在没有它的情况下,我认为 PIC 正试图通过简单地无限期地重复最后一条指令来处理“无法停止”。

如果是这样,您也可以添加类似的内容(假设我已经正确设置):

loop2 nop
      goto loop2

在您的代码末尾。PIC 将继续运行无操作,直到您将其重置(或者您可以根据需要设置中断、WDT 或其他一些功能)。

于 2013-01-03T07:40:20.553 回答
1

试试这个...

include "p18f452.inc"  ;from dir X:\Program Files (x86)\Microchip\MPASM Suite

COUNT       equ 0x00
NUMBER      equ 0x01
BITS        equ 0x02

;bitcounter subprogram counts the number of set bits in a byte
            org 0

START
            movlw   0x0008
            movwf   BITS
            movlw   0xF2
            movwf   NUMBER    ;stores input as "number"
            call    BITCOUNTER
            goto    START

BITCOUNTER:
Loop1       rlcf   NUMBER,f   ;rotates one bit of number into carry flag, store rotated number
            btfsc  STATUS, C     ;skips next line if carry is clear
            incf   COUNT, f   ;add one to count, store in count
            bcf    STATUS, C   ;clear carry flag
            decfsz BITS
            goto   Loop1
            movf   COUNT, 0   ; put bit count into W register
            return

            end

请记住,没有 MCPU 配置设置,如振荡器、看门狗……只是测试代码!

于 2012-04-21T12:37:41.127 回答