定义变量

[复制链接]
561|18
 楼主| ousj 发表于 2020-5-10 13:47 | 显示全部楼层 |阅读模式
<span style="background-color: rgb(255, 255, 255);">今天刚开始自学pic的汇编,点了个小灯,在延时里我想用三个变量,为什么不能像这样用</span>tm0 db 0;tm1 dw 0;tm2 dw 0;初始化三个变量,再MOVWF到这三个变量的地址。
zwll 发表于 2020-5-10 13:50 | 显示全部楼层
不妨贴个完整点的代码片段,
xxrs 发表于 2020-5-10 13:52 | 显示全部楼层
嗯,以及你用的汇编器版本
liuzaiy 发表于 2020-5-10 13:58 | 显示全部楼层
</span>tm0 db 0;tm1 dw 0;tm2 dw 0;这个语句汇编支持?
 楼主| ousj 发表于 2020-5-10 14:01 | 显示全部楼层
就是不支持,所以想问一下,汇编里局部变量全局变量是怎么定义的
 楼主| ousj 发表于 2020-5-10 14:04 | 显示全部楼层
#INCLUDE"p18F45K22.inc"
; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
;???
LED_OFF EQU   01H
LED_ON EQU    08H
;????
TMO   EQU   20H
TM1   EQU   22H
TM2   EQU   24H
;tm0  db    0
;tm1  dw    0
;tm2  dw    0

RES_VECT  CODE    0x0000            ; processor reset vector
    ORG 0x0000
    NOP
    BCF TRISC ,3,0  ;PORTC.RC3?????
    ;CLRF TRISE   ;PORTE?????
    CLRF PORTC  ;PORTC??

    MOVLW 6CH
    MOVWF OSCCON    ;?????0b00111100
    CLRF OSCTUNE
    BSF OSCCON2 ,2 ,1;?????????
    GOTO    START                   ; go to beginning of program
DELAY_1S  
        MOVLW 06H ;??????06H??W
        MOVWF TMO ;?????????

LOOP1   MOVLW 0EBH ;?????????W
        MOVWF TM1 ;?????????
         
LOOP2   MOVLW 0ECH ;?????????W
        MOVWF TM2 ;?????????
        
LOOP3   DECFSZ TM2
        GOTO LOOP3
        DECFSZ TM1
        GOTO LOOP2
        DECFSZ 20H
        GOTO LOOP1
        RETURN
;TODO ADD INTERRUPTS HERE IF USED

MAIN CODE                      ; let linker place main program

START
       ; LOOP ; BCF LATC ,3 ,0
LOOP
        MOVLW LED_ON
        MOVWF LATC
        CALL DELAY_1S
        MOVLW LED_OFF
        MOVWF LATC
        CALL DELAY_1S
        GOTO LOOP                        ; loop forever
        END
 楼主| ousj 发表于 2020-5-10 14:07 | 显示全部楼层
编译器是mplab自带的mpasm V5.59
zwll 发表于 2020-5-10 14:14 | 显示全部楼层
在不说明的情况下,db,dw用于定义在程序区的数据,例如一个字符串
string db ‘hello world’
这种情况下,要把db写在代码的区域里
dingy 发表于 2020-5-10 14:17 | 显示全部楼层
能举个例子吗
chenjunt 发表于 2020-5-10 14:20 | 显示全部楼层
MAIN CODE                      ; let linker place main program

string01 db "hello world"
START
       ; LOOP ; BCF LATC ,3 ,0
chenjunt 发表于 2020-5-10 14:23 | 显示全部楼层
如果想要在ram定义变量,要用idata或者是udata来说明,既可以加地址也可以不加
例如
udata   0x70
tm10 res 1
tm11 res 2
xxmmi 发表于 2020-5-10 14:27 | 显示全部楼层
又或者
idata
tm00  DB    2
tm01  dw    1
renyaq 发表于 2020-5-10 14:40 | 显示全部楼层
本来idata是指预先初始化的变量,但是用idata这种类型,并不会像C语言编译器自动帮你初始化这个部分,还需要加入一段初始化代码
xxrs 发表于 2020-5-10 14:46 | 显示全部楼层
在C:\Program Files (x86)\Microchip\MPASM Suite\Example 当中有给出两个例子,都非常古老了。个人是不太建议这么玩的。
llia 发表于 2020-5-10 14:46 | 显示全部楼层
从楼主的程序和提出的要求来看,可以换一种实现方法,即直接把   dis_Ds1302(); 放到中断函数中,并想办法让 flag_tz 触发该中断即可。
liuzaiy 发表于 2020-5-10 14:50 | 显示全部楼层
不如用udata占位置
xxmmi 发表于 2020-5-10 14:52 | 显示全部楼层
自己在开始的时候初始化
hanwe 发表于 2020-5-10 14:56 | 显示全部楼层
话说都快要2201年了,怎么不用C呢,xc编译器免费的版本也能用到o1级别的优化啊。
 楼主| ousj 发表于 2020-5-10 14:59 | 显示全部楼层

明白了,多谢大家讨论这么多哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

712

主题

7557

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部