《匠人手记》推荐网上购书渠道:
EDN网(ednchina)购书入口   >>>
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历

百宝专栏

  • 首页 相册 标签
  • 电脑应用(65)
  • 供需信息(22)
  • 写书近况(82)
  • 匠人文集(115)
  • 硬件技术(171)
  • 匠人公告(86)
  • 与非门专栏(545)
  • 匠人笔记(115)
  • 团队撰写(96)
  • 汽车电子(52)
  • 编程技巧(465)
  • 程序宝典(476)
  • 网络酷文(472)
  • 开发工具(19)
  • 资料宝藏(274)
  • 项目管理(11)
  • 藏经宝阁(42)
  • 趣味设计(5)
  • 社区热贴(2)
  • 比尔盖茨熊专栏(0) 
  • 百宝信息

    载入中...

    百宝流量

    (2006-07-01开始)



    匠人手记

    Freescale 汇编语言源程序标准(刘玉宏)
    程序匠人 发表于 2005-9-29 13:14:00  阅读全文 | 回复(4) | 引用通告 | 编辑

    Freescale 汇编语言源程序标准

    来源:liu1234.21ic.org  作者:刘玉宏
    ------------------------------------------------------
    此标准包括:
      行的长度限制
      可接受的字符和字符格式
      源程序列的分配
      注释格式
    -------------------------------------------------------
    行的长度:
       为了便于阅读和打印,Freescale使用mono-spaced字体,这种字体每个字符宽度相等.字体大小是9 point;最大行长为70个字符.
    示例如下:
    ;        1         2         3         4         5         6         7
    ;234567890123456789012345678901234567890123456789012345678901234567890
    asc2hex:    bsr   ishex       ;check for valid hex # first
                bne   dunA2asc    ;if not just return
                cmp   #'9'        ;check for A-F ($41-$46)
                bls   notA2F      ;skip if not A-F

    列表输出文件示例如下:
    ;        1         2         3         4         5         6         7         8         9
    ;23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
      551 C1D7 AD EA     asc2hex:    bsr   ishex       ;check for valid hex # first
      552 C1D9 26 0A                 bne   dunA2asc    ;if not just return
      553 C1DB A1 39                 cmp   #'9'        ;check for A-F ($41-$46)
      554 C1DD 23 02                 bls   notA2F      ;skip if not A-F
    从以上可以看出列宽最大到93字符,因为列表输出文件并不能给读者提供更多的有用信息,因此Freescale最大用到每行93字符.
    -----------------------------------------------------------
    避免使用TAB字符
        TAB字符在不同的字处理软件中有不同的含义,当把源文件提交给其它文档时可能会出现问题,所以要避免使用TAB,而用多个空格代替.
    -----------------------------------------------------------
    源程序列分配
       源程序由标号,助记符,操作数和注释组成一行;
       标号在第1列开始
       指令助记符在第13列开始
       操作数在19列开始
       注释在31列开始;如果操作数超过了30列,注释必须和操作数的最后一个字符分开1到2个空格.
       如果一个标号超过11个字符,就应该另起一行,并在31列做注释.短标号也可以另起一行来突出它,这经常用在一个子程序开始处.见图3
    ;        1         2         3         4         5         6         7
    ;234567890123456789012345678901234567890123456789012345678901234567890
    label:      mne   operand     ;comment
                brset very,long,operand   ;comment can’t start in col 31
    veryLongLabel:                ;long label on separate line
                nop               ;instruction with no operands
    short:                        ;short label may use a separate line
                mne operand       ;code to which ‘short’ refers

    -----------------------------------------------------------
    大写和小写字符
       源程序中协调一致的大小写可以增强可读性,并使程序变得容易理解.
       标号
       标号可以混和使用大小写,但无论在哪儿引用它都应该严格匹配其初始定义.
       指令助记符
       指令助记符,汇编指示和预处理应当使用小写字符.尽管他们可以使用大写字符,但是输入时要敲shift键,而且大写字符使读者变得不能专心阅读.
       各种各样得文档中指令使用大写字符仅仅是为了突出他们.有经验得程序员使用小写字符不但容易输入而且容易阅读.
    寄存器和位
    Freescale的头文件中使用大写字符定义寄存器和位.位的定义有两种方法位号(0-7)和位屏蔽码.位操作指令使用位号;逻辑操作指令使用屏蔽码方式.屏蔽码在位号前面加一个小写字母m前缀.示例见图4
    PTAD:       equ   $00         ;I/O port A data register
    ; bit numbers for use in BCLR, BSET, BRCLR, and BRSET
    PTAD7:      equ   7           ;bit #7
    PTAD6:      equ   6           ;bit #6
    PTAD5:      equ   5           ;bit #5
    PTAD4:      equ   4           ;bit #4
    PTAD3:      equ   3           ;bit #3
    PTAD2:      equ   2           ;bit #2
    PTAD1:      equ   1           ;bit #1
    PTAD0:      equ   0           ;bit #0
    ; bit position masks
    mPTAD7:     equ   %10000000   ;port A bit 7
    mPTAD6:     equ   %01000000   ;port A bit 6
    mPTAD5:     equ   %00100000   ;port A bit 5
    mPTAD4:     equ   %00010000   ;port A bit 4
    mPTAD3:     equ   %00001000   ;port A bit 3
    mPTAD2:     equ   %00000100   ;port A bit 2
    mPTAD1:     equ   %00000010   ;port A bit 1
    mPTAD0:     equ   %00000001   ;port A bit 0
    -----------------------------------------------------------
    标号
       标号可以混和使用大小写,但避免使用下划线,我们推荐使用大写字符做为多字符标号的分界.例如:VeryLongLabel代替ery_long_label
       标号定义并加一个冒号,尽管有很多编译器不需要这个冒号.

    文件和子程序头
        文件和子程序前面需要一个块来说明他的用途和目的,称为头
        图5是典型的文件头
    ;********************************************************************************************
    ;* Title: 9S08GB60_v1r2.equ                      (c) FREESCALE Inc. 2003 All rights reserved.
    ;********************************************************************************************
    ;* Author: Jim Sibigtroth - Freescale TSPG
    ;*
    ;* Description: Register and bit name definitions for 9S08GB60
    ;*
    ;* Documentation: 9S08GB60 family Data Sheet for register and bit explanations
    ;* HCS08 Family Reference Manual (HCS08RM1/D) appendix B for explanation of equate files
    ;*
    ;* Include Files: none
    ;*
    ;* Assembler: Metrowerks Code Warrior 3.0 (pre-release)
    ;*            or P&E Microcomputer Systems - CASMS08 (beta v4.02)
    ;*
    ;* Revision History:
    ;* Rev #  Date      Who     Comments
    ;* ----- ----------- ------ --------------------------------------------
    ;* 1.2   24-Apr-03   J-Sib  correct minor typos in comments
    ;* 1.1   21-Apr-03   J-Sib  comments and modify for CW 3.0 project
    ;* 1.0   15-Apr-03   J-Sib  Release version for 9S09GB60
    ;********************************************************************************************

        其中有些是必须的,有些可以省略
        文件名:必须,包括文件名和后缀
        版权声明:必须
        作者:必须,有些文件可能重复使用数年,有时需要帮助时可以联系他们
        描述:必须,但仅是摘要,更多信息应该在一个单独的文件中
        文档:另外一个文件,她是对这个文件的详细说明
        包含文件:需要时必须
        汇编器:汇编器的厂商和版本,非常重要
        版本历史:提供何时,何人,哪个文件被修改等信息

        图6是子程序头模板,可以根据子程序的复杂程度适当增减
    ;******************************************************************
    ;* RoutineName - expanded name or phrase describing purpose
    ;* Brief description, typically a few lines explaining the
    ;* purpose of the program.
    ;*
    ;* I/O: Explain what is expected and what is produced
    ;*
    ;* Calling Convention: How is the routine called?
    ;*
    ;* Stack Usage: (when needed) When a routine has several variables
    ;* on the stack, this section describes the structure of the
    ;* information.
    ;*
    ;* Information about routines that are called and any registers
    ;* that get destroyed. In general, if some registers are pushed at
    ;* the beginning and pulled at the end, it is not necessary to
    ;* describe this in the routine header.
    ;******************************************************************


    ;******************************************************************
    ;* GetSRec - retrieve one S-record via SCI1
    ;*  Terminal program should delay after <cr> to allow programming
    ;*  recommended delay after <cr> is TBDms, no delay after chars.
    ;*  Only header (S0), data (S1), and end (S9) records accepted
    ;*
    ;* Calling Convention:
    ;*             ais    #-bufferLength ;# of data bytes + 4 (typ.36)
    ;*             jsr    GetSRec       ;read S-record onto stack
    ;*             bne    error         ;Z=0 means record bad
    ;*;
    ;*; 'bufferLength' is defined in calling program not in this
    ;*; subroutine, calling routine must also deallocate buffer space
    ;*; after processing the information that was returned on the stack
    ;*;
    ;*             ais #bufferLength ;deallocate buffer space
    ;*
    ;* Returns: all but CCR Z-bit returned on stack (see stack map)
    ;*   CCR Z-bit = 1 if valid S-record; CCR Z-bit = 0 if not valid
    ;*   S-record type @ sp+1 (1 ASCII byte) ($30, $31, or $39)
    ;*   S-record size @ sp+2 (1 hex byte) (# of data bytes 0-31)
    ;*   S-record addr @ sp+3 (2 hex bytes) (addr of 1st data value)
    ;*   S-record data @ sp+5..sp+36 (up to 32 hex data bytes)
    ;*
    ;*  Stack map... S-record, return, and locals on stack
    ;*        |                 | <-sp (after local space allocated)
    ;*  H:X-> | SRecCount       |
    ;*        | SRecChkSum      | <-sp (after jsr)
    ;*        | ReturnAddr msb  |
    ;*        | ReturnAddr lsb  | <-sp (after rts)
    ;*        | SRecTyp         |
    ;*        | SRecSize        |
    ;*  H:X-> | SRecAddr msb    |
    ;*        | SRecAddr lsb    |
    ;*        | SRecData 00     |
    ;*        | SRecData 01     | etc... (up to 32 bytes)
    ;*
    ;*    Data values are read as two ASCII characters, converted to
    ;*    hex digits, combined into 1 hex value, and stored on stack
    ;*
    ;*  Calls: GetChar, PutChar, and GetHexByte
    ;*  Changes: A, H, and X
    ;******************************************************************
            图7是一个复杂的头,它使用堆栈传递参数并且附加的堆栈来分配局部变量.虽然可以描述很多的细节但我们规定头的描述最好限制在3到4行.如果要求更多的细节,可以使用一个的单独的文件,而不是描述在代码文件中.
        调用协议是想当复杂的,因为用户必须分配传递参数的堆栈空间,堆栈内的参数包括用户填充的和本子程序返回的.当这个子程序放回后,一条BNE指令用来检查Z标志来检查本子程序是否成功得到一个S记录.当检查到一个错误或可处理的返回数据,调用程序必须处理调用前分配的传递参数的堆栈空间.
        堆栈的用法也非常复杂,因为本子程序在堆栈上处理信息,所以给读者提供一个堆栈信息映像来帮助读者理解这个子程序是非常重要的.这个映像展示了一个最大的块,这个块是在调用子程序之前分配的.返回地址做为JSR指令的结果也存储在堆栈上.本子程序内部分配使用的2字节局部变量必须在返回调用程序之前处理完毕.
        在这个子程序的头的最后
        调用项:列出本子程序需要调用的子程序.
        改变项:列出执行本子程序改变的寄存器
    ;******************************************************************
    ;* GetChar - wait indefinitely for a character to be received
    ;*  through SCI1 (until RDRF becomes set) then read char into A
    ;*  and return. Reading character clears RDRF. No error checking.
    ;*
    ;* Calling convention:
    ;*         jsr GetChar
    ;*
    ;* Returns: received character in A
    ;******************************************************************
       图8展示一个简单的子程序头,这个头不包含堆栈信息,也不调用其它子程序,所以这些信息都不需要了.
    ----------------------------------------------------------------
    注释:
        注释是非常重要的,大多数注释格式是以分号并从31列开始直到行尾.避免注释重复说明指令内容.
        例如:lda pta          ;读A口数据.
        取而代之注释应传递这样一些信息:为什么指令在这儿,指令如何描述程序功能或系统包含的嵌入式微控制器.
        这是一个好的注释:
             lda PTAD            ;check for low on bit 7 (step switch)
        如果注释过长不能在一行完成,那么应该在第1列单独起一行,但不宜频繁使用以防淹没代码行.如果是多行注释可以写成注释块,注释块与代码行以空注释行相分隔如下所示:
    ;
    ; In-line comment block. On rare occasions, an extended comment
    ; is needed to explain some important aspect of a program. Each
    ; line of the extended comment starts with a semicolon. A line
    ; with nothing but a semicolon in column 1 is used above and
    ; below the block comment to set it apart from code.
    ;

    注释格式基础理论
        注释或空行可以使程序组成逻辑段以提高可读性.子程序头块可以标识一个子程序的开始.类似的分隔也是非常有用的.


    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:Freescale 汇编语言源程序标准(刘玉宏)
    ssssss(游客)发表评论于2007-4-28 10:22:00  个人主页 | 引用 | 返回 | 删除 | 回复

    ssssss(游客)

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:Freescale 汇编语言源程序标准(刘玉宏)
    dfdsfsd(游客)发表评论于2007-3-31 12:11:00  个人主页 | 引用 | 返回 | 删除 | 回复

    dfdsfsd(游客)站长你好,想与贵站做几个友情链接,

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    好我顶~~~
    AWBAFT(游客)发表评论于2007-3-12 0:46:00  个人主页 | 引用 | 返回 | 删除 | 回复

    AWBAFT(游客)

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:Freescale 汇编语言源程序标准
    liu(游客)发表评论于2007-2-13 21:33:00  个人主页 | 引用 | 返回 | 删除 | 回复

    liu(游客)这可是我翻译的,转贴请标注原作者的姓名

    以下为blog主人的回复:
    您好!请告知您的姓名,我们一定为您署名
    以下为blog主人的回复:
    您好!姓名已经添加。如有误请告知

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    发表评论:
    载入中...

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    广告5号位 [投放]


    学习板、开发板、编程器、下载器、仿真器(查看详情……)

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     
     

    新鲜货色

    匠人手记

    近期动态

    载入中...

      《匠人手记》购书全攻略 
     书友近况:淘书手记答疑与讨论:什么是散转程序 
     《匠人手记》新书艳照
     EDN《匠人手记》签名售书优惠活动开始报名啦!
     欢迎加入《匠人手记》EDN书友会
     欢迎加入《匠人手记》书友会Q群
     《匠人手记》终稿目录
     《匠人手记》封面,请大家先睹为快
     上周六收到了北航寄来的《匠人手记》清样,让大家先睹为快

    匠人原创

    粉丝评论

    往日酷贴

    载入中...

    载入中...



     网络酷文:博客,改变的不仅仅是图书 
     网络酷文:C语言宏定义技巧C语言 条件编译详解

      21IC上海2008-04聚会报名进行中。。。 
     两分钟让你明白什么是ERP![转]
      神奇的Duff's Device 算法
      实用一线通讯电路及软件设计方法
      程序员的“七年之痒”
      史上最短但最精彩的武侠小说
      网络无厘头文学《缺钙水浒》(爆笑)

     你的博客还能持续多久(转贴)
     电动车无刷电机控制器软件设计要点(作者:谢渊斌)

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!