打印

半夜**叫~~~反正我睡不成...听听课

[复制链接]
3760|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maychang|  楼主 | 2007-6-3 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  汇编语言源程序本来就比C语言源程序繁复,如果写得不规范,不要说别人,就是程序作者自己,过一段时间也看不懂,忘记当成是要作什么了。
  这里介绍一些汇编源程序的习惯,注意,不是规定,可以这样写,也可以
不这样写,但这样写别人看起来清楚明白一些。
  这里介绍的是仅含一个模块的完整程序,一般由一个人独力完成。一个程序
含多个模块情况不在此列。

以下是一个例子。
;****************************************
;    FRAME52        52单片机程序框架
;    Aug. 17 2000 开始
;    版本号    1.0
;****************************************
;        系统要求

;****************************************
;*******片内RAM地址分配******************
STACK    EQU    60H    ;60-7FH为堆栈区(32字节)

TM0CNT    EQU    30H    ;定时器0中断次数计数器
SECCNT    EQU    31H    ;秒计数器
MINCNT    EQU    32H    ;分计数器
HRCNT    EQU    33H    ;时计数器
DYCNT    EQU    34H    ;日计数器
;    EQU    35H    ;
SERLPNT    EQU    36H    ;串口缓冲区指针
;    EQU    37H    ;

SERLBF    EQU    38H    ;串口缓冲区,8字节
;;;;    EQU    39H    ;
;;;;    EQU    3AH    ;
;;;;    EQU    3BH    ;
;;;;    EQU    3CH    ;
;;;;    EQU    3DH    ;
;;;;    EQU    3EH    ;
;;;;    EQU    3FH    ;

KEY**    BIT    00H    ;小键盘处理完毕标志
SERL**    BIT    01H    ;串口接收完毕标志
;    BIT    02H    ;
;    BIT    03H    ;
;    BIT    04H    ;
;    BIT    05H    ;
;    BIT    06H    ;
;    BIT    07H    ;

;******外设地址分配**********************
FD    BIT    P1.0    ;喂狗
CS0    BIT    P1.1    ;
CS1    BIT    P1.2    ;
CS3    BIT    P1.3    ;

;***************************************
;******* 中断程序表 *********************
;INTR0        外中断0
;TMR0        定时器0中断
;INTR1        外中断1
;TMR1        定时器1中断
;SERL        串行口中断
;TMR2        定时器2中断
;******* 子程序表 ***********************
;ROUTINE1    调用子程序1说明
;ROUTINE2    调用子程序2说明
;ROUTINE3    调用子程序3说明
;ROUTINE4    调用子程序4说明
;****************************************
;****************************************
ORG    0000H            ;初始化入口
    AJMP    START

ORG    0003H            ;外中断0入口
    AJMP    INTR0

ORG    000BH            ;定时器0中断入口
    AJMP    TMR0

ORG    0013H            ;外中断1入口
    AJMP    INTR1

ORG    001BH            ;定时器1中断入口
    AJMP    TMR1

ORG    0023H            ;串行中断入口
    AJMP    SERL

ORG    002BH            ;定时器2中断入口
    AJMP    TMR2
;****************************************
;****************************************
;版本标志
ORG    00E0H
DB    'FRAME52 V1.0'
ORG    00F0H
DB    'Aug.21 2000'
;******* 初始化 *************************
ORG    0100H            ;主程序
START:
    MOV    SP,#STACK-1    ;初始化栈针
    MOV    TH1,#0F3H        ;定时器1赋初值(6MHz,波特率2400)
    MOV    TL1,#0F3H
    MOV    T2CON,#00110100B    ;定时器2作为波特率发生器,允许工
                ;作,工作于重装方式.不利用T2EX线
    MOV    RCAP2H,#0FFH    ;0FFD9H=65497,波特率4800(实际为
    MOV    RCAP2L,#0D9H    ;4807.7,误差0.16%)
    MOV    SCON,#01110000B    ;设置串口工作方式,8位UART,允许
                ;接收
    MOV    TMOD,#11011101B    ;定时器0/1为16位,外部计数,有门控
                ;
    MOV    TCON,#01010101B    ;开定时器0和1,外中断为沿触发.
    MOV    IP,  #00000100B    ;外中断1高优先级,其余低优先级.
    MOV    IE,  #10010001B    ;允许外部0中断及串口中断.开总中断

IDLE:
    MOV    TMOD,#11011101B    ;重复设置
    MOV    IP,  #00000100B
    MOV    IE,  #10000101B
    ORL    TCON,#01010101B
    ORL    SCON,#01110000B
    ANL    SCON,#01110011B
    SETB    FD        ;喂狗
    NOP
    NOP
    NOP
    NOP
    CLR    FD
    AJMP    IDLE
;****************************************
;****************************************
;中断例程
;****************************************
;****************************************
;外中断0中断例程简单注释
INTR0:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;定时器0中断例程简单注释
TMR0:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;外中断1中断例程简单注释
INTR1:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;定时器1中断例程简单注释
TMR1:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;串口中断例程简单注释
SERL:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;定时器2中断例程简单注释
TMR2:
    PUSH    ACC
    PUSH    PSW


    POP    PSW
    POP    ACC
    RETI
;****************************************
;****************************************
;调用例程
;****************************************
;****************************************
;调用1简单注释
ROUTINE1:

    RET
;****************************************
;调用2简单注释
ROUTINE2:

    RET
;****************************************
;调用3简单注释
ROUTINE3:

    RET
;****************************************
;调用4简单注释
ROUTINE4:

    RET
;****************************************
;表格简单注释
EVNTTAB:
    DB    00H,00H
    DB    00H,00H
    DB    00H,00H
    DB    00H,00H
;****************************************
;****************************************
END
;****************************************
;****************************************

*******************************************
1、即使是很简单的子程序,也要加上说明,至少说明该子程序的功能,入口和
出口,最好记录该子程序占用的资源。例如:

;本例程将8字节串口缓冲区内的非压缩BCD码转换成ASCII码,仍在该缓冲区内。
;占用ACC,R0。R0为缓冲区指针。

*******************************************
2、所有专用数据存储器(全局变量)均应单独命名,名称应该能够“望文生意”,就像DPTR是数据指针(Data Pointer)一样。
例如:

SECCNT    EQU    30H    ;秒计数器
SERL**    BIT    01H    ;串口接收完毕标志

万不可这样:

    MOV    A,30H
    ADD    A,42H
    MOV    57H,A

谁也记不住30H、42H、57H是什么。
*******************************************
3、标号顶行,指令缩进,这与C语言缩进的意义相同。例如:

START:
    MOV    SP,#STACK-1    ;初始化栈针
    MOV    TH1,#0F3H        ;定时器1赋初值(6MHz,波特率2400)
    MOV    TL1,#0F3H
    MOV    T2CON,#00110100B    ;定时器2作为波特率发生器,允许工                ;作,工作于重装方式.不利用T2EX线

比较一下,哪个看着清楚:
PUSH PSW
PUSH ACC
COMPARE:
MOV 20H,#00H
COMP1:MOV A,20H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CJNE A,30H,COMP2
INC 20H
MOV A,20H
MOVC A,@A+DPTR
CJNE A,31H,COMP3
LCALL MUSIC
AJMP COMP3
COMP2:INC 20H
COMP3:INC 20H
COMP4:MOV A,20H
CJNE A,#06H,COMP1
RETURN1:
POP ACC
POP PSW
*******************************************
4、少用或不使用空格键,多用制表键,例如上面标号START开始的MOV之前和MOV与SP之间均为制表键。
*******************************************
5、一个源文件开始总是一大堆说明,包括文件名称日期作者等等。然后是各变量定义,外设名称等等。最好将所有子程序列表并加以说明,就像一本书的目录总在正文之前,这样看起来清楚。
  习惯上,初始化之后就是主程序,然后是各中断子程序,再后是各调用子程序。子程序中调用其它子程序的,被调用程序应该紧接调用程序之后。被多处调用的子程序可以放到最后。表格一般放到程序最后。
  汇编源程序也应该模块化,切记不要随意跳转,最后跳得自己都不知道跳到哪里去了。

  天下**一大抄,程序也是一样。多看高手老手写的程序,仔细琢磨人家为什么这样写,日久天长,必有长进。
  程序匠人和Hotpower等高手在本坛有不少汇编源程序,多参考一下大有益处。

相关下载

相关帖子

沙发
conwh| | 2007-6-4 01:00 | 只看该作者

呵呵,累手了。半夜还来讲课

使用特权

评论回复
板凳
hq_y| | 2007-6-4 01:20 | 只看该作者

楼主辛苦了~~~~~~~~~~~

使用特权

评论回复
地板
hotpower| | 2007-6-4 04:56 | 只看该作者

半夜**叫~~~反正我睡不成...听听课

不过我现在编程序很舒服~~~

使用特权

评论回复
5
conwh| | 2007-6-4 05:00 | 只看该作者

我也刚睡完“日月神觉”,继续修炼

使用特权

评论回复
6
hotpower| | 2007-6-4 05:13 | 只看该作者

倒塌了~~~我2天多都没合眼~~~搞咖啡和烟维持~~~

继续修炼,不知明天能否成为人妖~~~

使用特权

评论回复
7
hotpower| | 2007-6-4 05:30 | 只看该作者

该灌水了~~~

只见桌上的5个空烟盒和那半盒救命的烟草~~~估计我的心和肺都黑透了~~~

使用特权

评论回复
8
fsaok| | 2007-6-4 07:30 | 只看该作者

.

hotpower 用的是什么软件?

使用特权

评论回复
9
conwh| | 2007-6-4 07:51 | 只看该作者

不好说,据说经常不做生活的,男性荷尔蒙要下降不少

当胡子掉光的时候,就表示“辟邪剑谱”修炼的差不多了,令狐冲也不是对手了。剩下的只好“孤独求败”了。

使用特权

评论回复
10
maychang|  楼主 | 2007-6-4 07:57 | 只看该作者

conwh hotpower 也别光灌水呀,欢迎拍砖

不拍砖,就砌两块。

使用特权

评论回复
11
hotpower| | 2007-6-4 08:01 | 只看该作者

是LabWindows/CVI,智能仪表编程软件~~~

是LV的C版本.

使用特权

评论回复
12
zhaoyu2005| | 2007-6-4 08:06 | 只看该作者

hotpower大侠,俺也想知道你用的什么软件

感觉很方便,文件管理很得劲儿

使用特权

评论回复
13
conwh| | 2007-6-4 08:14 | 只看该作者

谁扔的砖头,俺都捡着,专业砌墙。正好是我的专业了--瓦工

使用特权

评论回复
14
conwh| | 2007-6-4 08:19 | 只看该作者

亚非挖的程序,我大体赶了出来,请指点一下。

;************************报点时钟*************************
;要求:在2,3,15分的时候各报一次
;---------------------------------------------------------
;建立时间:6:23 2007-6-4
;修改时间:
;*********************************************************
MUSIC.OUT        EQU    !P1.0
;---------------------------------------------------------
TIMER*1*H        EQU    4BH
TIMER*1*L        EQU    0FDH        ;50mS
TIME*20*50        EQU    20        ;每20个溢出,产生1S
TIME*60*S        EQU    60        ;1分=60秒
;---------------------------------------------------------
MUSIC.FLAG        EQU    0        ;音乐响应标志
;---------------------------------------------------------
MUSIC_GUIDE        EQU    23H        ;音符指针
TIMER_50MS        EQU            ;50豪秒计数,倒计
TIMER_S            EQU            ;秒计数,倒计
TIMER_M            EQU            ;分钟为正计数
TIMER_MID_H        EQU            ;暂存
TIMER_MID_L        EQU            ;暂存
SP*VAL            EQU            ;堆栈位置
;=======================主程序==============================
MAIN-PROGRAM:
        MOV    SP,            #SP*VAL
        MOV    TMOD,            #11H
        MOV    TH1,            #TIMER*1*H
        MOV    TL1,            #TIMER*1*L
        SETB    EA
        SETB    ET0
        SETB    ET1
        SETB    TR1
        CLR    MUSIC.FLAG
        MOV    MUSIC_GUIDE,        #0
        MOV    TIMER_50M,        #TIME*20*50
        MOV    TIMER_S,        #TIME*60*S
MAIN-PROGRAM-LOOP:
        JNB    MUSIC.FLAG,        MAIN-PROGRAM-LOOP
;-----------------------------------------------------------------
;取表TABLEM,高4位-1为音乐起始地址,低4位为音乐延时的时间,当=0则关闭音乐
;           (实际这个可以直接在表中体现,但考虑同作者保持一直,所以没有改动)
;表TABLEF为音乐内容,将装载到TH0/TL0中
;-----------------------------------------------------------------
PLAY-MUSIC-HEAD:
        MOV    DPTR,            #TABLEM
        MOV    A,            MUSIC_GUIDE
        MOVC    A,            @A+DPTR
        MOV    B,            A
        ANL    A,            #0FH
        JNZ    PLAY-AGAIN
;-----------------------音乐播放结束----------------------------------
        MOV    MUSIC_GUIDE,        #0
        SETB    MUSIC.OUT
        CLR    MUSIC.FLAG
        CLR    TR0
        SJMP    MAIN-PROGRAM-LOOP
;-----------------------确定音乐拍节-----------------------------------
PLAY-AGAIN:
        MOV    R7,            A
        MOV    A,            B
        SWAP    A
        ANL    A,            #0FH
        JNZ    PLAY-SINGLE-SONG
;-----------------------音乐播放休止符---------------------------------
        CLR    TR0
        SETB    MUSIC.OUT
        LCALL    MUSIC-DELAY
        INC    MUSIC_GUIDE
        SJMP    PLAY-MUSIC-HEAD
;-----------------------提取音乐频率-----------------------------------
PLAY-SINGLE-SONG:
        MOV    DPTR,            #TABLEF
        DEC    A
        RL    A
        MOV    B,            A
        MOVC    A,            @A+DPTR
        MOV    TH0,            A
        MOV    TIMER_MID_H,        A
        MOV    A,            B
        INC    A
        MOVC    A,            @A+DPTR
        MOV    TL0,            A
        MOV    TIMER_MID_L,        A
        SETB    TR0
        LCALL    MUSIC-DELAY
        INC    MUSIC_GUIDE
        SJMP    PLAY-MUSIC-HEAD
;-----------------------音乐延时-----------------------------------------
MUSIC-DELAY:
        MOV    R1,            #100
MUSIC-DELAY-1:
        MOV     R2,            #30 
MUSIC-DELAY-2:
        MOV    R3,            #29
MUSIC-DELAY-3:
        DJNZ    R3,            MUSIC-DELAY-3 
        DJNZ    R2,            MUSIC-DELAY-2
        DJNZ    R1,            MUSIC-DELAY-1
        DJNZ    R7,            MUSIC-DELAY
        RET
;=======================时钟0,音乐输出====================================
TIMER-0-MUSIC-OUTPUT:
        MOV    TH0,            TIMER_MID_H
        MOV    TL0,            TIMER_MID_L
        CPL    MUSIC.OUT
        RETI
;=======================时钟1,计时中断====================================
TIMER-1-COUNT-TIME:
        MOV    TH1,            #TIMER*1*H
        MOV    TL1,            #TIMER*1*L
        PUSH    PSW
        PUSH    A
        DJNZ    TIMER_50MS,        TIMER-1-END
        MOV    TIMER_50MS,        #TIME*20*50
        DJNZ    TIMER_S,        TIMER-1-END
        MOV    TIMER_S,        #TIME*60*S
        MOV    A,            TIMER_M
        ADD    A,            #1
        DA    A
        MOV    TIMER_M,        A
;-----------------------判断输出条件---------------------------------------
        CJNE    A,            #2,        TIMER-1-NEXT-1
        SETB    MUSIC.FLAG
        SJMP    TIMER-1-END
TIMER-1-NEXT-1:
        CJNE    A,            #3,        TIMER-1-NEXT-2
        SETB    MUSIC.FLAG
        SJMP    TIMER-1-END
TIMER-1-NEXT-2:
        CJNE    A,            #15H,        TIMER-1-END
        SETB    MUSIC.FLAG
TIMER-1-END:
        POP    A
        POP    PSW
        RETI
;==================================================================
TABLEM:
DB 44H,54H,64H,44H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 44H,84H,48H
DB 44H,14H,48H
DB 00H
TABLEF:
DW 64260,64400,64524,64580,64684,64777,64820,64898
DW 64968,65030,65058,65110,65157,65178,65217

使用特权

评论回复
15
gyt| | 2007-6-4 10:04 | 只看该作者

好帖好帖

谢谢发表!!!

使用特权

评论回复
16
maychang|  楼主 | 2007-6-4 10:09 | 只看该作者

回楼上

宏的缺点是占用程序存储多,优点是执行快。单片机本来程序存储就有限,一般以kbyte计,而且通常单片机的工作不要求那么快,所以用子程序的多,用宏很少。

使用特权

评论回复
17
gyt| | 2007-6-4 10:37 | 只看该作者

宏占存储器,所以大家不太喜欢用

使用特权

评论回复
18
古道热肠| | 2007-6-4 10:47 | 只看该作者

哈哈,宏在C语言里很得宠!

  为什么呢?因为C语言天生慢性了,只有我宏才能帮它应应急,提高效率,不然会被用户拍砖的。

使用特权

评论回复
19
dengm| | 2007-6-4 11:29 | 只看该作者

不同意:4、少用或不使用空格键,多用制表键

请参考 MS VB, TAB 也要变为 SPACES, 才有利于文件交换

使用特权

评论回复
20
yewuyi| | 2007-6-4 15:40 | 只看该作者

同意LS

用制表符的话,调到别的编译器中可能出现乱乱的,不对齐的问题,打印出来的时候,很多时候也不对齐;


俺一概都是空格键……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

37703

帖子

840

粉丝